У меня есть код, который работает с 4D-векторами, и в настоящее время я пытаюсь преобразовать его в SSE. Я использую как clang, так и gcc на 64b linux.
Работа только на векторах - все это прекрасно. Но теперь приходит часть, где мне нужно умножить целый вектор на одну константу - Что-то вроде этого:
float y[4];
float a1 = 25.0/216.0;
for(j=0; j<4; j++){
y[j] = a1 * x[j];
}
примерно так:
float4 y;
float a1 = 25.0/216.0;
y = a1 * x;
где:
typedef double v4sf __attribute__ ((vector_size(4*sizeof(float))));
typedef union float4{
v4sf v;
float x,y,z,w;
} float4;
Это, конечно, не сработает, потому что я пытаюсь сделать умножение несовместимых типов данных.
Теперь я могу сделать что-то вроде: float4 a1 = (v4sf){25.0/216.0, 25.0/216.0, 25.0/216.0, 25.0/216.0}
но просто заставляет меня чувствовать себя глупо, даже если я напишу макрос, чтобы сделать это.
Кроме того, я уверен, что это не приведет к очень эффективному коду.
Googling это не дало четких ответов (см. Загрузка констант поплавков в регистры SSE).
Итак, что является лучшим способом для умножения целого вектора на ту же константу?