переупорядочивание 3D векторных триплетов в основном порядке колонок происходит медленно

У меня есть множество (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 не должны исчезать из кэша.)

7
задан Chris says Reinstate Monica 7 November 2011 в 20:40
поделиться