GCC vector extensions offre un modo piacevole e abbastanza portatile per accedere ad alcune istruzioni SIMD su diverse architetture hardware senza ricorrere a hardware specific intrinsics (o auto-vettorizzazione).Caricamento dati per estensioni vettoriali GCC
Un caso di utilizzo reale, sta calcolando un semplice checksum additivo. L'unica cosa che non è chiara è come caricare in sicurezza i dati in un vettore.
typedef char v16qi __attribute__ ((vector_size(16)));
static uint8_t checksum(uint8_t *buf, size_t size)
{
assert(size%16 == 0);
uint8_t sum = 0;
vec16qi vec = {0};
for (size_t i=0; i<(size/16); i++)
{
// XXX: Yuck! Is there a better way?
vec += *((v16qi*) buf+i*16);
}
// Sum up the vector
sum = vec[0] + vec[1] + vec[2] + vec[3] + vec[4] + vec[5] + vec[6] + vec[7] + vec[8] + vec[9] + vec[10] + vec[11] + vec[12] + vec[13] + vec[14] + vec[15];
return sum;
}
Casting un puntatore al tipo di vettore sembra funzionare, ma io sono preoccupato che questo potrebbe esplodere in modo orribile se SIMD hardware si aspetta che i tipi di vettore da allineare correttamente.
L'unica altra opzione che ho pensato è usare un vettore temporaneo e caricare esplicitamente i valori (tramite una memcpy o un assegnamento element-wise), ma nel test questo contrasta la maggior parte dell'uso accelerato delle istruzioni SIMD. Idealmente immagino che si tratti di una generica funzione __builtin_load()
, ma nessuna sembra esistere.
Qual è un modo più sicuro di caricare i dati in un vettore che mette in pericolo i problemi di allineamento?
L'esecuzione di questo sulla memoria non allineata su GCC x86_64 causerà un SIGSEGV quando la CPU tenta di caricare la memoria non allineata in un registro SSE. Un'opzione ragionevole sembra essere solo memoria di checksum allineata o utilizzare un ciclo normale per sommare i byte fino al primo limite di 16 byte. – dcoles
Nel tuo codice corrente, il caricamento dei dati in realtà viene compilato correttamente se il compilatore conosce l'input (ma la somma è errata): https://godbolt.org/g/DeR3Qv. Non è così bello senza la conoscenza dell'input: https: // Godbolt.org/g/LxEkhp – ZachB