在禁用优化时,编译器能自动使用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>中定义的SSE2本质。我不想依赖这个。
更新
除了上面的问题,我希望调用库函数,比如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被称为..。永远不会。
/arch:SSE2标志应该定义这个__sse2_available符号吗?
发布于 2012-07-11 00:57:54
Visual 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
发布于 2012-07-11 01:07:12
试图优化用MSVC的调试设置构建的代码是一件愚蠢的差事,因为编译器实际上是在想方设法地使代码慢下来,例如在堆栈上和堆栈外杂耍数据(这会导致负载命中商店停止)等诸如此类的事情。
在任何情况下,MSVC都不会将该块矢量化,无论是在版本中还是在调试中。您将需要使用本质,以使它发出正确的机器代码。这里是/O2 /Ot /Oi /arch:SSE2:
PUBLIC ?VectorTest@@YADPAD0@Z ; VectorTest
; Function compile flags: /Ogtp
; COMDAT ?VectorTest@@YADPAD0@Z
_TEXT SEGMENT
_begin$ = 8 ; size = 4
_result$ = 11 ; size = 1
_end$ = 12 ; size = 4
?VectorTest@@YADPAD0@Z PROC ; VectorTest, COMDAT
; 143 : {
push ebp
mov ebp, esp
; 144 : char result;
; 145 : while ( begin != end ) {
mov ecx, DWORD PTR _begin$[ebp]
mov edx, DWORD PTR _end$[ebp]
mov al, BYTE PTR _result$[ebp]
cmp ecx, edx
je SHORT $LN1@VectorTest
$LL2@VectorTest:
; 146 : result ^= *begin++;
xor al, BYTE PTR [ecx]
inc ecx
cmp ecx, edx
jne SHORT $LL2@VectorTest
$LN1@VectorTest:
; 147 : }
; 148 : return result;
; 149 : }
pop ebp
ret 0
?VectorTest@@YADPAD0@Z ENDP ; VectorTest
_TEXT ENDS现在的编译器在矢量化方面真的很糟糕,所以我们在整个应用程序中都依赖于SSE本质。我怀疑任何编译器都不会将特定的操作向量化,因为它本质上是一个“约简”而不是一个“映射”,而且我还没有看到一个编译器进行水平(非正交)向量化。
https://stackoverflow.com/questions/11424075
复制相似问题