Cómo vectorizar con gcc?
loops simd (2)
La serie v4 del compilador gcc
puede vectorizar automáticamente bucles utilizando el procesador SIMD en algunas CPU modernas, como los chips AMD Athlon o Intel Pentium / Core. ¿Cómo se hace esto?
Hay un gimple (una Representación Intermedia de GCC) pase pass_vectorize
. Este pase permitirá la auto-vectorización en el nivel de gimple.
Para habilitar la autovectorización (GCC V4.4.0), debemos seguir los siguientes pasos:
- Mencione el número de palabras en un vector según la arquitectura de destino. Esto se puede hacer definiendo la macro
UNITS_PER_SIMD_WORD
. - Los modos vectoriales que son posibles deben definirse en un archivo separado, generalmente
<target>-modes.def
. Este archivo debe residir en el directorio donde residen otros archivos que contienen las descripciones de la máquina. (Según el script de configuración. Si puede cambiar el script, puede colocar el archivo en el directorio en que lo desee). Los modos que deben tenerse en cuenta para la vectorización según la arquitectura de destino. Al igual, 4 palabras constituirán un vector u ocho medias palabras constituirán un vector o dos palabras dobles constituirán un vector. Los detalles de esto deben mencionarse en el archivo
<target>-modes.def
. Por ejemplo:VECTOR_MODES (INT, 8); /* V8QI V4HI V2SI /
VECTOR_MODES (INT, 16); / V16QI V8HI V4SI V2DI /
VECTOR_MODES (FLOAT, 8); / V4HF V2SF */Construye el puerto. La vectorización se puede habilitar usando las opciones de línea de comando
-O2 -ftree-vectorize
.
Esta página ofrece detalles sobre cómo obtener gcc para vectorizar automáticamente bucles, incluidos algunos ejemplos:
http://gcc.gnu.org/projects/tree-ssa/vectorization.html
En resumen, las siguientes opciones funcionarán para los chips x86 con SSE2, dando un log de bucles que se han vectorizado:
gcc -O2 -ftree-vectorize -msse2 -ftree-vectorizer-verbose=5
Tenga en cuenta que -msse también es una posibilidad, pero solo vectorizará bucles utilizando flotantes, no dobles o enteros.