c gcc x86 sse simd

Comenzando con SSE



gcc x86 (3)

Quiero aprender más sobre el uso de SSE .

¿Qué formas hay para aprender, además de la lectura obvia de los manuales del desarrollador de software Intel® 64 e IA-32 Architectures ?

Principalmente estoy interesado en trabajar con las funciones incorporadas GCC X86 .


¡Considero que las guías de investigación y optimización del Dr. Agner Fog son muy valiosas! También tiene algunas bibliotecas y herramientas de prueba que aún no he probado. http://www.agner.org/optimize/


Como solicitó recursos:

Una guía práctica para usar SSE con C ++ : una buena descripción conceptual sobre cómo usar SSE de manera efectiva, con ejemplos.

Listado de MSDN de Intrinsics del compilador : referencia completa para todas sus necesidades intrínsecas. Es MSDN, pero prácticamente todas las características intrínsecas enumeradas aquí también son compatibles con GCC e ICC.

Página SSE de Christopher Wright : Referencia rápida sobre los significados de los códigos de operación de SSE. Supongo que los Manuales de Intel pueden cumplir la misma función, pero esto es más rápido.

Probablemente sea mejor escribir la mayor parte de tu código en intrínsecos, pero verifica el objdump de la salida de tu compilador para asegurarte de que está produciendo un código eficiente. La generación de código SIMD sigue siendo una tecnología bastante nueva y es muy posible que el compilador pueda equivocarse en algunos casos.


En primer lugar, no recomiendo usar las funciones incorporadas, ya que no son portátiles (en compiladores del mismo arco).

Use intrinsics , GCC hace un trabajo maravilloso optimizando las características intrínsecas de SSE en un código aún más optimizado. Siempre puede echar un vistazo al ensamblaje y ver cómo usar SSE para aprovechar todo su potencial.

Los intrínsecos son fáciles, al igual que las llamadas a funciones normales:

#include <xmmintrin.h> __m128 vector1 = _mm_set1_ps(4, 3, 2, 1); // Little endian, stored in ''reverse'' __m128 vector2 = _mm_set1_ps(7, 8, 9, 0); // Addition __m128 result = _mm_add_ps(vector1, vector2); // result = vector1 + vector 2 // A more advanced function, called shuffle vector1 = _mm_shuf_ps(vector1, vector1, _MM_SHUFFLE(0,1,2,3)); // vector1 is now (1, 2, 3, 4) (above shuffle reversed it)

Por supuesto, hay muchas más opciones, la SSE es realmente poderosa y, en mi opinión, relativamente fácil de aprender.