在列主顺序中重新排序3D向量三元组是缓慢的

reordering 3D vector triplets in column major order is slow

本文关键字:向量 3D 三元组 缓慢 排序 顺序 新排序      更新时间:2023-10-16

我有很多(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个变量运行了大量的构造函数,这非常慢。由于同样的原因,第二种方法(来自注释)也没有好到哪里去。