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