Alineación de CPU y datos

Perdónenme si sienten que esto ha sido respondido en numerosas ocasiones, ¡pero necesito respuestas a las siguientes preguntas!

  1. ¿Por qué los datos deben estar alineados (en límites de 4 bytes / 8 bytes / 2 bytes)? 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 comstackndo mi código y generando el executatble?

  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 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)?

Tus pensamientos son bienvenidos.

¡Gracias por adelantado! /SRA

Las CPU están orientadas a las palabras, no están orientadas a bytes. 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 dirección 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).

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ás 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, dado 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 puede leer datos comenzando en los bytes 0, 4, 8, 12, 16, etc.

Así que aquí está el problema. Si desea que los datos comiencen en el byte 2 y está leyendo 4 bytes, la mitad de sus datos estarán en la posición de dirección 0 y la otra mitad en la posición 1.

Así que, básicamente, terminas golpeando la memoria dos veces para leer tu 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 obtener más detalles: http://en.wikipedia.org/wiki/Data_structure_alignment

1.) Algunas architectures no tienen este requisito en absoluto, algunas fomentan la alineación (hay una penalización de velocidad cuando se accede a elementos de datos que no son de Alignet), y algunas pueden imponerla estrictamente (la mala alineación causa una excepción en el procesador).
Muchas de las architectures populares de hoy 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é architecture? Consulte su manual de comstackdores y / o la documentación de la architecture de la CPU.

3.) De nuevo, esto depende totalmente de la architecture (algunas architectures pueden no permitir el acceso a elementos de tamaño byte, o tienen anchos de bus que no son ni siquiera un múltiplo de 8 bits). Entonces, a menos que preguntes por una architecture específica , no obtendrás ninguna respuesta útil.

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

  1. Su sistema de memoria podría 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. Lea el manual de su procesador y cualquier especificación ABI para la que se genere su código,

  3. Por lo general, cuando las personas se refieren a que los datos están en cierta alineación, se refieren solo 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 statement sobre el tamaño o el diseño interno de la estructura X .

    En lo que respecta a su ejemplo particular, si los datos están alineados en 4 bytes comenzando en la dirección 1004, el siguiente byte estará en 1005.

¡Es completamente depende de la CPU que estés usando!

Algunas architectures tratan solo en 32 (¡o 36!) Palabras de bits y usted 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 de direcciones impares.

Para la mayoría de las architectures 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.

La CPU requiere la alineación de los datos por razones de rendimiento. El sitio web de Intel proporciona detalles sobre cómo alinear los datos en la memoria

Alineación de datos al migrar a la architecture Intel® de 64 bits

Una de ellas es la alineación de los elementos de datos: su ubicación en la memoria en relación con las direcciones que son múltiplos de cuatro, ocho o 16 bytes. En la architecture 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 progtwig. Para que un elemento se alinee correctamente, debe cumplir los requisitos impuestos por la architecture Intel de 64 bits (que se analizará en breve), además de los del vinculador utilizado para comstackr 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 architecture 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 obtener el mejor rendimiento, alinee los datos de la siguiente manera:

  • Alinea datos de 8 bits en cualquier dirección
  • Alinee los datos de 16 bits para que queden dentro de una palabra de cuatro bytes alineada
  • Alinee datos de 32 bits para que su dirección base sea un múltiplo de cuatro
  • Alinea datos de 64 bits para que su dirección base sea un múltiplo de ocho
  • Alinee datos de 80 bits para que su dirección base sea un múltiplo de dieciséis
  • Alinee datos de 128 bits para que su dirección base sea un múltiplo de dieciséis

Una estructura o matriz de datos de 64 bytes o más debe alinearse de manera que su dirección base sea un múltiplo de 64. La ordenación de datos en orden decreciente de tamaño es una heurística para ayudar con la 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 los datos correctamente dentro de las estructuras puede causar la saturación de datos (debido al relleno necesario para colocar los campos correctamente), de ser necesario y posible, es útil reorganizar las estructuras para que los campos que requieren la alineación más amplia entren primero en la estructura. Encontrará más información sobre cómo resolver este problema en el artículo “Preparación del código para la architecture IA-64 (Code Clean)”.

Para la architecture Intel, el Capítulo 4 TIPOS DE DATOS de las architectures Intel 64 e IA-32 Manual del desarrollador de software responde a su pregunta 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.