我正在寻找一种最快的方法来处理浮动类型的3D矢量(x,y,z),它们的点积,交叉积。我认为它可能会采用一些英特尔技术,例如SSE4。有人有个好主意吗?或者有关如何使用SSE4的经验,例如f32vec4?感谢。
答案 0 :(得分: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),最后我只使用了最易读的版本。
现在可能情况好转,但我对此表示怀疑。如果你真的想要挤出所有的果汁,那么答案将取决于完全哪个编译器版本以及完全哪个处理器。这也意味着,除非您编写像控制台这样的固定硬件解决方案,否则在编译器和处理器都将继续运行的几个月内,代码可能不是最佳的。