L'histoire dont est tiré ce journal est relatée dans https://reviews.llvm.org/D104745. J'ai voulu isoler le problème pour que le journal soit plus accessible, mais tu devrais y trouver de quoi satisfaire ta légitime curiosité !
C'est un chouette projet ! J'ai parcouru des bouts et j'aime bien l'approche avant/après pour motiver le passage à C++11.
Je remarque que tu as extrait certains code source dans des fichiers séparés, ça pourrait être bien d'essayer de les compiler pour garantir qu'ils sont « propres ». Par exemple je vois plusieurs fonctions main renvoyant int mais sans return. Ça ne change rien au discours de fond, mais fournir des exemples sans warning ajoute un côté classou à l'ensemble à mon avis.
Chouette biblio ! Peu de temps après avoir posté ce journal, on m'a également pointé https://github.com/jfalcou/raberu qui est en C++20 mais reprend des idées des différentes approches que tu cites :-)
On notera que l'article de Jonathan Boccara que tu mentionnes répond à certaines des question de ce fil ;-)
mais en l'état on n'a plus les noms ni les types des paramètres dans la signature de l'appelé.
C'est vrai. Mais on l'a dans le corps de la fonction, surtout si on se passe de auto
int&val=args.get("some_integer_ref"_kw);
l'appelé est forcément template.
Voui :-) ensuite on peut imaginer que cet appelé face un appel à une fonction non-template une fois les arguments traités.
Comment passer des paramètres par adresse ? Combien de copies des paramètres sont faites entre l'appelant et l'appelé ? Sur cet exemple j'ai déjà une copie superflue
Merci pour ce cas test, ce bug est corrigé (et tu es crédité dans le commit !), plus de copie maintenant. Pour le passage par référence, c'est les règles de déductions des universal références classiques.
D'un point de vue outil, le support OpenMP implique :
du travail au niveau du front-end (parser les directives OpenMP, et les traduire en appels au runtime OpenMP)
du travail au niveau runtime (implémenter à la fois les symboles standardisés de la bililiothèque, et ceux générés par le front-end)
(optionnel, je suppose, mais c'est fait comme ça dans LLVM) modéliser la sémantique des symboles de la libomp, pour pouvoir optimiser certaines séquences
Merci de nous partager ces détails d’implémentation, je trouve ça toujours fascinant.
Merci ! Je ne comprends pas la moitié des notions théoriques que je manipule, mais au moins j'essaie
il y a un présupposé que a est un entier
Oui, c'est un vrai problème qui doit cacher quelques bugs dans Pythran. Mais c'est ma technique secrète pour faire vivre le projet : introduire des bugs pour que les utilisateurs lèvent des issues, je les corrige et y a du mouvement :-)
Sinon, comment Pythran réalise-t-il l'exploration des fils que tu décris ? J'imagine que c'est à coup de graphe […]
C'est ça, le graphe contient le successeur de chaque nœud, et chaque nœud a un traitement dédié. On accumule (en calculant des unions d'intervalles) les résultats de chaque fil par nœud rencontré. Par contre je ne prends pas en compte les intervalles de vie des variables, j'explore comme une nouille à chaque fois. Si tu te sens de regarder ça, je suis preneur ;-)
Ahah, magie du français. J'émets des doutes sur le sujet, mais je les garde pour moi :-)
Sans trop prendre partie, on remarquera que la communauté s'est scindée entre ceux qui sont sur IRC, ceux qui sont sur Discord, et ceux qui sont sur les deux.
3.12[defns.impl.defined]implementation-defined behavior:
behavior, for a well-formed program construct and correct data, that depends on the implementation and that each implementation documents
3.27[defns.undefined]undefined behavior
behavior for which this document imposes no requirements
3.28[defns.unspecified]unspecified behavior
behavior, for a well-formed program construct and correct data, that depends on the implementation
On notera d'ailleurs l'élégant
3.14[defns.locale.specific]locale-specific behavior
behavior that depends on local conventions of nationality, culture, and language that each implementationdocuments
Elle a l'avantage de se vectoriser très bien, et d'éviter le passage par une multiplication. Elle reste moins bonne que la version de référence, sauf dans les cas dégénérés (pas de zéro p.e.). On notera qu'on pourrait aussi passer la boucle interne sous OpenMP :-)
J'espère que ce petit défi vous a intéressé et appris de nouvelles choses sur python. Si vous voulez revoir d'autres défis du même type, n'hésitez pas à plussoyer ce journal et laisser des commentaires.
Très ludique, ça permet d'explorer, de découvrir des choses, j'<3
Tu explique que c'est plus simple de gérer python3 que python2+python3
Oui ! Content que l'idée soit passée
Est-ce qu'il y avait des comportement complexes à implémenter avec python2 et qui sont grandement facilité dans python3 ?
Bien que cette question soit (à mon sens) vaine (Python3 est là, Python2 est mort, à quoi bon remuer le couteau dans la plaie), je peux donner un avis non éclairé. Pas de grosse simplification, dans la cadre de Pythran, plutôt de l'harmonisation et du cosmétique, à part la différenciation str/bytes qui ajoute de la complexité apparente à Python3. Je dis bien apparente car elle force au final à raisonner de manière plus précise sur nos données, et une fois ce travail fait, on est bien dans les clous, alors qu'en Python2 ça pouvait exploser sur le tard.
Ensuite Pythran a au final un usage assez simple de Python, donc n'est pas forcément représentatif.
Ah si, s'il fallait ralouiller un peu, je trouve les stacktrace Python2 plus lisibles que leur version Python3.
[^] # Re: Et LLVM dans tout ça ?
Posté par serge_sans_paille (site web personnel) . En réponse au journal Alignement chaotic neutre. Évalué à 5.
L'histoire dont est tiré ce journal est relatée dans https://reviews.llvm.org/D104745. J'ai voulu isoler le problème pour que le journal soit plus accessible, mais tu devrais y trouver de quoi satisfaire ta légitime curiosité !
[^] # Re: Hibou (chouette)
Posté par serge_sans_paille (site web personnel) . En réponse au journal Compter en C++, de 98 jusqu'à 11. Évalué à 4.
Super tip! Merci o/
# Hibou (chouette)
Posté par serge_sans_paille (site web personnel) . En réponse au journal Compter en C++, de 98 jusqu'à 11. Évalué à 4.
C'est un chouette projet ! J'ai parcouru des bouts et j'aime bien l'approche avant/après pour motiver le passage à C++11.
Je remarque que tu as extrait certains code source dans des fichiers séparés, ça pourrait être bien d'essayer de les compiler pour garantir qu'ils sont « propres ». Par exemple je vois plusieurs fonctions
main
renvoyantint
mais sansreturn
. Ça ne change rien au discours de fond, mais fournir des exemples sans warning ajoute un côté classou à l'ensemble à mon avis.[^] # Re: Pas si simple.
Posté par serge_sans_paille (site web personnel) . En réponse au journal Constexpr versus template. Évalué à 2.
On pourrait imaginer que le compilo mémoise l'appel à la fonction constexpr - j'imagine que c'est valable et on retomberait sur nos pattes :-)
Chouette article, sur le fond et la forme c'est un plaisir à lire !
[^] # Re: Tu oublies des fritures !
Posté par serge_sans_paille (site web personnel) . En réponse au journal Sortie de C++ 2000. Évalué à 2. Dernière modification le 01 avril 2021 à 14:40.
constfork
permet déjà cela, à travers un[^] # Re: Déjà vu ?
Posté par serge_sans_paille (site web personnel) . En réponse au journal Sortie de C++ 2000. Évalué à 3. Dernière modification le 01 avril 2021 à 14:17.
C'est… excellent :-) Merci !
[^] # Re: Autres pistes
Posté par serge_sans_paille (site web personnel) . En réponse au journal Toujours plus proche du Python avec C++. Évalué à 5.
Chouette biblio ! Peu de temps après avoir posté ce journal, on m'a également pointé https://github.com/jfalcou/raberu qui est en C++20 mais reprend des idées des différentes approches que tu cites :-)
On notera que l'article de Jonathan Boccara que tu mentionnes répond à certaines des question de ce fil ;-)
[^] # Re: Limité
Posté par serge_sans_paille (site web personnel) . En réponse au journal Toujours plus proche du Python avec C++. Évalué à 7.
Dans mon exemple, j'ai semé des
auto
partout pour rester pythonic. Mais tu peux aussi écriresi tu veux forcer le type (et/ou le documenter).
Carrément.
Y a des
static_assert
, donc tu as un message à la compil, mais moins élaboré / lisible que ce que peut produire un compilo, c'est sûr hein :-)C'est surtout pour la beauté de la chose, pour la note artistique, le frisson de repousser les limites du langage :-)
[^] # Re: Moui
Posté par serge_sans_paille (site web personnel) . En réponse au journal Toujours plus proche du Python avec C++. Évalué à 5.
C'est vrai. Mais on l'a dans le corps de la fonction, surtout si on se passe de
auto
Voui :-) ensuite on peut imaginer que cet appelé face un appel à une fonction non-template une fois les arguments traités.
Merci pour ce cas test, ce bug est corrigé (et tu es crédité dans le commit !), plus de copie maintenant. Pour le passage par référence, c'est les règles de déductions des universal références classiques.
[^] # Re: Littéraux non-standard
Posté par serge_sans_paille (site web personnel) . En réponse au journal Toujours plus proche du Python avec C++. Évalué à 4.
Wé c'est pas standard, mais supporté par gcc et clang :-/
J'ai pas trouvé comment avoir une approche similaire sans ça…
# Merci
Posté par serge_sans_paille (site web personnel) . En réponse au journal Interview de Michel Pigenet : la loi des associations 1901. Évalué à 4.
J'ai adoré cette mise en perspective historique d'un fait qui nous semble couler de source, alors qu'il ne l'a pas toujours été, semble-t-il.
Un grand merci à l'interviewer et l'interviewé, donc !
[^] # Re: OpenMP
Posté par serge_sans_paille (site web personnel) . En réponse au journal LLVM 11.0.0. Évalué à 6. Dernière modification le 13 octobre 2020 à 20:49.
D'un point de vue outil, le support OpenMP implique :
libomp
, pour pouvoir optimiser certaines séquences[^] # Re: c'est bien gentil ça mais...
Posté par serge_sans_paille (site web personnel) . En réponse au journal Tous cousins. Évalué à 2.
En te disant que tu es aussi cousin, je de sais pas moi, du Dalaï Lama, de Linus Torvald ou tout autre personne que tu apprécies ;-)
[^] # Re: Quel est l'intérêt ?
Posté par serge_sans_paille (site web personnel) . En réponse au journal C++ vin va vous faire tourner en barrique !. Évalué à 6.
Une blague connexe : C++, ça augmente le C, mais ça renvoie toujours du C.
# Super
Posté par serge_sans_paille (site web personnel) . En réponse au journal Des nombres aléatoires dans le noyau Linux. Évalué à 10.
Journal très complet, très didactique. Il donne l'impression d'avoir tout compris, avec en plus un côté historique des plus agréable.
Super !
[^] # Re: Intéressé ?
Posté par serge_sans_paille (site web personnel) . En réponse au journal Témoignage de 98 lycéennes et lycéens : comment ont-ils vécu le confinement ?. Évalué à 3.
J'ai ri :-)
[^] # Re: Sympa
Posté par serge_sans_paille (site web personnel) . En réponse au journal Analyse de plage de valeurs dans Pythran. Évalué à 3.
Merci ! Je ne comprends pas la moitié des notions théoriques que je manipule, mais au moins j'essaie
Oui, c'est un vrai problème qui doit cacher quelques bugs dans Pythran. Mais c'est ma technique secrète pour faire vivre le projet : introduire des bugs pour que les utilisateurs lèvent des issues, je les corrige et y a du mouvement :-)
C'est ça, le graphe contient le successeur de chaque nœud, et chaque nœud a un traitement dédié. On accumule (en calculant des unions d'intervalles) les résultats de chaque fil par nœud rencontré. Par contre je ne prends pas en compte les intervalles de vie des variables, j'explore comme une nouille à chaque fois. Si tu te sens de regarder ça, je suis preneur ;-)
[^] # Re: Côté social
Posté par serge_sans_paille (site web personnel) . En réponse au journal Sortie de LLVM 10.0.0. Évalué à 2.
Ahah, magie du français. J'émets des doutes sur le sujet, mais je les garde pour moi :-)
Sans trop prendre partie, on remarquera que la communauté s'est scindée entre ceux qui sont sur IRC, ceux qui sont sur Discord, et ceux qui sont sur les deux.
[^] # Re: Typo
Posté par serge_sans_paille (site web personnel) . En réponse au journal Sortie de LLVM 10.0.0. Évalué à 3.
C'est bien une erreur, il fallait lire
Si un modo peut faire le changement ?
# Undefined != Unspecified
Posté par serge_sans_paille (site web personnel) . En réponse au journal C++, surcharge d'opérateur, ordre d'évaluation. Évalué à 2.
Ce comportement est plutôt non-spécifié, ce qui est (heureusement) différent d'indéfini !
D'après un draft du standard pris au hasard, dans la section
3 Terms and definitions[intro.defs]
On notera d'ailleurs l'élégant
# Quitte à faire du branchless
Posté par serge_sans_paille (site web personnel) . En réponse au journal Exercices de programmation et benchmarks. Évalué à 4.
Je te propose cette légère amélioration :
Elle a l'avantage de se vectoriser très bien, et d'éviter le passage par une multiplication. Elle reste moins bonne que la version de référence, sauf dans les cas dégénérés (pas de zéro p.e.). On notera qu'on pourrait aussi passer la boucle interne sous OpenMP :-)
Cas dégénéré : http://quick-bench.com/PTIzGKHuheFGyKEVjkAPBwgDo4s
Cas normal : http://quick-bench.com/goZHQlQ10U4sDqMiEP0nMyyXUBs
Merci pour ce petit jeu d'esprit !
# Foire aux liens
Posté par serge_sans_paille (site web personnel) . En réponse au journal De retour du FOSDEM 2020. Évalué à 6.
Quelques liens attrapés à la volée pendant les présentations :
memcmp
est devenue pourrie# Chouette !
Posté par serge_sans_paille (site web personnel) . En réponse au journal Chaînes de formatage et sécurité en python (solution au "Petit Défi Python"). Évalué à 8.
Très ludique, ça permet d'explorer, de découvrir des choses, j'<3
# Indices
Posté par serge_sans_paille (site web personnel) . En réponse au journal Petit défi Python. Évalué à 7.
Premier indice, tiré de la doc mentionnée dans le journal :
Deuxième indice, lié à l'introspection :
[^] # Re: Question
Posté par serge_sans_paille (site web personnel) . En réponse au journal Exit Pyth(on|ran)2. Évalué à 6.
Oui ! Content que l'idée soit passée
Bien que cette question soit (à mon sens) vaine (Python3 est là, Python2 est mort, à quoi bon remuer le couteau dans la plaie), je peux donner un avis non éclairé. Pas de grosse simplification, dans la cadre de Pythran, plutôt de l'harmonisation et du cosmétique, à part la différenciation str/bytes qui ajoute de la complexité apparente à Python3. Je dis bien apparente car elle force au final à raisonner de manière plus précise sur nos données, et une fois ce travail fait, on est bien dans les clous, alors qu'en Python2 ça pouvait exploser sur le tard.
Ensuite Pythran a au final un usage assez simple de Python, donc n'est pas forcément représentatif.
Ah si, s'il fallait ralouiller un peu, je trouve les stacktrace Python2 plus lisibles que leur version Python3.