У меня есть большой фрагмент кода, часть тела которого содержит этот фрагмент кода:
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);
Результат правильный, однако мой тест показывает, что векторизованная версия на медленнее :
результата
на 0
напрямую (и полное удаление этой части кода) сокращает весь процесс до 2500 мс Учитывая, что векторизованная версия содержит только один набор умножений SSE (вместо четырех отдельных умножений FPU), почему он медленнее? Действительно ли FPU быстрее, чем SSE, или здесь есть мешающая переменная?
(Я на мобильном телефоне Core i5.)