2010-06-11 14 views
9

Perdónenme si cree que esto ha sido respondido en numerosas ocasiones, pero necesito respuestas a las siguientes consultas.Alineación de CPU y datos

  1. ¿Por qué los datos deben estar alineados (en los límites de 4 byte/8 byte/2 byte)? Aquí mi duda es cuando la CPU tiene líneas de dirección Ax Ax-1 Ax-2 ... A2 A1 A0, entonces es bastante posible dirigir las ubicaciones de memoria secuencialmente. Entonces, ¿por qué existe la necesidad de alinear los datos en límites específicos?

  2. ¿Cómo encontrar los requisitos de alineación cuando estoy compilando mi código y generando el ejecutable?

  3. Si, por ejemplo, la alineación de datos es un límite de 4 bytes, ¿significa eso que cada byte consecutivo se encuentra en los desplazamientos del módulo 4? Mi duda es si los datos están alineados a 4 bytes ¿eso significa que si un byte está en 1004, entonces el siguiente byte está en 1008 (o en 1005)?

Sus comentarios son bienvenidos.

¡Gracias de antemano! /MS

Respuesta

11

CPUs son orientado a palabras, no byte orientado. En una CPU simple, la memoria generalmente está configurada para devolver una palabra (32 bits, 64 bits, etc.) por luz estroboscópica de dirección, donde las dos (o más) líneas de direcciones inferiores generalmente son bits que no importan.

Las CPU Intel pueden realizar accesos en límites sin palabras para muchas instrucciones, sin embargo, hay una penalización de rendimiento ya que internamente la CPU realiza dos accesos a la memoria y una operación matemática para cargar una palabra. Si está haciendo lecturas de byte, no se aplica alineación.

Algunas CPU (instrucciones ARM o Intel SSE) requieren memoria alineada y tienen una operación indefinida cuando se realizan accesos no alineados (o se lanza una excepción). Ahorran espacio de silicio significativo al no implementar el subsistema de carga/almacenamiento mucho más complicado.

La alineación depende del tamaño de la palabra de la CPU (16, 32, 64 bits) o, en el caso de SSE, del tamaño de registro SSE (128 bits).

Para su última pregunta, si está cargando un solo byte de datos a la vez no hay restricción de alineación en la mayoría de las CPU (algunos DSP no tienen instrucciones de nivel de byte, pero es probable que no se encuentre con uno) .

+0

hola theatrus, aquí está mi duda otra vez! ¿Por qué se eliminan las 2 líneas de dirección inferiores? Gracias a esta configuración, solo puedo acceder a los datos de las direcciones 0, 4, 8 ... etc. Entonces, ¿cómo se manejan las manipulaciones de Byte en tal situación? ¿Mencionó que no hay restricción de alineación para un solo byte de datos, cómo se logra cuando a las 2 líneas de direcciones inferiores no les importa? ¡Gracias por su respuesta! –

+0

Lo que más me preocupa es por qué a las líneas de direcciones no les importa cuándo puede haber una manipulación de byte prevista en mi código (y hacer todo el camino para hacer lo mismo ...)? –

2

En general, la respuesta a las tres preguntas es "depende de su sistema". Algunos más detalles:

  1. Su sistema de memoria puede no ser direccionable por byte. Además de eso, puede incurrir en una penalización de rendimiento para que su procesador acceda a los datos no alineados. Algunos procesadores (como los antiguos chips ARM, por ejemplo) simplemente no pueden hacerlo.

  2. leer el manual de su procesador y cualquiera que sea la especificación ABI su código se genera para,

  3. lo general, cuando la gente se refiere a los datos que está en un cierto alineamiento, se refiere únicamente al primer byte. Entonces, si la especificación ABI decía "la estructura de datos X debe estar alineada con 4 bytes", significa que X debe colocarse en la memoria en una dirección divisible por 4. Nada está implícito en esa declaración sobre el tamaño o el diseño interno de la estructura X .

    en cuanto a su ejemplo particular va, si los datos son de 4 bytes alineados partir de la dirección 1004, el siguiente byte será a 1005.

5

Muy pocos datos "tienen" que alinearse. Es más que ciertos tipos de datos pueden funcionar mejor o ciertas operaciones de CPU requieren una cierta alineación de datos.

Antes que nada, digamos que está leyendo 4 bytes de datos a la vez. Digamos también que su CPU tiene un bus de datos de 32 bits. Digamos también que sus datos están almacenados en el byte 2 en la memoria del sistema.

Ahora, ya que puede cargar 4 bytes de datos a la vez, no tiene demasiado sentido hacer que su dirección se registre para apuntar a un solo byte. Al hacer que su punto de registro de dirección sea cada 4 bytes, puede manipular 4 veces los datos. En otras palabras, su CPU solo podrá leer datos comenzando en los bytes 0, 4, 8, 12, 16, etc.

Así que este es el problema. Si quiere los datos comenzando en el byte 2 y está leyendo 4 bytes, entonces la mitad de sus datos estará en la posición de dirección 0 y la otra mitad en la posición 1.

Así que básicamente terminará golpeando la memoria dos veces para leer su elemento de datos de 4 bytes. Algunas CPU no admiten este tipo de operación (u obligan a cargar y combinar los dos resultados manualmente).

Vaya aquí para más detalles: http://en.wikipedia.org/wiki/Data_structure_alignment

+5

