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).
32 byte -> 32 bit –
Sì, questo è esattamente ciò che significa allineare a 32 byte. – NoseKnowsAll
OP significa 32 byte, presumibilmente perché questa è la lunghezza di SIMD a 256 bit, ad es. AVX-2. – Jeff