首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用SSE (以及SSE2、SSE3等)使用可视C++构建时的扩展?

如何使用SSE (以及SSE2、SSE3等)使用可视C++构建时的扩展?
EN

Stack Overflow用户
提问于 2011-08-16 03:21:32
回答 2查看 1.9K关注 0票数 3

通过使用visual studio中的SSE指令,我现在正在对一个基本的点积函数进行一个小的优化。

下面是我的代码:(函数调用约定是cdecl):

代码语言:javascript
复制
float SSEDP4(const vect & vec1, const vect & vec2)
{
    __asm
    {
        // get addresses
        mov ecx, dword ptr[vec1]
        mov edx, dword ptr[vec2]
        // get the first vector
        movups xmm1, xmmword ptr[ecx]
        // get the second vector (must use movups, because data is not assured to be aligned to 16 bytes => TODO align data)
        movups xmm1, xmmword ptr[edx]
        // OP by OP multiply with second vector (by address)
        mulps xmm1, xmm2
        // add everything with horizontal add func (SSE3)
        haddps xmm1, xmm1
        // is one addition enough ?
        // try to extract, we'll see
        pextrd eax, xmm1, 03h
    }
}

vect是一个简单的结构,它包含4个单精度浮点数,不到16个字节(这就是为什么我使用movups而不是movaps)

使用(1.0, 1.2, 1.4, 1.0)初始化vec1,使用(2.0, 1.8, 1.6, 1.0)初始化vec2

一切都编译得很好,但是在执行时,我在两个XMM寄存器中都得到了0,因此在调试时,visual studio向我显示了两个寄存器(MMX1和MMX2,或者有时是MMX2和MMX3),它们是64位寄存器,但没有XMM,所有寄存器都是0。

有人知道发生了什么吗?

提前感谢您:)

EN

回答 2

Stack Overflow用户

发布于 2011-08-16 03:29:12

有几种方法可以在MSVC++上获取SSE指令:

http://msdn.microsoft.com/en-us/library/t467de55.aspx

  • External MASM文件的
  1. 编译器内部功能。

内联汇编(如您的示例代码中所示)不再是一个合理的选择,因为在为非32位x86系统构建时,它将无法编译。(例如,构建64位二进制文件将失败)

此外,组装块会抑制大多数优化。这对你不好,因为即使是像内联这样的简单事情也不会发生在你的函数中。内部函数的工作方式不会击败优化器。

票数 6
EN

Stack Overflow用户

发布于 2011-08-16 04:13:54

您的编译和运行都是正确的,所以您至少能够使用SSE。

要在寄存器窗口中查看SSE寄存器,请右击寄存器窗口并选择SSE。这应该会让您看到XMM寄存器。

您还可以在监视窗口中使用@xmm<register><component> (例如,使用@xmm00查看xmm0[0])来查看XMM寄存器的各个组件。

现在,对于您的实际问题,您正在使用[edx]覆盖xmm1,而不是将其填充到xmm2中。

此外,标量浮点值在st(0)中的x87堆栈上返回。而不是试图记住如何做到这一点,我只是简单地将结果存储在堆栈变量中,并让编译器为我完成:

代码语言:javascript
复制
float SSEDP4(const vect & vec1, const vect & vec2)
{
    float result;
    __asm
    {
        // get addresses
        mov ecx, dword ptr[vec1]
        mov edx, dword ptr[vec2]
        // get the first vector
        movups xmm1, xmmword ptr[ecx]
        // get the second vector (must use movups, because data is not assured to be aligned to 16 bytes => TODO align data)
        movups xmm2, xmmword ptr[edx] // xmm2, not xmm1
        // OP by OP multiply with second vector (by address)
        mulps xmm1, xmm2
        // add everything with horizontal add func (SSE3)
        haddps xmm1, xmm1
        // is one addition enough ?
        // try to extract, we'll see
        pextrd [result], xmm1, 03h
    }

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

https://stackoverflow.com/questions/7069603

复制
相关文章

相似问题

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