В моем коде есть несколько вложенных циклов for, и я пытаюсь использовать инструкции Intel SSE на ядре Intel i7 для ускорения работы приложения.
Структура кода следующая (val задается в более высоком цикле for):
_m128 in1,in2,tmp1,tmp2,out;
float arr[4] __attribute__ ((aligned(16)));
val = ...;
... several higher for loops ...
for(f=0; f<=fend; f=f+4){
index2 = ...;
for(i=0; i<iend; i++){
for(j=0; j<jend; j++){
inputval = ...;
index = ...;
if(f<fend-4){
arr[0] = array[index];
arr[1] = array[index+val];
arr[2] = array[index+2*val];
arr[3] = array[index+3*val];
in1 = _mm_load_ps(arr);
in2 = _mm_set_ps1(inputval);
tmp1 = _mm_mul_ps(in1, in2);
tmp2 = _mm_loadu_ps(&array2[index2]);
out = _mm_add_ps(tmp1,tmp2);
_mm_storeu_ps(&array2[index2], out);
} else {
//if no 4 values available for SSE instruction execution execute serial code
for(int u = 0; u < fend-f; u++ ) array2[index2+u] += array[index+u*val] * inputval;
}
}
}
}
Я думаю, что есть две основные проблемы: буфер, используемый для выравнивания значений из 'массива', и тот факт, что когда не осталось 4 значения (например, когда fend = 6, осталось два значения, которые должны быть выполнены с помощью последовательный код). Есть ли другой способ загрузки значений из in1 и / или выполнения операций SSE с 3 или 2 значениями?
Спасибо за ответы. Я думаю, что загрузка так же хороша, как и получается, но есть ли обходной путь для части 'Остаток' внутри оператора else, который можно решить с помощью инструкций SSE?