gpt4 book ai didi

c++ - 使用 Visual C++ 构建时如何使用 SSE(以及 SSE2、SSE3 等)扩展?

转载 作者:太空狗 更新时间:2023-10-29 20:17:15 24 4
gpt4 key购买 nike

我现在正在使用 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 个单精度 float ,未对齐到 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 指令:

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

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

此外, assembly block 会抑制大多数优化。这对您不利,因为即使是像内联这样简单的事情也不会发生在您的函数中。内在函数以不会打败优化器的方式工作。

关于c++ - 使用 Visual C++ 构建时如何使用 SSE(以及 SSE2、SSE3 等)扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7069603/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com