寻找一种处理 3D 矢量的最快方法,它们的点积,交叉积

Looking for a fastest way to treat 3D vectors, their dot products, cross products?

本文关键字:方法 叉积 一种 处理 3D 寻找      更新时间:2023-10-16

我正在寻找一种最快的方法来处理浮点型 3D 矢量 (x、y、z)、它们的点积、叉积。我认为它可能会涉及某些英特尔的技术,例如SSE4。有人有好的建议吗?或者有关如何使用SSE4的经验,例如f32vec4?谢谢。

那是很久以前的事了,但是上次我检查为这种计算生成的汇编代码时,结果因编译器而异,即使对于完全相同的机器代码,执行速度也因处理器而异。

我的意思是,有时在一种情况下的优化在另一种情况下是悲观的,因此很难提出一个始终正确的选择。

举个例子,我记得定义一个 3d 向量类

struct P3d {
    float x,y,z;
    ...

使用编译器,我的 PC 向量加法的最佳解决方案是定义增强赋值,然后使用它定义加法

    ...
    P3d& operator+=(const P3d& other)
    {
        x += other.x;
        y += other.y;
        z += other.z;
        return *this;
    }
 };
 inline P3d operator+(P3d a, const P3d& b)
 {
     a += b;
     return a;
 }

而对于另一个编译器,最好的代码是用更自然的

 inline P3d operator+(const P3d& a, const P3d& b)
 {
     return P3d(a.x+b.x, a.y+b.y, a.z+b.z);
 }

可悲的是,我发现没有C++解决方案像在公式中明确地为 x、y 和 z 手动编写代码一样快。

然而,差异是"小的"(最多在20%的IIRC左右),最后我只是使用了最易读的版本。

也许现在情况好多了,但我对此表示怀疑。如果你真的想榨出所有的汁液,那么答案将取决于编译器版本和确切的处理器。这也意味着,除非您为固定硬件解决方案(如控制台)编写代码,否则代码可能会在短短几个月内变得次优,届时编译器和处理器都将继续前进。