加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在使用Visual C构建时,如何使用SSE(和SSE2,SSE3等)扩展?

发布时间:2020-12-16 09:36:40 所属栏目:百科 来源:网络整理
导读:我现在正在使用visual studio中的SSE指令进行基本点积函数的小优化. 这是我的代码:(函数调用约定是cdecl): float SSEDP4(const vect vec1,const vect vec2){ __asm { // get addresses mov ecx,dword ptr[vec1] mov edx,dword ptr[vec2] // get the first v
我现在正在使用visual studio中的SSE指令进行基本点积函数的小优化.

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

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的原因)

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

一切都编译得很好,但在执行时,我在两个XMM寄存器中都得到0,结果就是这样
在调试时,visual studio向我显示了2个寄存器(MMX1和MMX2,有时是MMX2和MMX3),这些寄存器是64位寄存器,但没有XMM,一切都为0.

有人知道发生了什么吗?

先感谢您 :)

解决方法

有两种方法可以获得MSVC上的SSE指令:

>编译器内在函数 – > http://msdn.microsoft.com/en-us/library/t467de55.aspx
>外部MASM文件.

内联汇编(在示例代码中)不再是合理的选项,因为在构建非32位x86系统时它不会编译. (例如,构建64位二进制文??件将失败)

此外,汇编块会抑制大多数优化.这对你不好,因为即使你的功能也不会发生像内联这样的简单事情.内在函数以不会击败优化器的方式工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读