tutorial smart programar para introduccion inteligentes inteligente ejemplos crear contratos contrato c++ floating-point sse simd addition

c++ - smart - programar contratos inteligentes



AƱadiendo los componentes de un registro SSE. (3)

Quiero agregar los cuatro componentes de un registro SSE para obtener un solo flotante. Así es como lo hago ahora:

float a[4]; _mm_storeu_ps(a, foo128); float x = a[0] + a[1] + a[2] + a[3];

¿Hay alguna instrucción SSE que logre esto directamente?


Bueno, no conozco ninguna de estas funciones, pero se puede hacer usando _mm_hadd_ps () dos veces.


Probablemente podría usar la instrucción HADDPS SSE3, o su compilador intrínseco _mm_hadd_ps ,

Por ejemplo, consulte http://msdn.microsoft.com/en-us/library/yd9wecaa(v=vs.80).aspx

Si tienes dos registros v1 y v2:

v = _mm_hadd_ps(v1, v2); v = _mm_hadd_ps(v, v);

Ahora, v [0] contiene la suma de los componentes de v1, y v [1] contiene la suma de los componentes de v2.


Si desea que su código funcione en CPU pre-SSE3 (que no son compatibles con _mm_hadd_ps), puede usar el siguiente código. Utiliza más instrucciones, pero decodifica a menos microops en la mayoría de las CPU.

__m128 temp = _mm_add_ps(_mm_movehl_ps(foo128, foo128), foo128); float x; _mm_store_ss(&x, _mm_add_ss(temp, _mm_shuffle_ps(temp, 1)));