У меня есть большой кусок кода, часть тела которого содержит этот кусок кода:
result = (nx * m_Lx + ny * m_Ly + m_Lz) / sqrt(nx * nx + ny * ny + 1);
, который я векторизовал следующим образом (все уже float
):
__m128 r = _mm_mul_ps(_mm_set_ps(ny, nx, ny, nx),
_mm_set_ps(ny, nx, m_Ly, m_Lx));
__declspec(align(16)) int asInt[4] = {
_mm_extract_ps(r,0), _mm_extract_ps(r,1),
_mm_extract_ps(r,2), _mm_extract_ps(r,3)
};
float (&res)[4] = reinterpret_cast<float (&)[4]>(asInt);
result = (res[0] + res[1] + m_Lz) / sqrt(res[2] + res[3] + 1);
Результат верный; однако мой бенчмаркинг показывает, что векторизованная версия медленнее :
- Не векторизованная версия занимает 3750 мс
- Векторизованная версия занимает 4050 мс
- Установка
result
на 0
напрямую (и полное удаление этой части кода) сокращает весь процесс до 2500 мс
Учитывая, что векторизованная версия содержит только один набор умножений SSE (вместо четырех отдельных умножений FPU), почему она медленнее? Действительно ли FPU быстрее SSE, или здесь есть смешанная переменная?
(я нахожусь на мобильном Core i5.)