SSE медленнее, чем FPU?

У меня есть большой фрагмент кода, часть тела которого содержит этот фрагмент кода:

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 мс
  • Установка результата на 0 напрямую (и полное удаление этой части кода) сокращает весь процесс до 2500 мс

Учитывая, что векторизованная версия содержит только один набор умножений SSE (вместо четырех отдельных умножений FPU), почему он медленнее? Действительно ли FPU быстрее, чем SSE, или здесь есть мешающая переменная?

(Я на мобильном телефоне Core i5.)

9
задан Paul R 13 January 2012 в 08:46
поделиться