2009-03-19 21 views
53

¿Hay un tutorial simple para que pueda ponerme al día en SSE, SSE2 y SSE3 en GNU C++? ¿Cómo se puede optimizar el código en SSE?SSE SSE2 y SSE3 para GNU C++

+4

escribí una biblioteca para realizar optimizaciones SSE2 fácil - https://github.com/LiraNuna/glsl -sse2 – LiraNuna

+0

Encontré esta [publicación de blog] (http://minchechiu.blogspot.com/2009/05/sse.html) con muchos enlaces de alta calidad en SSE. – Philip

+0

Encontré un documento interesante aquí: http://ds9a.nl/gcc-simd/index.html –

Respuesta

57

Lo siento no sé de un tutorial.

Su mejor opción (en mi humilde opinión) es usar SSE a través de las funciones "intrínsecas" que Intel proporciona para envolver (generalmente) instrucciones de SSE únicas. Están disponibles a través de un conjunto de archivos de inclusión llamados * mmintrin.h, por ejemplo, xmmintrin.h es el conjunto de instrucciones de SSE original.

Comience familiarizado con los contenidos de la Optimización de Intel Reference Manual es una buena idea (consulte la sección 4.3.1.2 para ver un ejemplo de intrínsecos) y las secciones SIMD son esenciales para la lectura. Los manuales de referencia del conjunto de instrucciones también son útiles, ya que la documentación de cada instrucción incluye la función "intrínseca" a la que corresponde.

hacer pasar algún tiempo inspeccionando el ensamblador generado por el compilador de los intrínsecos (que aprenderá mucho) y en la medición de perfiles/rendimiento (podrás evitar el desperdicio de código de tiempo SSE-ción de poco rendimiento en el esfuerzo)

Actualización 2011-05-31: Hay algunos muy agradable la cobertura de los intrínsecos y vectorización en Agner de Niebla optimization PDFs (thanks) aunque es un poco la voz acerca de (por ejemplo, la sección 12 de la first one y la sección 5 de la second one) . Estos no son exactamente material tutorial (de hecho hay una advertencia de "estos manuales no son para principiantes") pero tratan correctamente a SIMD (ya sea mediante asm, intrinsics o vectorización de compilador) como solo una parte de la caja de herramientas de optimización más grande.

Actualización 2012-10-04: A nice little Linux Journal article en gcc vector intrinsics merece una mención aquí. Más general que solo SSE (cubre extensiones PPC y ARM también). Hay una buena colección de referencias en el last page, que me llamó la atención sobre el "intrinsics manual" de Intel.

8

Eche un vistazo a las opciones -mtune y -march, -msse * y -mfpmath, por supuesto. Todos ellos permiten a GCC realizar optimizaciones específicas de SSE.

Cualquier cosa más allá de eso es el reino de Assembler, me temo.

GCC Online Manual - i386 and x86_64 Options

+5

No se necesita ensamblador. GCC tiene extensiones para admitir tipos de datos especiales y "llamadas a funciones" para usar MMX/SSE. –

+1

Es cierto que estas son envolturas delgadas para el ensamblaje, por lo que si no puede programar SSE en asm, las extensiones no lo ayudarán mucho. –

+7

En realidad, los intrínsecos son más que solo envoltorios alrededor del ensamblaje. Permiten al compilador reorganizar su código para obtener el máximo rendimiento. Pero necesitas tener una buena comprensión de cómo funciona SIMD. –

1

Una explicación sencilla? No que yo sepa.

Pero cualquier información sobre el uso de MMX o cualquier versión de SSE será útil para aprender, ya sea para GCC o para ICC o VC.

Para obtener información sobre las extensiones vectoriales de GCC, escriba "info gcc" y vaya a Nodo: Extensiones de vectores.

19

La optimización más simple para usar es permitir que gcc emita código SSE.

Banderas: -msse, -msse2, -msse3, -march =, -mfpmath = sse

Para una lista más concisa sobre 386 opciones, ver http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options, más documentación exacta para su versión específica del compilador está ahí: http://gcc.gnu.org/onlinedocs/.

Para la optimización, siempre echa un vistazo a Agner Fog's: http://agner.org/optimize/.Creo que no tiene tutoriales de SSE para intrínsecos, pero tiene algunos trucos de std-C++ realmente buenos y también proporciona mucha información sobre la codificación del ensamblaje SSE (que a menudo se puede transcribir a intrínsecos).

+0

'-mftree-vectorize' dará como resultado SSE también. – LiraNuna

+2

No necesariamente. Del manual: "Realice la vectorización de bucle en árboles. Esta marca está habilitada de forma predeterminada en -O3." Por lo tanto, el indicador no menciona una plataforma específica (también podría procesar múltiples bytes en registros estándar de 32 bits). –

3

MSDN tiene una descripción bastante buena de los compiladores de SSE incorporados (y los complementos son de facto estándar, incluso funcionan en clang/XCode).

Lo bueno de que la referencia es que muestra pseudocódigo equivalente, por lo que, por ejemplo, usted puede aprender que ADDPD instrucción es:

r0 := a0 + b0 
r1 := a1 + b1 

Y aquí está buena descripción de una instrucción de reproducción aleatoria críptica: http://www.songho.ca/misc/sse/sse.html