在使用Visual C构建时,如何使用SSE(和SSE2,SSE3等)扩展?
我现在正在使用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,结果就是这样 有人知道发生了什么吗? 先感谢您 :) 解决方法
有两种方法可以获得MSVC上的SSE指令:
>编译器内在函数 – > http://msdn.microsoft.com/en-us/library/t467de55.aspx 内联汇编(在示例代码中)不再是合理的选项,因为在构建非32位x86系统时它不会编译. (例如,构建64位二进制文??件将失败) 此外,汇编块会抑制大多数优化.这对你不好,因为即使你的功能也不会发生像内联这样的简单事情.内在函数以不会击败优化器的方式工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |