visión valores tipos rrhh recursos procesos organizaciones organizacionales organizacional objetivos más misión manera los las humanos estructuras estructura estratégico estrategica estrategia empresa cuál alinear alineamiento alineacion adecuada alignment

alignment - valores - estructura organizacional pdf



¿Por qué es importante la alineación de la estructura de datos para el rendimiento? (4)

¿Alguien me puede dar una explicación breve y plausible de por qué el compilador agrega relleno a las estructuras de datos para alinear a sus miembros? Sé que está hecho para que la CPU pueda acceder a los datos de manera más eficiente, pero no entiendo por qué esto es así.

Y si esto solo está relacionado con la CPU, ¿por qué un doble 4 bytes está alineado en Linux y 8 bytes está alineado en Windows?


Además de la respuesta de jldupont, algunas arquitecturas tienen instrucciones de carga y almacenamiento (las que se utilizan para leer / escribir en y desde la memoria) que solo operan en los límites de palabras alineadas, por lo tanto, para cargar una palabra no alineada de la memoria se necesitarían dos instrucciones de carga. una instrucción de cambio, y luego una instrucción de máscara - ¡mucho menos eficiente!


La alineación ayuda a la CPU a recuperar datos de la memoria de una manera eficiente: menos pérdida / vaciado de caché, menos transacciones de bus, etc.

Se debe acceder a algunos tipos de memoria (por ejemplo, RDRAM, DRAM, etc.) de manera estructurada ("palabras" alineadas y en "transacciones de ráfaga", es decir, muchas palabras a la vez) para obtener resultados eficientes. Esto se debe a muchas cosas entre las cuales:

  1. tiempo de configuración: tiempo que tardan los dispositivos de memoria en acceder a las ubicaciones de la memoria
  2. sobrecarga de arbitraje de bus, es decir, muchos dispositivos pueden querer acceder al dispositivo de memoria

El "relleno" se utiliza para corregir la alineación de las estructuras de datos con el fin de optimizar la eficiencia de transferencia.

En otras palabras, el acceso a una estructura "desalineada" producirá un rendimiento general más bajo. Un buen ejemplo de tal inconveniente: supongamos que una estructura de datos está desalineada y requiere que la CPU / Controlador de memoria realice 2 transacciones de bus (en lugar de 1) para obtener dicha estructura, por lo tanto, el rendimiento es menor.


Una línea de caché es una unidad básica de almacenamiento en caché. Normalmente es de 16-64 bytes o más.

Pentium IV: 64 bytes; Pentium Pro / II: 32 bytes; Pentium I: 32 bytes; 486: 16 bytes.

myrandomreader: ; ... ; ten instructions to generate next pseudo-random ; address in ESI from previous address ; ... MOV EAX, DS:[ESI] ; X LOOP myrandomreader

Para la memoria leer entre dos solteros:

(para la falla de la memoria caché L1) el procesador debe esperar a que se lea toda la línea 1 de la memoria caché desde L2-> L1 en el procesador antes de que pueda solicitar la segunda línea de la memoria caché, lo que provoca un bloqueo de ejecución corto

(para la falta de memoria caché L2) el procesador debe esperar dos lecturas de ráfaga de la memoria caché L3 (si está presente) o la memoria principal para completar en lugar de una

Puestos de procesadores

  • Una lectura aleatoria de 4 bytes se extenderá a lo largo de un límite de la línea de caché aproximadamente el 5% del tiempo para las licenciaturas de 64 bytes, el 10% para las de 32 bytes y el 20% para las de 16 bytes.

  • Puede haber sobrecargas de ejecución adicionales para algunas instrucciones sobre datos mal alineados, incluso si están dentro de una línea de caché. Esto se comenta en el sitio web de Intel para algunas instrucciones de SSE.

  • Si está definiendo las estructuras por sí mismo, puede tener sentido ver la lista de todos los campos de datos de <32 bits en una struct para reducir la sobrecarga de relleno o, alternativamente, revisar si es mejor activar o desactivar el empaquetado para una estructura en particular.

  • En MIPS y en muchas otras plataformas, no tiene la opción y debe alinearse: ¡excepción del kernel si no lo hace!

  • La alineación también puede ser especialmente importante para usted si está haciendo E / S en el bus o utilizando operaciones atómicas como el incremento / decremento atómico o si desea poder transferir su código a un proveedor que no sea Intel.

  • En el código de Intel solo (!), Una práctica común es definir un conjunto de estructuras empaquetadas para la red y el disco, y otro conjunto con relleno para en la memoria y tener rutinas para convertir datos entre estos formatos (también considere "endianness" para el formatos de disco y red).


la CPU obtiene datos de la memoria en grupos de 4 bytes (en realidad, depende del hardware, sus 8 u otros valores para algunos tipos de hardware, pero nos permite mantener 4 para mantenerlo simple), todo está bien si los datos comienzan en una dirección que es divisible por 4, la CPU va a la dirección de memoria y carga los datos.

Ahora supongamos que los datos comienzan en una dirección que no se puede dividir por 4, por simplicidad en la dirección 1, la CPU debe tomar los datos de la dirección 0 y luego aplicar algún algoritmo para volcar el byte en la dirección 0, para obtener acceso a la dirección real. los datos en el byte 1. esto lleva tiempo y, por lo tanto, reduce el rendimiento. por lo que es mucho más eficiente tener todas las direcciones de datos alineadas.