+1 para el enlace, pero debe tener en cuenta que solo algunos procesadores toleran datos mal alineados. Intel lo hace para la arquitectura IA32 e IA64, pero no para Itanium. Su explicación es verdadera solo para procesadores que son tolerantes para datos mal alineados como IA32/IA64. Alpha AXP generaría una falla, y creo que MIPS también lo haría. Algunos sistemas operativos manejarían los datos desalineados en el controlador de fallas, pero la penalización de rendimiento es enorme. Y si el sistema operativo no lo maneja, los datos mal alineados no funcionan, en absoluto, para esos sistemas. –

4

1.) En algunas arquitecturas no tienen este requisito en todos, algunos alientan la alineación (hay una penalización de velocidad cuando se accede a los elementos de datos no ALIGNET), y algunos pueden cumplir es estrictamente (la mala alineación causa una excepción de procesador).
Muchas de las arquitecturas populares actuales caen en la categoría de penalización de velocidad. Los diseñadores de CPU tuvieron que hacer un cambio entre flexibilidad/rendimiento y costo (área de silicio/número de señales de control requeridas para ciclos de bus).

2.) ¿Qué idioma, qué arquitectura? Consulte su manual de compiladores y/o la documentación de la arquitectura de la CPU.

3.) Una vez más, esto depende totalmente de la arquitectura (algunas arquitecturas pueden no permitir el acceso en elementos de tamaño byte, o tienen anchos de bus que no son ni siquiera un múltiplo de 8 bits). Por lo tanto, a menos que pregunte sobre una arquitectura específica de, no obtendrá respuestas útiles.

-1

"Ahora que puede cargar 4 bytes de datos a la vez, no tiene demasiado sentido hacer que su Dirección se registre para apuntar a un solo byte."

¿Por qué? ¿Por qué no puedo leer las posiciones 1, 2, 3, 4 a la vez? Creo que hacer esto no degradará el rendimiento y tendrá mucha complejidad en los circuitos.

+0

Esto no es una respuesta. Me doy cuenta de que lo has convertido en una pregunta de relleno (http://stackoverflow.com/questions/3903164/why-misaligned-address-access-incur-2-or-more-accesses) que era lo correcto para hacer. –

1

¡Depende completamente de la CPU que esté utilizando!

Algunas arquitecturas tratan solo en 32 (o 36!) Palabras de bits y necesita instrucciones especiales para cargar caracteres singel o palabras de haalf.

Algunos cpus (especialmente PowerPC y otros chips de IBM risc) no se preocupan por las alineaciones y cargarán enteros desde direcciones impares.

Para la mayoría de las arquitecturas modernas, necesita alinear enteros con límites de palabras y enteros largos con límites de palabras dobles. Esto simplifica el circuito para cargar registros y acelera las cosas muy poco.

1

La CPU requiere la alineación de datos por motivos de rendimiento. sitio web de Intel dar a conocer los detalles sobre cómo alinear los datos en la memoria

Data Alignment when Migrating to 64-Bit Intel® Architecture

Uno de estos es la alineación de los elementos de datos - su ubicación en la memoria en relación con las direcciones que están múltiplos de cuatro, ocho o 16 bytes. En la arquitectura Intel de 16 bits, la alineación de datos tuvo poco efecto sobre el rendimiento, y su uso fue totalmente opcional. En IA-32, alinear los datos correctamente puede ser una optimización importante, aunque su uso sigue siendo opcional con muy pocas excepciones, donde la alineación correcta es obligatoria. El entorno de 64 bits, sin embargo, impone requisitos más estrictos en los elementos de datos. Los objetos desalineados causan excepciones de programa. Para que un elemento se alinee correctamente, debe cumplir los requisitos impuestos por la arquitectura Intel de 64 bits (que se analizará en breve), además de los del vinculador utilizado para compilar la aplicación.

La regla fundamental de la alineación de datos es que el enfoque más seguro (y más ampliamente respaldado) se basa en lo que Intel denomina "los límites naturales". Esos son los que ocurren cuando redondeas el tamaño de un elemento de datos al siguiente tamaño más grande de dos, cuatro, ocho o 16 bytes. Por ejemplo, un flotante de 10 bytes debe alinearse en una dirección de 16 bytes, mientras que los enteros de 64 bits deben alinearse con una dirección de ocho bytes. Debido a que esta es una arquitectura de 64 bits, los tamaños de los punteros tienen ocho bytes de ancho, por lo que también deben alinearse en los límites de ocho bytes.

Se recomienda que todas las estructuras de más de 16 bytes se alineen en los límites de 16 bytes. En general, para el mejor rendimiento, alinear los datos como sigue:

  • Align datos de 8 bits en cualquier dirección
  • alinear los datos de 16 bits para ser contenidos dentro de una palabra de cuatro bytes alineados
  • Align 32 datos -bit de manera que su dirección de base es un múltiplo de cuatro
  • datos
  • Align 64 bits de modo que su dirección de base es un múltiplo de ocho
  • datos Align 80 bits de modo que su dirección de base es un múltiplo de dieciséis
  • Alinea datos de 128 bits para que su dirección base es un múltiplo de dieciséis

A 64 bytes o mayor estructura de datos o matriz deben estar alineados de manera que su dirección de base es un múltiplo de 64. Ordenación de datos decreciente tamaño es una heurística para ayudar con alineación natural. Siempre que los límites de 16 bytes (y las líneas de caché) nunca se crucen, la alineación natural no es estrictamente necesaria, aunque es una manera fácil de hacer cumplir las recomendaciones de alineación general. Alinear datos correctamente dentro de las estructuras puede causar hinchamiento de datos (debido al relleno necesario para colocar los campos correctamente . Encontrará más información sobre cómo resolver este problema en el artículo "Preparación del código para la arquitectura IA-64 (Code Clean)".

Cuestiones relacionadas