GCC コンパイラでは、この-ftree-vectorize
オプションは自動ベクトル化をオンにし、このフラグは を使用すると自動的に設定され-O3
ます。どのレベルまでベクトル化しますか? つまり、SSE2、SSE4.2、AVX、または AVX2 命令を取得できますか? mavx
、フラグなどの存在はmavx2
知っていますが、特定のタイプのベクトル化を強制するために、これらの特定のフラグなしでコンパイラーが何をしているのかを知りたいです。
1 に答える
すべての x86 64 ビット プロセッサには、少なくとも SSE2 が搭載されています。GCC コンパイラは、他のハードウェア オプションを使用するように指示しない限り、デフォルトで 64 ビット モードの SSE2 コードになります。
32 ビット モードの場合、GCC は SIMD 命令ではない x87 命令を使用する場合があるため、ベクトル化を有効にするには、少なくとも SSE with を有効にして-mfpmath=sse -msse2
ください。
より高い SIMD オプションを有効にすると、コンパイラーはベクトル化の際にそれらの新しい命令を使用する可能性があります (多くの場合は使用します)。
これはClangにも当てはまると思います。ただし、ICC と MSVC の動作は異なります。ICC は、CPU ディスパッチャを作成して、最適なハードウェアを選択する (または AMD ハードウェアを拒否する) 場合があります。MSVC には、64 ビット モードで AVX および AVX2 を有効にするためのオプションしかありません (SSE2 が想定されます)。MSVC で SSE4.1 などを明示的に有効にする方法はありません。代わりに、場合によっては、自動ベクトライザーが SSE4.1 (AVX ではない) をチェックするコードを追加し、それらの命令を使用します。GCC は SSE4.1 のみを使用し-msse4.1
ます-mavx
。