Я попытался перенести код из FANN Lib (нейронная сеть, написанная на C) на SSE2.
Но производительность SSE2 ухудшилась по сравнению с обычным кодом. В моей реализации SSE2 один запуск занимает 5,50 мин без 5,20 мин.
Как SSE2 может работать медленнее, чем обычный? Может ли это быть из-за _mm_set_ps
? Я использую компилятор Apple LLVM (XCode 4) для компиляции кода (все флаги расширения SSE включены, уровень оптимизации -Os
).
Код без SSE2
neuron_sum +=
fann_mult(weights[i], neurons[i].value) +
fann_mult(weights[i + 1], neurons[i + 1].value) +
fann_mult(weights[i + 2], neurons[i + 2].value) +
fann_mult(weights[i + 3], neurons[i + 3].value);
код SSE2
__m128 a_line=_mm_loadu_ps(&weights[i]);
__m128 b_line=_mm_set_ps(neurons[i+3].value,neurons[i+2].value,neurons[i+1].value,neurons[i].value);
__m128 c_line=_mm_mul_ps(a_line, b_line);
neuron_sum+=c_line[0]+c_line[1]+c_line[2]+c_line[3];