2012-04-19 18 views
5

Intel's official optimization guide ha un capitolo sulla conversione da comandi MMX a SSE, dove si afferma lo statment maggese:Cosa allineamento al limite di 16 byte significa in x86

istruzioni di calcolo che utilizzano un operando di memoria che non possono essere allineati a un limite di 16 byte deve essere sostituito con un carico non allineato a 128 bit (MOVDQU) seguito dalla stessa operazione di calcolo che utilizza invece gli operandi di registro.

(capitolo 5.8 Conversione da 64-bit a 128 bit SIMD numeri interi, pag. 5-43)

non riesco a capire che cosa si intende per "non può essere allineato a un 16 byte confine ", potresti chiarire e dare alcuni esempi?

+0

Quando dicono "potrebbe non essere allineato", indicano se il codice deve funzionare correttamente se utilizzato con puntatori non allineati. non si può presumere che gli input siano sempre allineati. (La risposta di Jakob riguarda cosa significa che un indirizzo deve essere allineato). –

risposta

9

Alcune istruzioni SIMD, che eseguono la stessa istruzione su più dati, richiedono che l'indirizzo di memoria di questi dati sia allineato a un determinato limite di byte. Ciò significa in effetti che l'indirizzo della memoria in cui risiedono i dati deve essere divisibile per il numero di byte richiesto dall'istruzione.

Quindi nel vostro caso l'allineamento è di 16 byte (128 bit), il che significa che l'indirizzo di memoria dei vostri dati deve essere un multiplo di 16. E.g. 0x00010 sarebbe allineato a 16 byte, mentre 0x00011 non lo sarebbe.

Come ottenere i dati da allineare dipende dal linguaggio di programmazione (e talvolta dal compilatore) che si sta utilizzando. La maggior parte delle lingue che hanno la nozione di indirizzo di memoria fornirà anche i mezzi per specificare l'allineamento.

0

I dati allineati su un limite di 16 bit avranno un indirizzo di memoria che è un numero pari - in senso stretto, un multiplo di due. Ogni byte è 8 bit, quindi per allinearlo su un limite di 16 bit, è necessario allineare ciascun set di due byte.

Analogamente, la memoria allineata su un limite a 32 bit avrebbe un indirizzo di memoria che è un multiplo di quattro, poiché si raggruppano quattro byte insieme per formare una parola a 32 bit.

+2

16 byte, non 16 bit ... –

+0

Dang, mio ​​male. Scusate... – Andrew

0

Sto indovinando qui, ma potrebbe essere che "potrebbe non essere allineato a un limite di 16 byte" significa che questa posizione di memoria è stata allineata a un valore inferiore (4 o 8 byte) prima per altri scopi e ora per eseguire le istruzioni SSE su questa memoria è necessario caricarlo esplicitamente in un registro?

Problemi correlati