在列主顺序中重新排序3D向量三元组是缓慢的
reordering 3D vector triplets in column major order is slow
我有很多(x1,y1,z1) (x2,y2,z2) (x3,y3,z3)单精度向量三元组,我想重新排序它们,所以(x1, y1, z1), (z2, x2, y2), (x3, y3, z3)就变成了(x1, x2, x3, 0, y1, y2, y3, 0, z1, z2, z3, 0)
目标是为基于SSE的计算准备数据集。我有下面的代码来做这件事:
for (int i=0;i<count;i++)
{
Vect3F p0 = get_first_point(i);
Vect3F p1 = get_second_point(i);
Vect3F p2 = get_third_point(i);
int idx = i*3;
scratch[idx] = Vec4F(p0.x, p1.x, p2.x, 0); // These 3 rows are the slowest
scratch[idx+1] = Vec4F(p0.y, p1.y, p2.y, 0);
scratch[idx+2] = Vec4F(p0.z, p1.z, p2.z, 0);
}
循环的最后3行非常慢,它们占用了我整个算法90%的时间!
正常吗?我能让这种洗牌更快吗?scratch是一个静态变量,以16行对齐。这个函数被频繁调用,所以我认为的块不应该从缓存中消失。
首先,你不应该创建3个临时向量对象。而不是:
tri = triangles[i];
Vect3F p0 = points[indices[tri]];
Vect3F p1 = points[indices[tri+1]];
Vect3F p2 = points[indices[tri+2]];
你应该使用memcpy()复制数据;为整个集合创建一个循环,并复制原始数据。这是我能想到的最快的方法。
使用3个变量运行了大量的构造函数,这非常慢。由于同样的原因,第二种方法(来自注释)也没有好到哪里去。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何在C++中仅使用迭代器正确迭代 3D 向量?
- 根据组件 1、2(和 3)对空间 (2D/3D) 向量进行排序
- C 计算两个3D向量之间的角度(0至360)
- 在规范化 3d 向量时,在调用 sqrt 之前检查可以节省多少
- 访问类 c++ 中的 3d 向量
- 基于一行对 3D 向量进行排序(C++,std::sort)
- 2d(3d)坐标的哈希映射(即双精度向量)
- 为什么c++中的3D向量比1D向量占用的内存大?
- 初始化3d向量c++
- 在列主顺序中重新排序3D向量三元组是缓慢的
- 在c++中如何在3D维向量中声明3D维向量
- 动态 3D 数组不适用于我的类(使用向量会更好吗?
- 如何重载3D向量的ostream操作符