XMVector4Dot 的文档将返回值列为向量。它还指出点积被复制到每个组件中。鉴于点积将是单个值,与仅返回浮点数相比,这如何提供优势?
我可以看到获取值的唯一方法是执行以下操作:
XMVECTOR w = { -XMVectorGetX(XMVector4Dot(x, eye)), -XMVectorGetX(XMVector4Dot(y, eye)), -XMVectorGetX(XMVector4Dot(z, eye)), 1 };
这似乎没有必要。我忽略了其他原因吗?
这对于 SIMD 实施很有帮助。CPU 具有 SIMD 指令(单指令多数据(。
这些指令适用于一组不同的寄存器,并且来回使用常规标量寄存器会产生很高的成本。通过对点积的结果使用相同的向量类型,它有助于保持代码向量化。
此外,将标量值拼接到向量的所有分量中,然后用它来多个 4 数据是很常见的做法。您可以查看结构数组与数组结构(AOS 与 SOA(如何影响 SIMD 算法实现的设计。