que tienen una gran pieza de código, parte de cuyo cuerpo contiene este pedazo de código:SSE más lento que FPU?
result = (nx * m_Lx + ny * m_Ly + m_Lz)/sqrt(nx * nx + ny * ny + 1);
que he vectorizado de la siguiente manera (todo lo que ya es un 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);
El resultado es correcto; sin embargo, mi evaluación comparativa muestra que la versión vectorizada es lento:
- La versión no vectorizado toma 3750 ms
- La versión vectorizada lleva a 4050 ms
- Configuración
result
-0
directamente (y la eliminación de esta parte del código completo) reduce todo el proceso a 2500 ms
Dado que la versión vectorizada sólo contiene uno conjunto de multiplicaciones de SSE (en lugar de cuatro multiplicaciones de FPU individuales), ¿por qué es más lento? ¿Es efectivamente la FPU más rápida que la SSE, o hay una variable de confusión aquí?
(estoy en un Core i5 móvil.)
Hace un tiempo que no veía una pregunta de SSE en SO. Supongo que todos volverán de las vacaciones.:) – Mysticial
@Mysticial: LOL. xD – Mehrdad