Il vantaggio di usare __attribute __ ((aligned ()))

4

Ho trovato in più di un programma SIMD l'istruzione __attribute__((aligned(16))) . Quando ho cercato una spiegazione ho trovato

The keyword attribute allows you to specify special attributes of variables or structure fields.

Apparentemente le variabili hanno attributi. Questi attributi sono specifici della lingua? quali attributi può avere una variabile? dove sono memorizzati questi attributi? Riguardo al soggetto di allineato (16), l'ho trovato

causes the compiler to allocate [a variable] on a 16-byte boundary

Ma è obbligatorio che le variabili SIMD ( m128i per esempio) siano allineate su 16 byte? Se sì, suppongo che questo sia il motivo per cui usiamo __attribute ((aligned (16))) in questo modo:

int a[16] __attribute__((aligned(16))) = {  1,  2,  3,  4,  5,  6,  7, 8,  9, 10, 11, 12, 13, 14, 15, 16 };

__vector signed int *va = (__vector signed int *) a;
    
posta user2651062 13.09.2014 - 07:50
fonte

1 risposta

5

Gli attributi come sopra sono un'estensione (allo standard C99 specifiche della lingua) fornite da GCC (e alcune altre compilatori, ad es. Clang / LLVM ). L'attributo aligned costringe il compilatore ad allineare quella variabile (la tua matrice a ) con l'allineamento specificato. La documentazione GCC elenca gli attributi che puoi fornire e potresti persino estendere il tuo compilatore GCC (con qualche plugin o qualche MELT estensione, tuttavia MELT è stato abbandonato nel 2017) per aggiungere i tuoi attributi aggiuntivi.

Questo __attribute__((aligned(16))) è davvero utile (su x86-64) per le istruzioni vettoriali come SSE3 o AVX , poiché allinea con 16 byte la tua matrice a . Dovrebbe consentire al compilatore di ottimizzazione di generare un codice macchina più efficiente. (Probabilmente dovrai anche dare alcuni flag di ottimizzazione come -mtune=native -O3 a gcc ). Quindi utilizzarlo è utile (ma non obbligatorio) per il codice "SIMD".

Gli attributi sono annotazioni in fase di compilazione. Ovviamente cambiano il comportamento del compilatore, ma tali attributi non esistono al momento dell'esecuzione (come non esistono nemmeno i tipi C in runtime).

Se non hai allineato la tua matrice a , suppongo che il compilatore debba emettere istruzioni aggiuntive e che funzionino più lentamente. A proposito, potresti compilare con gcc -O3 -fverbose-asm -S (e altri flag di ottimizzazione ) e, guardando all'interno del codice assembly generato, vedere quale modifica l'uso di quell'attributo nel codice assembly emesso. Puoi anche confrontare la tua applicazione (su Linux, vedi ora (1) e tempo (7) ...)

    
risposta data 13.09.2014 - 08:00
fonte

Leggi altre domande sui tag