Come vettorializzare con gcc?
-
03-07-2019 - |
Domanda
La serie v4 del compilatore gcc
può vettorializzare automaticamente i loop usando il processore SIMD su alcune CPU moderne, come i chip AMD Athlon o Intel Pentium / Core. Come viene fatto?
Soluzione
La pagina originale offre dettagli su come far vettorizzare automaticamente gcc loop, inclusi alcuni esempi:
http://gcc.gnu.org/projects/tree-ssa /vectorization.html
Mentre gli esempi sono fantastici, risulta che la sintassi per chiamare quelle opzioni con l'ultimo GCC sembra essere cambiata un po ', vedi ora:
In breve, le seguenti opzioni funzioneranno per i chip x86 con SSE2, dando un registro di loop che sono stati vettorializzati:
gcc -O2 -ftree-vectorize -msse2 -ftree-vectorizer-verbose=5
Nota che -msse è anche una possibilità, ma vettorializzerà solo i loop usando float, non doppi o ints.
Altri suggerimenti
Esiste un pass gimple (una rappresentazione intermedia di GCC) pass_vectorize
. Questo passaggio consentirà l'auto-vettorializzazione a livello di gimple.
Per abilitare l'autovectorization (GCC V4.4.0), dobbiamo seguire i seguenti passi:
- Indica il numero di parole in un vettore secondo l'architettura di destinazione. Questo può essere fatto definendo la macro
UNITS_PER_SIMD_WORD
. - Le modalità vettoriali possibili devono essere definite in un file separato in genere
<target>-modes.def
. Questo file deve risiedere nella directory in cui risiedono altri file contenenti le descrizioni delle macchine. (Come per lo script di configurazione. Se è possibile modificare lo script, è possibile posizionare il file in qualunque directory si desideri che sia). -
Le modalità da prendere in considerazione per la vettorializzazione secondo l'architettura di destinazione. Ad esempio, 4 parole costituiranno un vettore o otto mezze parole costituiranno un vettore o due parole doppie costituiranno un vettore. I dettagli di questo devono essere menzionati nel file
VECTOR_MODES (INT, 8); /* V8QI V4HI V2SI /
. Ad esempio:
VECTOR_MODES (INT, 16); / V16QI V8HI V4SI V2DI /
VECTOR_MODES (FLOAT, 8); / V4HF V2SF */-O2 -ftree-vectorize
-
Crea la porta. La vettorializzazione può essere abilitata usando le opzioni della riga di comando <=>.