$> make CXXFLAGS='-O3 -march=native'test$> ./test # j'ai fait la médiane sur 100 runs
486micro sec
Ce qu'on peut lire comme : pas mal, mais g++-4.7 ne vectorise pas la boucle mesurée (j'ai vérifié)et nous on utilise des infos de haut niveau pour le faire, donc… on lui colle la vectorisation dans les dents.
Tu veux dire que les trois liens Wikipedia n'aident pas ?
Si je te dis que numpy crée un tableau temporaire par opération, tu imagines le surcoût en:
allocation mémoire / parcours de tableau (prix des accès mémoires)
coût de contrôle (prix de l'itération)
en plus la vectorisation (i.e. faire 4 sommes en une opération vectorielle) n'aide pas car on se paie 1 chargement mémoire, 1 opération, 1 déchargement mémoire.
Pythran fusionne les boucles, ce qui augmente l'intensité de calcul (on charge une fois les opérandes, on calcule beaucoup dessus, on décharge le résultat) et permet d'avoir un gros bénéfice lié à la vectorisation.
La parallélisation de la boucle englobante vient ajouter au tout.
Pas de comparaison tu dis ? Et la comparaison avec numexpr, hein ? Pour comparer au C++, forcément si le dev connait et applique les techniques sus-citées, il ira au moins aussi vite. Mais ça lui prendra pas trois lignes de code… Par contre une comparaison à numpypy et numba s'impose en effet :-)
Owi, continue à envoyer des fleurs comme ça, l'ego aime :-)
Pour le peu que j'ai vu de copperhead, tu dois te plier à la sémantique du GPU. Trop brainfuck pour moi et pour la plupart de gens.
Je suis d'accord.
L'idéal serait évidemment que cet outil de conversion soit prouvé en Coq ou quelques chose de ce genre.
Je n'ai qu'une vie, qui est déjà bien remplie :-)
Wooo, un lecteur de ma thèse. Si on m'avait dis que cela arriverait un jour :-)
Niveau optimisations, ce sera d'abord les instructions vectorielles qui vont y passer, et la fusion d'opérateur. Quand on regarde du code numpy, c'est trop tentant !
Et puis l'analyse de préconditions aussi…
Les GPUs c'est pas pour tout de suite non. regarde du côté de copperhead si tu es pressé.
J'essaie de faire attention à la conception du compilo aussi, pour rendre l'injection de passes facile :-)
Je suis bien d'accord avec toi, il y a pleins de possibilités d'optimisations :-) Et après tes transfos, pas mal d'opportunités de vectorisation apparaissent. On s'éloigne cependant pas mal du prototype original, non ?
Le gars qui fait de la géomatique, il a pas le temps de faire le (bon) travail d'optimisation que tu as fait. Pas sûr qu'il en soit capable d'ailleurs.
Dis autrement, je préfère être celui qui maintient la version Python que la version C, et celui qui maintient la version C que la version C optimisée.
Le challenge est d'écrire l'algo le plus proche de sa description, et de voir ce qu'un compilo peut en tirer. D'ailleurs rien ne m'empêche (au moins pour la mémoization des appels à cos/sin) d'écrire la même variante en Python.
Ce qui confirme qu'un code évolue (comme les Pokemons !)
1. Python
2. C
3. C optimisé
4. vectorisation, parallélisation, et pourquoi pas GPUs et autres
Avec un SLOC qui augmente à chaque étape d'ailleurs.
Ton code montre que gcc a du mal à faire 1 -> 2 (ou 3 d'ailleurs)
J'essaie quant à moi de faire 0 -> 2.
Comme dis plus haut, pas de classes utilisateur pour le moment…
L'objectif numéro 1 c'est d'avoir les perfs du C pour des applis scientifiques, donc on a pas forcément besoin de classes utilisateur. Après, tu peux compiler la partie calcul intensif en pythran et garder le reste en Python, c'est là l'intérêt : seule la partie gourmande en calcul a besoin d'être traduite.
Boarf C ou C++, c'est pas le problème, dans les deux cas ça se traduit en code natif. C'est assez transparent pour l'utilisateur lambda.
En ce qui concerne Cython, Je suis assez de l'avis de l'auteur de Nuitka qui dit que cython ça casse la compatibilité avec le code d'origine et c'est pô bien. Pythran n'a pas ce problème.
Bon par contre cython supporte beaucoup plus de modules que nous hein, pythran c'est pas du dix ans d'âge non plus, plutôt moins d'un an sur les week end.
Salut,
ton code m'intéresse. On est en travailler sur le support NumPy (c'est pour ça que c'est dans une branche…), et ton appli peut nous servir de base. Si tu peux le mettre en ligne quelque part, ou le poster sur la mliste pythran, ce serait chouette (voire ce serait hibou).
que ce serait trop beau pour être vrai
Tu as partiellement raison. On supporte quelques modules standards (math, random…) mais pas mal de fonctionnalités du langage (list comprehension, générateurs, …). La plus grosse limitation c'est sûrement l'absence de support pour les classes utilisateurs. là encore si tu rends ton code dispo, on peut ajouter le support pour les fonctionnalités qui manquent.
Je suis surpris que tu compares les performances entre un code en python avec OpenMP vs un code en C sans OpenMP.
Mais non, la vie n'est pas remplie de personnes malhonnêtes. Pour prendre en compte les directives OpenMP dans pythran, il faut spécifier -fopenmp, tout comme gcc. Pour l'exemple du dessus, elles sont bêtement ignorées…
Pour ton problème de compil, ça semble lié à un problème de support du C++11. Quelle est la version de ton compilo ?
Ici:
Debian clang version 3.1-8
gcc (Debian 4.7.2-5) 4.7.2
En tout cas merci de pousser si loin la comparaison :-)
La suite au prochain épisode (si tu passes sur FreeNode #pythran, je me ferai un plaisir de discuter :-))
Et tu es bien content que d'autres réfléchissent à ta place sur une façon d'exécuter de manière décente ta ligne. Normal. Si tu veux la perf de la perf, faut aller la chercher et se retrousser les manches, sinon, tu es content que d'autres capitalisent leur savoir faire dans un outil.
C'est vrai que je ne me suis pas fendu d'un long commentaire sur les raisons de ces résultats… disons que cela alimente le débat… choquer pour provoquer la discussion :-)
Les tableaux utilisés dans le code Python sont des tableaux NumPy, et pas des listes de listes. Ces tableaux ne sont ni plus ni moins que des tableaux natifs encapsulés. Les accès se font en row major en C et en Python et le code donné en tient bien sûr compte.
Autrement dit : très peu de défauts de cache dans cet exemple, que ce soit pour le code C (cf. http://ridee.enstb.org/sguelton/hyantes_bench.tgz) ou le code Python, ou le code C++ généré d'ailleurs.
# Python2 / Python3
Posté par serge_sans_paille (site web personnel) . En réponse à la dépêche Cairo-Dock en version 3.2 : les nouveautés. Évalué à 2.
Je suis curieux : quelle différence entre l'interface Python2 et l'interface Python3 ? Un changement de l'API C ?
[^] # Re: Toujours intéressant
Posté par serge_sans_paille (site web personnel) . En réponse au journal avec Pythran, Numpy file comme le vent. Évalué à 1.
J'ai oublié de rendre à césar, alors que c'est important : pour la vectorisation générique, je me base sur boost.simd qui est inclue dans nt2
[^] # Re: Toujours intéressant
Posté par serge_sans_paille (site web personnel) . En réponse au journal avec Pythran, Numpy file comme le vent. Évalué à 3.
Même si je doute de la pertinence de la comparaison, j'ai demandé à un étudiant de coder l'algo décrit ci-dessue n C++ avec de l'OpenMP. Ça donne ça :
ce qui me parait raisonnable.
Ce qu'on peut lire comme : pas mal, mais g++-4.7 ne vectorise pas la boucle mesurée (j'ai vérifié)et nous on utilise des infos de haut niveau pour le faire, donc… on lui colle la vectorisation dans les dents.
[^] # Re: PyTables
Posté par serge_sans_paille (site web personnel) . En réponse au journal avec Pythran, Numpy file comme le vent. Évalué à 1.
connaissais pas :-) Je vais regarder avec intérêt, merci!
[^] # Re: Toujours intéressant
Posté par serge_sans_paille (site web personnel) . En réponse au journal avec Pythran, Numpy file comme le vent. Évalué à 1.
Merci! Hésite pas à passer sur freenode #pythran pour nous donner des bouts de code, on en cherche !
[^] # Re: Impressionnant
Posté par serge_sans_paille (site web personnel) . En réponse au journal avec Pythran, Numpy file comme le vent. Évalué à 3.
Il manque pas mal d'intrinsèques de base, et la manipulation de sous tableaux… donc pas mal d'efforts encore :-)
[^] # Re: Toujours intéressant
Posté par serge_sans_paille (site web personnel) . En réponse au journal avec Pythran, Numpy file comme le vent. Évalué à 6.
Tu veux dire que les trois liens Wikipedia n'aident pas ?
Si je te dis que numpy crée un tableau temporaire par opération, tu imagines le surcoût en:
en plus la vectorisation (i.e. faire 4 sommes en une opération vectorielle) n'aide pas car on se paie 1 chargement mémoire, 1 opération, 1 déchargement mémoire.
Pythran fusionne les boucles, ce qui augmente l'intensité de calcul (on charge une fois les opérandes, on calcule beaucoup dessus, on décharge le résultat) et permet d'avoir un gros bénéfice lié à la vectorisation.
La parallélisation de la boucle englobante vient ajouter au tout.
Pas de comparaison tu dis ? Et la comparaison avec numexpr, hein ? Pour comparer au C++, forcément si le dev connait et applique les techniques sus-citées, il ira au moins aussi vite. Mais ça lui prendra pas trois lignes de code… Par contre une comparaison à numpypy et numba s'impose en effet :-)
voili voilou, j'espère avoir mieux argumenté là !
[^] # Re: Liaison dynamique
Posté par serge_sans_paille (site web personnel) . En réponse au journal Pythran 0.2 : Python peut-il être aussi rapide que du C ?. Évalué à 1.
Owi, continue à envoyer des fleurs comme ça, l'ego aime :-)
Je suis d'accord.
[^] # Re: Et par rapport a du pur Python ?
Posté par serge_sans_paille (site web personnel) . En réponse au journal Pythran 0.2 : Python peut-il être aussi rapide que du C ?. Évalué à 1.
Si tu as des p'tits bouts de code qui trainent, hésitent pas à les partager, ça peut guider les devs :-)
[^] # Re: Liaison dynamique
Posté par serge_sans_paille (site web personnel) . En réponse au journal Pythran 0.2 : Python peut-il être aussi rapide que du C ?. Évalué à 3.
Wooo, un lecteur de ma thèse. Si on m'avait dis que cela arriverait un jour :-)
Niveau optimisations, ce sera d'abord les instructions vectorielles qui vont y passer, et la fusion d'opérateur. Quand on regarde du code numpy, c'est trop tentant !
Et puis l'analyse de préconditions aussi…
Les GPUs c'est pas pour tout de suite non. regarde du côté de copperhead si tu es pressé.
J'essaie de faire attention à la conception du compilo aussi, pour rendre l'injection de passes facile :-)
[^] # Re: Et par rapport a du pur Python ?
Posté par serge_sans_paille (site web personnel) . En réponse au journal Pythran 0.2 : Python peut-il être aussi rapide que du C ?. Évalué à 2.
Yes, ça c'est du code comme on aime.
Dès que pythran supporte les deux-trois fonctions numpy qui manquent, je te réponds :-)
Mais c'est clairement la marche à suivre !
(comme je manque un peu de temps actuellement, ça risque de pas être implémenté tout de suite. Un moyen de te tenir au courant ?)
[^] # Re: Je reste plus que dubitatif
Posté par serge_sans_paille (site web personnel) . En réponse au journal Pythran 0.2 : Python peut-il être aussi rapide que du C ?. Évalué à 1.
Très joli.
Je suis bien d'accord avec toi, il y a pleins de possibilités d'optimisations :-) Et après tes transfos, pas mal d'opportunités de vectorisation apparaissent. On s'éloigne cependant pas mal du prototype original, non ?
Le gars qui fait de la géomatique, il a pas le temps de faire le (bon) travail d'optimisation que tu as fait. Pas sûr qu'il en soit capable d'ailleurs.
Dis autrement, je préfère être celui qui maintient la version Python que la version C, et celui qui maintient la version C que la version C optimisée.
Le challenge est d'écrire l'algo le plus proche de sa description, et de voir ce qu'un compilo peut en tirer. D'ailleurs rien ne m'empêche (au moins pour la mémoization des appels à cos/sin) d'écrire la même variante en Python.
Ce qui confirme qu'un code évolue (comme les Pokemons !)
1. Python
2. C
3. C optimisé
4. vectorisation, parallélisation, et pourquoi pas GPUs et autres
Avec un SLOC qui augmente à chaque étape d'ailleurs.
Ton code montre que gcc a du mal à faire 1 -> 2 (ou 3 d'ailleurs)
J'essaie quant à moi de faire 0 -> 2.
[^] # Re: Ça m'intéresse
Posté par serge_sans_paille (site web personnel) . En réponse au journal Pythran 0.2 : Python peut-il être aussi rapide que du C ?. Évalué à 1.
Owi un rapport de bug :-)
Bon on supporte pas scipy pour le moment… mais les fonctions que tu cites ont l'air abordables.
[^] # Re: Liaison dynamique
Posté par serge_sans_paille (site web personnel) . En réponse au journal Pythran 0.2 : Python peut-il être aussi rapide que du C ?. Évalué à 2.
Comme dis plus haut, pas de classes utilisateur pour le moment…
L'objectif numéro 1 c'est d'avoir les perfs du C pour des applis scientifiques, donc on a pas forcément besoin de classes utilisateur. Après, tu peux compiler la partie calcul intensif en pythran et garder le reste en Python, c'est là l'intérêt : seule la partie gourmande en calcul a besoin d'être traduite.
[^] # Re: Ça m'intéresse
Posté par serge_sans_paille (site web personnel) . En réponse au journal Pythran 0.2 : Python peut-il être aussi rapide que du C ?. Évalué à 2.
Boarf C ou C++, c'est pas le problème, dans les deux cas ça se traduit en code natif. C'est assez transparent pour l'utilisateur lambda.
En ce qui concerne Cython, Je suis assez de l'avis de l'auteur de Nuitka qui dit que cython ça casse la compatibilité avec le code d'origine et c'est pô bien. Pythran n'a pas ce problème.
Bon par contre cython supporte beaucoup plus de modules que nous hein, pythran c'est pas du dix ans d'âge non plus, plutôt moins d'un an sur les week end.
[^] # Re: Ça m'intéresse
Posté par serge_sans_paille (site web personnel) . En réponse au journal Pythran 0.2 : Python peut-il être aussi rapide que du C ?. Évalué à 2.
Salut,
ton code m'intéresse. On est en travailler sur le support NumPy (c'est pour ça que c'est dans une branche…), et ton appli peut nous servir de base. Si tu peux le mettre en ligne quelque part, ou le poster sur la mliste pythran, ce serait chouette (voire ce serait hibou).
Tu as partiellement raison. On supporte quelques modules standards (
math,random…) mais pas mal de fonctionnalités du langage (list comprehension, générateurs, …). La plus grosse limitation c'est sûrement l'absence de support pour les classes utilisateurs. là encore si tu rends ton code dispo, on peut ajouter le support pour les fonctionnalités qui manquent.[^] # Re: show me the code
Posté par serge_sans_paille (site web personnel) . En réponse au journal Pythran 0.2 : Python peut-il être aussi rapide que du C ?. Évalué à 6.
Mais non, la vie n'est pas remplie de personnes malhonnêtes. Pour prendre en compte les directives OpenMP dans pythran, il faut spécifier
-fopenmp, tout comme gcc. Pour l'exemple du dessus, elles sont bêtement ignorées…Pour ton problème de compil, ça semble lié à un problème de support du C++11. Quelle est la version de ton compilo ?
Ici:
Debian clang version 3.1-8
gcc (Debian 4.7.2-5) 4.7.2
En tout cas merci de pousser si loin la comparaison :-)
La suite au prochain épisode (si tu passes sur FreeNode #pythran, je me ferai un plaisir de discuter :-))
[^] # Re: World is full of nonsense.
Posté par serge_sans_paille (site web personnel) . En réponse au journal Pythran 0.2 : Python peut-il être aussi rapide que du C ?. Évalué à 7.
Et quel plaisir de participer au foutoir ambiant :-)
[^] # Re: UUUUUrgh !!!!!!
Posté par serge_sans_paille (site web personnel) . En réponse au journal Pythran 0.2 : Python peut-il être aussi rapide que du C ?. Évalué à 10.
Et tu es bien content que d'autres réfléchissent à ta place sur une façon d'exécuter de manière décente ta ligne. Normal. Si tu veux la perf de la perf, faut aller la chercher et se retrousser les manches, sinon, tu es content que d'autres capitalisent leur savoir faire dans un outil.
[^] # Re: Je reste plus que dubitatif
Posté par serge_sans_paille (site web personnel) . En réponse au journal Pythran 0.2 : Python peut-il être aussi rapide que du C ?. Évalué à 5.
C'est vrai que je ne me suis pas fendu d'un long commentaire sur les raisons de ces résultats… disons que cela alimente le débat… choquer pour provoquer la discussion :-)
Les tableaux utilisés dans le code Python sont des tableaux NumPy, et pas des listes de listes. Ces tableaux ne sont ni plus ni moins que des tableaux natifs encapsulés. Les accès se font en row major en C et en Python et le code donné en tient bien sûr compte.
Autrement dit : très peu de défauts de cache dans cet exemple, que ce soit pour le code C (cf. http://ridee.enstb.org/sguelton/hyantes_bench.tgz) ou le code Python, ou le code C++ généré d'ailleurs.
Pour en savoir plus: The NumPy array: a structure for efficient numerical computation
[^] # Re: Je ne comprend pas trop...
Posté par serge_sans_paille (site web personnel) . En réponse au journal Pythran 0.2 : Python peut-il être aussi rapide que du C ?. Évalué à 3.
Oui c'est ça ! Si le code est implicitement non polymorphe, on s'en sort pas trop mal. Sinon on crache une erreur c++ de 50 lignes de long :-)
[^] # Re: show me the code
Posté par serge_sans_paille (site web personnel) . En réponse au journal Pythran 0.2 : Python peut-il être aussi rapide que du C ?. Évalué à 6.
Homme de peu de foi !
Test efectué à l'instant avec la branche compas2013 du dépot sus-cité
Sur l'archive http://ridee.enstb.org/sguelton/hyantes_bench.tgz
En supposant pythran installé quelque par
Le tout sur un Core I7.
à vot' service Saint Thomas !
# En python
Posté par serge_sans_paille (site web personnel) . En réponse au message Générer des fichiers texte selon un modèle. Évalué à 1.
En utilisant le moteur de template fourni par le module string :
[^] # Re: Include à l'envers :-)
Posté par serge_sans_paille (site web personnel) . En réponse au message Problème de templates: undefined reference. Évalué à 1.
find /usr/include/c++/4.7(et une paire d'yeux aguerris) nous informe que gcc stocke ça sous forme de.tcc.[^] # Re: Plus de classes
Posté par serge_sans_paille (site web personnel) . En réponse au journal Pythran : C++ pour les serpents. Évalué à 1.
Je dirais question de compilo / archi. Je n'observe pas ce phénomène sur ma machine (amd64/debian sid)