我有很多(x1,y1,z1),(x2,y2,z2),(x3,y3,z3)单精度 vector 三元组,我想对其重新排序,所以
(x1,y1,z1),(x2,y2,z2),(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%的时间!

正常吗我可以更快地进行这种洗牌吗?
(暂存器是一个静态变量,并且是16对齐的。经常调用该函数,因此我认为暂存器块不应从高速缓存中消失。)

最佳答案

首先,您不应创建3个临时 vector 对象。
代替:

tri = triangles[i];
Vect3F p0 = points[indices[tri]];
Vect3F p1 = points[indices[tri+1]];
Vect3F p2 = points[indices[tri+2]];

您应该只使用memcpy()复制数据;进行遍历整个集合并复制原始数据的循环。这是我能想到的最快的方法。

使用3个变量会运行许多构造函数,而这些构造函数的速度很慢。出于相同的原因,第二种方法(从评论中)并没有好得多。

10-04 14:59