Ant*_*ony 4 c++ optimization visual-studio-2010 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符号?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
| 归档时间: |
|
| 查看次数: |
3866 次 |
| 最近记录: |