Um sicherzustellen, dass wir einander verstehen, nehmen wir an, Ihre array
ist in der Tat 256bit ausgerichtet (die entspricht Ihrer 32-Byte-Ausrichtung)
Dann ist Ihr #pragma omp simd aligned(array:32)
sicher, unabhängig von der Länge des Arrays oder der Größe des Array-Typs, es kommt nur auf die Adresse an, auf die verwiesen wird der "Zeiger", der verwendet wird, um das Array zu referenzieren.
EDIT: Ich erkannte, dass meine Antwort, obwohl korrekt, etwas trocken war, da ich nur antwortete, aber ohne "offizielle" Unterstützung dafür. Hier sind einige Auszüge aus dem Standard meine Antwort zu erhalten:
Von dem OpenMP 4.0 standard §2.8.1:
[C/C++: Die ausgerichtete Klausel erklärt, dass das Objekt, zu dem jeweils Listenelement Punkte ausgerichteten auf die Anzahl der Bytes, die im optionalen Parameter der ausgerichteten Klausel ausgedrückt werden.]
Der optionale Parameter der aligned-Klausel, alignment, muss ein konstanter positiver ganzzahliger Ausdruck sein. Wenn kein optionaler Parameter angegeben ist, werden implementierungsdefinierte Standardausrichtungen für SIMD Anweisungen auf den Zielplattformen angenommen.
[...]
[C: Die Art der Listenelemente in der ausgerichteten Klausel erscheinen müssen Array oder Zeiger sein.]
[C++: Die Art der Listenelemente in der ausgerichteten Klausel erscheinen müssen Array, Zeiger, Bezug auf Array, oder Verweis auf Zeiger.]
Wie Sie sehen können, gibt es keine Annahmen über den Typ der Daten, auf die die Variable innerhalb der aligned
-Klausel zeigt oder auf die verwiesen wird. Die einzige Annahme ist, dass die Adresse des Speichersegments auf den optionalen Parameter oder auf einige "implementationsdefinierte Standardausrichtungen" ausgerichtet ist (was BTW ausdrücklich dazu ermutigt, diesen optionalen Parameter immer anzugeben, da ich keine Ahnung habe, was das ist Implementation-definierten Standardwert könnte sein, und mehr auf den Punkt, ob ich sicher sein werde, dass mein Array tatsächlich auf diese Weise ausgerichtet ist).
32 Bytes -> 32 Bits –
Ja, genau das ist die Ausrichtung auf 32 Bytes. – NoseKnowsAll
OP bedeutet 32 Bytes, vermutlich weil das die Länge von 256 Bit SIMD ist, z.B. AVX-2. – Jeff