2017-12-19 8 views
1

数学を行うためのコードを書いたので、速く進む必要があるので、SSEとAVX命令を使用する必要があります。私はg ++でコンパイルしていますが、フラグ-O3-march=nativeを使用していますので、SSEとAVX命令を使用していると思いますが、わかりません。私のコードのほとんどは、次のようになります。コンパイルされたコードでsse命令とavx命令が使用されているかどうかをチェックする方法は?

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

は(コンパイル後に)私のコードは、SSEやAVX命令を使用場合、私が言うことができる方法はありますか?私は見ることができるアセンブリを見ることができると思うが、私はアセンブリを知らないし、コンパイラが出力するアセンブリをどのように見るかわからない。

+0

ベクターエクステンションを使用することもできます。 – Jester

+2

出力アセンブラ 'g ++ -S -o prog.s prog.cpp' – Galik

+0

コンパイラの出力を調べるには:https://stackoverflow.com/questions/38552116/how-to-remove-noise-from- gcc-clang-assembly-output。 @Galik:明らかに、 'g ++ -march = native -O3 -S'を使用して、asmの出力を最適化する必要があります。また、スカラーFPコードでSSE命令が表示されることに注意してください。例えば、倍精度を追加するための 'vaddsd 'があります。 'vmulps'(packed double)、' vmulps'(packed scalar)、 'vpmulld'(packed add dword(32ビット要素)の整数)やその他のパックド整数乗算命令を探しています。 ''と '' c'を使用しています –

答えて

0

唯一の方法は、生成されたコードに逆アセンブルし、その使用方法を確認することです。

objdump -d

+2

これは、Googleで5秒で解決できる簡単な部分です。ハード部分は、自動ベクトル化されたコードとスカラーの両方を認識しています(少なくともスカラーFPの場合は同じレジスタを使用するため)。 –

2

アセンブリを確認する必要はありません。ほとんどのコンパイラは、ループがSIMD命令を使用してベクター化されているかどうかを正確に示す最適化レポートを提供します。あなたはGCCを使用してコンパイルした場合

は、最適化に関するコンパイラは冗長にするために必ずベクトル化は、どのSIMD命令セット(SSE、AVX、...)あなたは支持体上でコンパイルされているCPUを使用して実行されていることを確認し、-fopts-infoを追加する-O3 -march=nativeを設定しました:

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

役に立てば幸い:

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

これはあなたのような出力が得られます。

-1

他にも指摘されているように、-Sを使用してアセンブリコードを生成することができます。

さらに、外部ツールを使用して、objdumpやより専門的なもの、idaなどのコンパイル済みバイナリを逆アセンブルすることができます。

関連する問題