寻找一种处理 3D 矢量的最快方法,它们的点积,交叉积
Looking for a fastest way to treat 3D vectors, their dot products, cross products?
我正在寻找一种最快的方法来处理浮点型 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左右),最后我只是使用了最易读的版本。
也许现在情况好多了,但我对此表示怀疑。如果你真的想榨出所有的汁液,那么答案将取决于编译器版本和确切的处理器。这也意味着,除非您为固定硬件解决方案(如控制台)编写代码,否则代码可能会在短短几个月内变得次优,届时编译器和处理器都将继续前进。
相关文章:
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 删除节点方法实际上不会删除二叉搜索树中的节点.C++
- 从基于矢量的二叉搜索树中删除节点的最佳方法
- 这种遍历二叉树的递归方法在一些递归后崩溃!为什么?
- 英特尔IPP卷积已弃用--是否有其他IPP 2D卷积方法
- 二叉树递归插入方法不起作用
- 计算卷积的最快方法
- 用于 GMRES 的大矩阵的 C 或 C++ 矩阵矢量积的更快方法
- 这是使用点积找到两个向量之间角度的正确方法吗?C++ SFML
- 如何使用叉积计算两个 2D 矢量之间的角度
- 创建了一个 deque 类,但无法在我的二叉树类方法中声明
- 无法使用非递归顺序方法遍历二叉树
- C++OpenCV:应用二维卷积的最简单方法是什么
- 特征中的叉积矩阵
- 操作符重载使用*和*=作为点积或叉积
- 这个代码如何从两个2D向量的叉积中检索2D向量
- 二叉搜索树的方法有标准吗?
- 二叉树方法
- 这个代码是逆时针还是顺时针旋转关于叉积的点云
- 寻找一个好的3D空间矢量类,具有点积,叉积和其他常见操作