2017-12-19 3 views
1

Ich habe einen Code geschrieben, um eine Menge Mathe zu machen, und es muss schnell gehen, also brauche ich SSE- und AVX-Anweisungen. Ich kompiliere es mit g ++ und ich verwende die Flags -O3 und -march=native, also denke ich, dass es SSE und AVX Anweisungen verwendet, aber ich bin mir nicht sicher. Die meisten meiner Code sieht etwa wie folgt:Wie überprüft man, ob der kompilierte Code SSE- und AVX-Anweisungen verwendet?

for(int i = 0;i<size;i++){ 
    a[i] = b[i] * c[i]; 
} 

Gibt es irgendeine Weise, die ich, wenn mein Code sagen kann (nach der Kompilierung) verwendet SSE und AVX Anweisungen? Ich denke, ich könnte auf die Assembly schauen, um zu sehen, aber ich weiß Assembly nicht, und ich weiß nicht, wie man die Assembly sieht, die der Compiler ausgibt.

+0

Sie können auch die Vektorerweiterungen verwenden. – Jester

+2

Get 'GCC' zur Ausgabe von Assembler' g ++ -S -o prog.s prog.cpp' – Galik

+0

Zum Betrachten der Compiler-Ausgabe: https://stackoverflow.com/questions/38552116/how-to-remove-noise-from- gcc-clang-Montage-Ausgabe. @Galik: Offensichtlich musst du 'g ++ -march = native -O3 -S' verwenden, um mit Optimierungen asm-Ausgaben zu erhalten. Beachten Sie auch, dass Sie SSE-Anweisungen im skalaren FP-Code sehen, wie 'vaddsd', um Doubles hinzuzufügen. Sie suchen nach 'vmulpd' (gepackter Doppel),' vmulps' (gepackter Skalar) oder 'vpmulld' (ganzzahlig gepacktes add dword (32-Bit-Elemente) oder andere gepackte Ganzzahl-Multiplikationsanweisungen, abhängig vom Typ von' b "und" c ". –

Antwort

0

Die einzige Möglichkeit zu erzählen ist, zu dem generierten Code zu disassemblieren und zu sehen, welche Anweisungen es verwendet.

objdump -d

+2

Dies ist nur der einfache Teil, den 5 Sekunden mit Google lösen können.Der schwierige Teil ist die Erkennung von automatisch vektorisiertem Code vs. Skalar, weil beide die gleichen Register verwenden (zumindest für skalare FP). –

2

Es gibt keine Notwendigkeit besteht, die Montage zu überprüfen. Die meisten Compiler liefern Optimierungsberichte, die Ihnen genau sagen, ob Ihre Schleifen mit SIMD-Anweisungen vektorisiert wurden.

Wenn Sie GCC kompilieren verwenden, stellen Sie sicher, dass -O3 -march=native Vektorisierung zu machen erfolgt mit der angegebenen SIMD-Befehlssatz (SSE, AVX, ...), um die CPU Sie auf den Ständern kompilieren, und fügen Sie -fopts-info der Compiler ausführliche über Optimierungen zu machen :

main.cpp:12:20: note: loop vectorized 
main.cpp:12:20: note: loop peeled for vectorization to enhance alignment 

Hoffnung, die hilft:

g++ -O3 -march=native -fopt-info -o main.o main.cpp 

Dies wird Ihnen eine Ausgabe wie geben.

-1

Wie andere darauf hingewiesen haben, können Sie mit dem -S Assemblercode generieren.

Darüber hinaus können Sie externe Tools verwenden, um die kompilierte Binärdatei wie objdump oder professioneller Ida zu demontieren.

Verwandte Themen