Woher weiß ich, ob mein Code vom Compiler vektorisiert wird?

9

Wie aus Jed Browns Antwort auf die Kosten für Suchvorgänge im Vergleich zu Berechnungen hervorgeht , führt die Verwendung von vektorisierten oder nicht vektorisierten Gleitkommaoperationen zu einem viel schnelleren Code. Viele moderne Compiler behaupten, dass sie eine automatische Vektorisierung durchführen können. Wie kann ich feststellen, welche Teile meines Codes erfolgreich vektorisiert werden?

Matthew Emmett
quelle

Antworten:

10

Mit dem Intel-Compiler eines jeden modernen Jahrgangs -O3 -vec-report3. Optimierungsstufe drei garantiert, dass versucht wird, Vektoren zu erstellen, und der Vektorbericht zeigt Ihnen, was er tut.

Die GNU-Seite zur Vektorisierung gibt an, dass sie standardmäßig auf Optimierungsstufe 3 aktiviert ist, aber ich kann das Äquivalent zu vec-report nicht finden.

Bill Barth
quelle
Danke für die schnelle Antwort. Ich wusste nichts über -vec-report3. Haben Sie eine Compiler-Präferenz, wenn es um solche Dinge geht (automatische Vektorisierung)?
Matthew Emmett
Intel-Compiler sind wirklich gut, aber nur für Intel-Chips. Sie müssen nur die richtigen Pragmas hinzufügen (#pragma ivdep ist am einfachsten). GCC 4.7 ist viel besser geworden, aber wenn Sie einen Code mit einem Kollegen durchsehen, weist es immer noch Fehler auf (wie keine Vektorisierung in openmp-Pragmas).
Aterrel
1
Ich würde empfehlen, noch einmal zu überprüfen, wie der Intel-Compiler mit der Vektorisierung auf AMD-Chips umgeht. Ich bin mir nicht 100% sicher, ob die alten Probleme noch bestehen.
Bill Barth
2
@ BillBarth Ja, immer noch ein Problem. Siehe den Optimierungshinweis (an vielen Stellen, z . B. software.intel.com/sites/products/collateral/hpc/compilers/… ). AMD hat den Gerichtsstreit gewonnen, bei dem Intel offenlegen muss, dass sie wettbewerbswidrig sind, und nicht, dass sie aufhören, zu sein. en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler#Criticism Agner Fog bei Problemumgehungen
Jed Brown
@JedBrown, sicher, dass SSE immer noch komisch ist, aber was ist die Geschichte mit AVX? Diese Links weisen darauf hin, dass alles in Ordnung sein sollte (da beide Unternehmen AVX implementieren), aber ich habe es nicht auf einem Bulldozer-Computer getestet.
Bill Barth
8

Innerhalb der GNU-Compilersammlung haben Sie die Option, -ftree-vectorizer-verbose=nwobei neine Zahl zwischen 0 und 6 ist, die Informationen ähnlich wie icc/ druckt ifort.

Pedro
quelle
5

Bei GNU-Compilern wird durch Hinzufügen -Wa,-ahl=asm.sder generierte Assemblycode ausgegeben asm.s.

Bei Intel-Compilern wird durch Hinzufügen -fcode-asm -Faasm.sder generierte Code ausgegeben asm.s.

Anschließend können Sie den Assemblycode überprüfen und nach Vektor-Gleitkommaoperationen suchen.

Matthew Emmett
quelle
Ich stimme voll und ganz zu, dass die Überprüfung der Baugruppenausgabe der einzig zuverlässige Weg ist, um festzustellen, ob der Code tatsächlich vektorisiert ist. Es gibt nichts, was Compiler dazu verpflichtet, ehrlich zu ihren Behauptungen zu sein, Code zu vektorisieren.
Jeff