Comment savoir si mon code est vectorisé par le compilateur?


9

Comme l'illustre la réponse de Jed Brown aux coûts des recherches par rapport aux calculs , l'utilisation d'opérations à virgule flottante vectorisées vs non vectorisées résulte en un code beaucoup plus rapide. De nombreux compilateurs modernes affirment qu'ils peuvent effectuer une vectorisation automatique. Comment savoir quelles parties de mon code sont vectorisées avec succès?

Réponses:


10

Avec le compilateur Intel de tout cru moderne, -O3 -vec-report3. Le niveau d'optimisation trois garantit qu'il essaie de vectoriser, et le rapport vectoriel vous dira ce qu'il fait.

La page GNU sur la vectorisation dit qu'elle est activée par défaut au niveau d'optimisation 3, mais je ne trouve pas l'équivalent de vec-report.


Merci pour la réponse rapide. Je ne connaissais pas -vec-report3. Avez-vous une préférence de compilation pour ce type de chose (vectorisation automatique)?
Matthew Emmett

Les compilateurs Intel sont vraiment bons, mais uniquement pour les puces Intel. Il vous suffit d'ajouter tous les bons pragmas (#pragma ivdep est le plus simple) GCC 4.7 s'est beaucoup amélioré mais en regardant un peu de code avec un collègue, il a toujours des bugs (comme pas de vectorisation dans les pragmas openmp).
aterrel

1
Je conseillerais de vérifier à nouveau comment le compilateur Intel fait avec la vectorisation sur les puces AMD. Je ne suis pas sûr à 100% que les problèmes de l'ancien existent toujours.
Bill Barth

2
@BillBarth Oui, toujours un problème. Voir l'avis d'optimisation (en de nombreux endroits, par exemple software.intel.com/sites/products/collateral/hpc/compilers/… ). AMD a remporté la bataille judiciaire exigeant qu'Intel révèle qu'ils sont anticoncurrentiels, et non qu'ils ne cessent de l'être. en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler#Criticism Agner Fog sur les solutions de contournement: agner.org/optimize/blog/read.php?i=49
Jed Brown

@JedBrown, bien sûr, SSE est toujours bizarre, mais quelle est l'histoire avec AVX? Ces liens indiquent que tout devrait bien se passer (puisque les deux sociétés implémentent AVX), mais je ne l'ai pas testé sur une machine Bulldozer.
Bill Barth

8

Dans la collection de compilateurs GNU, vous avez l'option -ftree-vectorizer-verbose=nnest un nombre compris entre 0 et 6 qui affichera des informations similaires à icc/ ifort.


5

Avec les compilateurs GNU, l'ajout -Wa,-ahl=asm.svidera le code d'assembly généré dans asm.s.

Avec les compilateurs Intel, l'ajout -fcode-asm -Faasm.svidera le code généré dans asm.s.

Vous pouvez ensuite inspecter le code assembleur et rechercher des opérations de point flottant vectoriel.


Je suis tout à fait d'accord que l'inspection de la sortie d'un assemblage est le seul moyen fiable de déterminer si le code est réellement vectorisé. Il n'y a rien qui oblige les compilateurs à être honnêtes quant à leurs prétentions à vectoriser du code.
Jeff
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.