SSE2,Visual Studio 2010和Debug Build

Ant*_*ony 4 c++ optimization visual-studio-2010 sse2

编译器是否可以在禁用优化的同时自动使用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++;
}
Run Code Online (Sandbox Code Playgroud)

我想让编译器为我操作这个操作,但它没有; 我怀疑需要启用优化.

我手工编写了两个解决方案:一个使用内联__asm块,另一个使用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
Run Code Online (Sandbox Code Playgroud)

我不认为这_VEC_memcpy被称为...... 永远.

如果该/arch:SSE2标志来定义这个__sse2_available符号?

Mys*_*ial 9

Visual Studio 2010及更早版本根本不支持自动矢量化.

目的/arch:SSE2是允许编译器使用标量SSE进行浮点运算,而不是x87 FPU.

所以,你可能会得到一些加速用/arch:SSE2,因为它允许您访问在x64上更多的寄存器.但请记住,它不是来自矢量化.

如果你想在VS2010上进行矢量化,你几乎必须手动使用内在函数.


Visual Studio 2012支持自动矢量化:

http://msdn.microsoft.com/en-us/library/hh872235%28v=vs.110%29.aspx