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