首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSE2,2010和调试构建

SSE2,2010和调试构建
EN

Stack Overflow用户
提问于 2012-07-11 00:54:46
回答 2查看 3.9K关注 0票数 4

在禁用优化时,编译器能自动使用SSE2吗?

当优化被禁用时,/arch:SSE2标志是否意味着什么?

我被赋予了从我们的软件中挤出更多性能的任务。不幸的是,版本构建是使用调试设置完成的,并且到目前为止,试图为优化的情况辩护的尝试都没有成功。

使用编译器标志x86编译/ZI /Od /arch:SSE2 /FAs。生成的程序集显示编译器没有使用SSE2。这是因为优化被禁用了吗?

在代码中,有几种情况与此类似:

代码语言:javascript
复制
char* begin = &bufferObject;
char* end   = begin + sizeof(bufferObject);
char  result;
while ( begin != end ) {
    result ^= *begin++;
}

我想让编译器将此操作向量化,但它没有;我怀疑需要启用优化。

我手工编码了两个解决方案:一个使用内联__asm块,另一个使用<emmintrin.h>中定义的SSE2本质。我不想依赖这个。

更新

除了上面的问题,我希望调用库函数,比如memcpy,在适当的时候使用所提供的矢量化版本。查看memcpy的汇编代码,我可以看到有一个名为_VEC_memcpy的函数,它使用SSE2进行更快的复制。决定是否分支到此例程的块如下:

代码语言:javascript
复制
    ; 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符号吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

票数 9
EN

Stack Overflow用户

发布于 2012-07-11 01:07:12

试图优化用MSVC的调试设置构建的代码是一件愚蠢的差事,因为编译器实际上是在想方设法地使代码慢下来,例如在堆栈上和堆栈外杂耍数据(这会导致负载命中商店停止)等诸如此类的事情。

在任何情况下,MSVC都不会将该块矢量化,无论是在版本中还是在调试中。您将需要使用本质,以使它发出正确的机器代码。这里是/O2 /Ot /Oi /arch:SSE2:

代码语言:javascript
复制
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本质。我怀疑任何编译器都不会将特定的操作向量化,因为它本质上是一个“约简”而不是一个“映射”,而且我还没有看到一个编译器进行水平(非正交)向量化。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11424075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档