2015-10-07 19 views
5

Ho avuto una domanda sulla nuova opzione allineata in OpenMP. Questo è nel contesto del suo utilizzo con #pragma omp simd aligned(a:n)Opzione allineata OpenMP 4?

Dire che ho un array di numeri interi che ho allocato usando posix_memalign quindi so che l'array si avvia diciamo un limite di 32 byte. Ora diciamo che voglio quadrare ogni valore in quell'array. Posso dire ...

int* array = { some array of length len aligned to 32 bytes }; 
#pragma omp simd aligned(array:32) 
for(int i = 0; i < len; i++) 
    array[i] *= array[i]; 

È un presupposto sicuro? Oppure allineato implica anche che il tipo di dati delle dimensioni che sto usando (int) nell'array è un multiplo di 32 byte? Un po 'come come l'attributo ((allineato (32)) in gcc farà il tipo di larghezza di almeno 32 byte.

+0

32 byte -> 32 bit –

+0

Sì, questo è esattamente ciò che significa allineare a 32 byte. – NoseKnowsAll

+1

OP significa 32 byte, presumibilmente perché questa è la lunghezza di SIMD a 256 bit, ad es. AVX-2. – Jeff

risposta

3

Per assicurarsi che ci siamo capiti, supponiamo che il tuo array è infatti 256bit allineato (che è equivalente al tuo allineamento di 32 byte)

Quindi, sì, il tuo #pragma omp simd aligned(array:32) è sicuro, indipendentemente dalla lunghezza dell'array o dalla dimensione del tipo dell'array. L'unica cosa che conta è l'indirizzo indicato da il "puntatore" utilizzato per fare riferimento all'array


EDIT: Mi sono reso conto che la mia risposta, anche se corretta, era un po 'secca dato che ero solo io a rispondere, ma senza alcun supporto "ufficiale" per questo. Quindi, ecco alcuni stralci della norma per sostenere la mia risposta:

Dal OpenMP 4.0 standard §2.8.1:

[C/C++: La clausola allineato dichiara che l'oggetto a cui ogni punti di voci di elenco è allineato al numero di byte espressi nel parametro facoltativo della clausola allineata.]

Il parametro facoltativo della clausola allineata, allineamento, deve essere un'espressione intera positiva costante di . Se non è specificato alcun parametro opzionale , si presuppongono gli allineamenti predefiniti definiti dall'implementazione per le istruzioni SIMD sulle piattaforme di destinazione.

[...]

[C: il tipo di voci di elenco che appaiono nella clausola deve essere allineato array o puntatore.]

[C++: il tipo di voci di elenco che appare nella clausola deve essere allineato array, puntatore, il riferimento a matrice, o il riferimento a puntatore.]

Come si può vedere, non ci sono ipotesi sul tipo di dati puntati o referenziati dalla variabile utilizzata all'interno della clausola aligned. L'unica ipotesi è che l'indirizzo del segmento di memoria puntato sia allineato al parametro opzionale o ad alcuni "allineamenti predefiniti definiti dall'implementazione" (che BTW mi incoraggia fortemente a dare sempre questo parametro opzionale poiché non ho idea di cosa sia questo il valore predefinito definito dall'implementazione potrebbe essere, e più precisamente, se sarò sicuro che il mio array sia allineato in questo modo).

3

aligned(ptr:n) indica al compilatore che la matrice dietro ptr inizia da un indirizzo allineato a n byte. Ciò aiuta il compilatore a decidere come vettorizzare in modo ottimale il ciclo. Dal momento che molte unità vettoriali richiedono che i carichi vettoriali e gli archivi siano allineati, se il compilatore non può inferire l'allineamento dei dati al momento della compilazione, deve generare un codice runtime che controlli l'allineamento e alla fine esegua le porzioni non allineate del ciclo (sia sul inizio e alla fine dello spazio di iterazione) usando le istruzioni scalari. Questi controlli richiedono molto tempo, soprattutto in termini di lunghezze di array più piccole. Se il corretto allineamento è noto al momento della compilazione, il compilatore può emettere direttamente le operazioni scalari necessarie. Con AVX-512 (Intel Xeon Phi) i carichi e gli store non allineati vengono eseguiti utilizzando il mascheramento e fornendo l'allineamento corretto consente al compilatore di emettere direttamente le istruzioni mascherate come necessario invece di calcolare le maschere in fase di esecuzione.

+0

Carichi e negozi non allineati non sono un problema per i core x86 da Nehalem (2008). –

+0

Non sono lunghi quanto non causano la divisione della linea della cache, sebbene siano molto più economici su Nehalem rispetto alle precedenti microarchitettura x86. Ad ogni modo, il mio commento sulla generazione del codice è generale - il compilatore è libero di ignorare la clausola di allineamento data una particolare architettura. –

+0

Risulta che l'allineamento conta più di quanto non lo sia da Nehalem. Puoi leggere su di esso nella mia risposta qui (con diverse correzioni) http://stackoverflow.com/questions/33504003/how-to-write-c-code-that-the-compiler-can-efficiently-compile-to- SSE-o-AVX/33518813 # 33518813 –