2012-04-19 25 views
5

Intel's official optimization guide tiene un capítulo sobre la conversión de MMX manda a SSE en la que manifiesten la DECLARACIÓN barbecho:¿Qué significa la alineación con límite de 16 bytes en x86

instrucciones de cálculo que utilizan un operando de memoria que puede no estar alineado a un límite de 16 bytes debe reemplazarse con una carga desalineada de 128 bits (MOVDQU) seguida de la misma operación de cálculo que utiliza en su lugar registrar operandos.

(capítulo 5.8 en la conversión de 64-bit a enteros SIMD de 128 bits, pág. 5-43)

No puedo entender lo que significan por "puede no estar alineado a un 16-byte límite ", ¿podría aclararlo y dar algunos ejemplos?

+0

Cuando dicen "pueden no estar alineados", quieren decir si el código debe funcionar correctamente cuando se usa con punteros desalineados. es decir, no puede asumir que las entradas siempre están alineadas. (La respuesta de Jakob cubre lo que significa alinear una dirección). –

Respuesta

9

Ciertas instrucciones SIMD, que realizan la misma instrucción en varios datos, requieren que la dirección de memoria de estos datos esté alineada con un límite de bytes determinado. Esto significa que la dirección de la memoria en la que se encuentran sus datos debe ser divisible por el número de bytes requerido por la instrucción.

Por lo tanto, en su caso, la alineación es de 16 bytes (128 bits), lo que significa que la dirección de memoria de sus datos debe ser un múltiplo de 16. Por ej. 0x00010 estaría alineado en 16 bytes, mientras que 0x00011 no lo estaría.

La manera de alinear sus datos depende del lenguaje de programación (y algunas veces del compilador) que está utilizando. La mayoría de los idiomas que tienen la noción de una dirección de memoria también le proporcionará los medios para especificar la alineación.

0

Los datos que están alineados en un límite de 16 bits tendrán una dirección de memoria que es un número par, en rigor, un múltiplo de dos. Cada byte es de 8 bits, por lo que para alinearlo en un límite de 16 bits, debe alinearse con cada conjunto de dos bytes.

Del mismo modo, la memoria alineada en un límite de 32 bits tendría una dirección de memoria que es un múltiplo de cuatro, porque agrupa cuatro bytes para formar una palabra de 32 bits.

+2

16 byte, no 16 bit ... –

+0

Dang, mi mal. Lo siento... – Andrew

0

Supongo que aquí, pero podría ser que "no esté alineado con un límite de 16 bytes" significa que esta ubicación de memoria se ha alineado anteriormente con un valor menor (4 u 8 bytes) para otros fines y ahora para ejecutar instrucciones SSE en esta memoria, ¿necesita cargarlo en un registro de forma explícita?

Cuestiones relacionadas