最適化が無効になっている間、コンパイラは SSE2 を自動的に使用できますか?
最適化が無効になっている場合、/arch:SSE2 フラグは何か意味がありますか?
私は、ソフトウェアのパフォーマンスをさらに引き出すという任務を与えられました。残念ながら、リリース ビルドはデバッグ設定を使用して行われ、最適化のケースについて議論する試みは今のところ成功していません。
コンパイラ フラグを使用して x86 用にコンパイルし/ZI /Od /arch:SSE2 /FAs
ます。生成されたアセンブリは、コンパイラが を利用していないことを示していますSSE2
。これは、最適化が無効になっているためですか?
コードには、次のような状況がいくつかあります。
char* begin = &bufferObject;
char* end = begin + sizeof(bufferObject);
char result;
while ( begin != end ) {
result ^= *begin++;
}
コンパイラーにこの操作をベクトル化してもらいたいのですが、そうではありません。最適化を有効にする必要があると思います。
私は 2 つのソリューションを手作業でコーディングしました。1 つはインライン__asm
ブロックを使用し、もう 1 つは で定義された SSE2 組み込み関数を使用し<emmintrin.h>
ます。これに頼らない方がいいです。
アップデート
memcpy
上記の質問に加えて、必要に応じて提供されたベクトル化されたバージョンを使用するために、ライブラリ関数の呼び出しを希望します。のアセンブリ コードを見ると、 コピーを高速化するために を使用するmemcpy
関数が呼び出されていることがわかります。このルーチンに分岐するかどうかを決定するブロックは次のとおりです。_VEC_memcpy
SSE2
; First, see if we can use a "fast" copy SSE2 routine
; block size greater than min threshold?
cmp ecx,080h
jb Dword_align
; SSE2 supported?
cmp DWORD PTR __sse2_available,0
je Dword_align
; alignments equal?
push edi
push esi
and edi,15
and esi,15
cmp edi,esi
pop esi
pop edi
jne Dword_align
; do fast SSE2 copy, params already set
jmp _VEC_memcpy
私はそれが呼び出されているとは思わない_VEC_memcpy
...今まで.