禁用优化时编译器能否自动使用 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++;
}
我想让编译器为我向量化这个操作,但它没有;我怀疑需要启用优化。
我手工编写了两种解决方案:一种使用内联__asm
块,另一种使用<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
被称为......永远。