0

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

4

1 回答 1

2

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

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

作为一个例子,我记得定义一个 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),最后我只使用了最易读的版本。

可能现在情况好多了,但我对此表示怀疑。如果您真的想榨干所有汁液,那么答案将取决于确切的编译器版本以及确切的处理器。这也意味着,除非您正在为诸如控制台之类的固定硬件解决方案进行编码,否则在编译器和处理器都将继续前进的几个月内,该代码可能不是最佳的。

于 2013-01-30T21:04:14.400 回答