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

时间:2011-10-29 01:08:01

标签: c++ c sse simd

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

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

1 个答案:

答案 0 :(得分:1)

首先,你不应该创建3个临时矢量对象。 而不是:

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

您应该使用memcpy()复制数据;制作适合整个集合的循环并复制原始数据。这是我能想到的最快的方式。

使用3个变量会运行很多构造函数,这些构造函数很慢。第二种方式(来自评论)出于同样的原因并没有那么好。