通过使用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)
使用(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。
有人知道发生了什么吗?
提前感谢您:)
发布于 2011-08-16 03:29:12
有几种方法可以在MSVC++上获取SSE指令:
http://msdn.microsoft.com/en-us/library/t467de55.aspx
内联汇编(如您的示例代码中所示)不再是一个合理的选择,因为在为非32位x86系统构建时,它将无法编译。(例如,构建64位二进制文件将失败)
此外,组装块会抑制大多数优化。这对你不好,因为即使是像内联这样的简单事情也不会发生在你的函数中。内部函数的工作方式不会击败优化器。
发布于 2011-08-16 04:13:54
您的编译和运行都是正确的,所以您至少能够使用SSE。
要在寄存器窗口中查看SSE寄存器,请右击寄存器窗口并选择SSE。这应该会让您看到XMM寄存器。
您还可以在监视窗口中使用@xmm<register><component> (例如,使用@xmm00查看xmm0[0])来查看XMM寄存器的各个组件。
现在,对于您的实际问题,您正在使用[edx]覆盖xmm1,而不是将其填充到xmm2中。
此外,标量浮点值在st(0)中的x87堆栈上返回。而不是试图记住如何做到这一点,我只是简单地将结果存储在堆栈变量中,并让编译器为我完成:
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;
}https://stackoverflow.com/questions/7069603
复制相似问题