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.
Sie können auch die Vektorerweiterungen verwenden. – Jester
Get 'GCC' zur Ausgabe von Assembler' g ++ -S -o prog.s prog.cpp' – Galik
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 ". –