Speicher Ausrichtung von arrays
Ich habe Probleme bei der Angleichung der Speicher für DMA-transfer auf den Cell-Prozessor. Ich brauche die letzten 4 bit der Adresse auf 0 ein.
Ich habe 4 arrays von unsigned int
wo jedes element muss ausgerichtet im Speicher, so dass seine (hex) Adresse endet mit einer null.
E. g.
int main()
{
size_t i;
static unsigned int a[2] __attribute__ ((aligned (16)));
static unsigned int b[2] __attribute__ ((aligned (16)));
static unsigned int c[2] __attribute__ ((aligned (16)));
static unsigned int d[2] __attribute__ ((aligned (16)));
for (i = 0; i < 2; ++i) {
printf("a[%u] = %p\n", &a[i]);
printf("b[%u] = %p\n", &b[i]);
printf("c[%u] = %p\n", &c[i]);
printf("d[%u] = %p\n", &d[i]);
}
return 0;
}
Ausgabe:
a[0] = 0x10010b60
b[0] = 0x10010b50
c[0] = 0x10010b40
d[0] = 0x10010b30
a[1] = 0x10010b64
b[1] = 0x10010b54
c[1] = 0x10010b44
d[1] = 0x10010b34
Hier das problem, dass das 2. element jedes array scheint es nicht zu sein, 16-bit-ausgerichtet (Ihre Adresse' - Ende mit einem 4).
Brauche ich die Adressen, die wie folgt Aussehen:
a[0] = 0xXXXXXXX0
b[0] = 0xXXXXXXX0
c[0] = 0xXXXXXXX0
d[0] = 0xXXXXXXX0
a[1] = 0xXXXXXXX0
b[1] = 0xXXXXXXX0
c[1] = 0xXXXXXXX0
d[1] = 0xXXXXXXX0
(aligned (16))
bedeutet " ausrichten auf 16-byte-Grenzen.- Die Adressen, die Sie haben wollen, enden mit 0. Das heißt, Sie müssen 16-byte-alignment, nicht 16-bit-Ausrichtung. Nur eine Korrektur
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ausrichtung-Attribut spezifiziert die Ausrichtung des Variablen oder Struktur Felder, nicht einzelne array-Elemente. Sehen Die Angabe der Attribute von Variablen für details.
Wenn Sie immer ausrichten wollen zwei ganze zahlen zusammen, können Sie definieren eine Struktur
Diese richtet die Elemente auf 16 byte-Grenzen.
gibt, z.B.
Aber das bedeutet auch, dass Sie Löcher zwischen den beiden integer-Werte. Auf einem 32-bit system hast, musst du
Wenn
arr
ist ein array von 32-bit-Elemente, und die Adressearr[0]
ist0xXXXXXXX0
, dann die Adressearr[1]
unbedingt0xXXXXXXX4
.Für Ihren Zweck, Sie benötigen, um arrays von 16-byte-Elemente:
Alternativ kannst du auch einfach unterlassen, die Verwendung von arrays zusammen.
Verwenden Sie stattdessen die einfachen Variablen, und sagen Sie den compiler an, richten Sie Sie auf 16-bytes:
Ich glaube nicht, dass Sie tun können, dass ... Sie versuchen, den compiler zu injizieren extra Polsterung für alighment Zwecke "innen" ein
unsigned int
. Aber es gibt keinen Raum zu tun, dass alle bits in einerunsigned int
sind bereits bei der integer selbst.Ich denke, die Lösung ist, wickeln Sie die ganze Zahl in eine Struktur, denn dann können Sie die
__attribute__(())
Magie auf der Struktur, und machen eine Reihe von, dass.