2010-07-29 18 views
13

Estoy buscando el método más eficaz de voltear el signo en los cuatro flotadores empaquetados en un registro SSE.Muestra de volteo en flotadores SSE empaquetados

No he encontrado una intrínseca para hacer esto en el manual de desarrollo del software Intel Architecture. A continuación están las cosas que ya he intentado.

Para cada caso hice un bucle sobre el código 10 mil millones de veces y obtuve el tiempo de pared indicado. Estoy tratando de al menos coincidir con 4 segundos. Se necesita mi enfoque que no sea SIMD, que solo utiliza el operador unario negativo.


[48 seg]
_mm_sub_ps(_mm_setzero_ps(), vec);


[32 seg]
_mm_mul_ps(_mm_set1_ps(-1.0f), vec);


[9 seg]

union NegativeMask { 
    int intRep; 
    float fltRep; 
} negMask; 
negMask.intRep = 0x80000000; 

_mm_xor_ps(_mm_set1_ps(negMask.fltRep), vec); 


El compilador es gcc 4.2 con -O3 . La CPU es un Intel Core 2 Duo.

Respuesta

4

sólo para completar su respuesta propia de la documentación gcc sobre estos vectores incorporadas:

The types defined in this manner can be used with a subset of normal C 
operations. Currently, GCC will allow using the following operators on 
these types: `+, -, *, /, unary minus, ^, |, &, ~'. 

Es probablemente una buena idea ceñirse siempre a estos cuando sea posible. Con muchas posibilidades, gcc siempre proporcionará el código más eficiente para este material SSE.

Para las opciones del compilador, agregue algo más específico a su arquitectura, algo como -march=native lo hará en la mayoría de los casos.

2

Una lección de vida acerca de la codificación hasta las 3 de la mañana .....

Nunca trató simplemente utilizando el menos unario en mi vector de empaquetado. Eso realmente compila y tiene exactamente el mismo rendimiento que el enfoque que no es SIMD.

+5

Sin embargo, Aviso - usando extensiones-gcc específica como esta esto hace que su código no portátil. –

+0

¿miró el código que esto genera? – Aktau

21

Esa unión no es realmente necesario, mejor de los mundos (legibilidad, velocidad y portabilidad):

_mm_xor_ps(vec, _mm_set1_ps(-0.f))