2010-05-17 24 views

Respuesta

27

un objeto que es "8 bytes alineados" se almacena en una dirección de memoria que es un múltiplo de 8.

Muchas CPUs sólo cargará algunos tipos de datos desde ubicaciones alineadas; en otras CPU ese acceso es más rápido. También hay varias otras razones posibles para usar la alineación de memoria: sin ver el código es difícil decir por qué.


acceso Alineados es más rápido debido a que el bus externo a la memoria no es un solo byte de ancho - que suele ser de 4 u 8 bytes de ancho (o incluso más amplia). Esto significa que la CPU no busca un solo byte a la vez: obtiene 4 u 8 bytes comenzando en la dirección solicitada. Como consecuencia de esto, la CPU no envía en realidad los 2 o 3 bits menos significativos de la dirección de la memoria: la memoria externa solo se puede leer o escribir en direcciones que son múltiplos del ancho del bus. Si solicitó un byte en la dirección "9", la CPU realmente solicitará a la memoria el bloque de bytes que comienza en la dirección 8, y cargará el segundo en su registro (descartando los demás).

Esto implica que un acceso desalineada puede requerir dos lee de la memoria: Si solicita 8 bytes comenzando en la dirección 9, la CPU debe buscar a los 8 bytes comenzando en la dirección 8, así como los 8 bytes comenzando en la dirección 16, luego enmascare los bytes que quería. Por otro lado, si solicita los 8 bytes que comienzan en la dirección 8, solo se necesita una sola búsqueda. Algunas CPU ni siquiera realizarán una carga tan desalineada: simplemente generarán una excepción (¡o incluso cargarán silenciosamente los datos incorrectos!).

+1

lo que significa que, si la primera posición es 0x0000, entonces la segunda posición sería 0x0008 .. ¿Cuál es la ventaja de estos 8 bytes de tipo alineado? –

4

"X bytes alineados" significa que la dirección base de sus datos debe ser un múltiplo de X. Se puede usar para usar hardware especial como un DMA en algún hardware especial, para un acceso más rápido por la CPU, etc. ...

Es el caso del procesador de celda donde los datos deben estar alineados a 16 bytes para poder copiarse al coprocesador.

+0

bien. pero ¿cómo la ejecución se vuelve más rápida cuando está de X bytes de alineado? ¿Debido a un cálculo más fácil de la dirección de memoria o alguna otra cosa? ¿También hay alguna alineación para las funciones? /Kanu__ –

+0

Bueno, depende de su arquitectura. Por ejemplo, si tiene una arquitectura de 32 bits y se puede acceder a su memoria solo por 4 bytes para una dirección múltiple de 4 (4 bytes alineados), sería más eficiente ajustar sus datos de 4 bytes (por ej .: entero) en ella . Le permitiría acceder a ella en una lectura de memoria en lugar de dos si no está alineada. (NOTA: este caso es hipotético) – Phong

+0

Generalmente su compilador realiza toda la optimización, por lo que no tiene que administrarla. En algunos casos MUY específicos, es posible que deba especificarlos usted mismo (por ejemplo, el procesador de la celda o el hardware de su proyecto). Si está trabajando en la arquitectura tradicional, realmente no necesita hacerlo. – Phong

8

La alineación de la memoria es importante para el rendimiento de diferentes maneras. Tiene un motivo relacionado con el hardware. Desde los años 80 hay una diferencia en el tiempo de acceso entre la CPU y la memoria. La velocidad del procesador crece más rápido que la velocidad de la memoria. Esta diferencia es cada vez más grande con el tiempo (para dar un ejemplo: en el Apple II, la CPU estaba en 1.023 MHz, la memoria era dos veces esa frecuencia, 1 ciclo para la CPU, 1 ciclo para el video. Una PC moderna funciona a aproximadamente 3GHz en la CPU, con una memoria de apenas 400MHz). Una solución al problema de la memoria cada vez más lenta es acceder a ella en buses cada vez más amplios, en lugar de acceder a 1 byte a la vez, la CPU leerá una palabra de 64 bits de ancho de la memoria. Esto significa que incluso si lee 1 byte de la memoria, el bus emitirá una palabra completa de 64 bits (8 bytes). La memoria tendrá estas unidades de 8 bytes en la dirección 0, 8, 16, 24, 32, 40, etc. Un múltiplo de 8. Si accede, por ejemplo, una palabra de 8 bytes en la dirección 4, el hardware tendrá que leer la palabra en la dirección 0, enmascare los 4 bytes altos de esa palabra, luego lea la palabra en la dirección 8, enmascare la parte baja de esa palabra, combínela con la primera mitad y déjela en el registro. Como puede ver, una operación bastante complicada (por lo tanto, lenta). Esta es la primera razón por la que a uno le gusta el acceso alineado a la memoria. Daré otra razón en 2 horas.

+0

Gracias. Bueno. Estoy esperando su segunda razón. –

+0

Lo siento, lo olvidé. No hay una segunda razón En el momento en que escribí eso, pensé en las matrices y los tamaños de los elementos de la matriz, que no es estrictamente sobre la alineación. Pero los tamaños que son potencias de 2, tienen la ventaja de ser calculados fácilmente. Ciertas CPU tienen incluso modos de dirección que multiplican por 2, 4 u 8 directamente sin penalización (x86 y 68020, por ejemplo). Pero como se dijo, no tiene mucho que ver con las alineaciones. –

+0

exactamente. Gracias por la info. /renjith_g –

0

si los datos de memoria están alineados a 8 bytes, significa:
sizeof(the_data) % 8 == 0.
generalmente en lenguaje C, si se propone que una estructura tenga 8 bytes alineados, su tamaño debe ser la multiplicación de 8, y si no lo es, el relleno se requiere manualmente o mediante el compilador.algunos compiladores proporcionan directivas para hacer una estructura alineada con n bytes, para VC, es #prgama pack(8), y para gcc, es __attribute__((aligned(8))).

+0

Digamos que uno está trabajando con SSE (128 bits) en datos de coma flotante (simple). Sin embargo, la longitud de los datos es 38. El proceso multiplica los datos por una constante. ¿Qué debería hacer el desarrollador para manejar esto? – Royi

Cuestiones relacionadas