¿Por qué el doble en C tiene 8 bytes alineados?

5 minutos de lectura

¿Por que el doble en C tiene 8 bytes alineados
Ravi Gupta

Estaba leyendo un artículo sobre la alineación de tipos de datos en la memoria (aquí) y no puedo entender un punto, es decir

Tenga en cuenta que una variable doble se asignará en un límite de 8 bytes en una máquina de 32 bits y requiere dos ciclos de lectura de memoria. En una máquina de 64 bits, según el número de bancos, la variable doble se asignará en un límite de 8 bytes y requiere solo un ciclo de lectura de memoria.

Mi duda es: ¿Por qué las variables dobles deben asignarse en un límite de 8 bytes y no en 4 bytes? Si se asigna en un límite de 4 bytes, solo necesitamos 2 ciclos de lectura de memoria (en una máquina de 32 bits). Corrígeme si estoy equivocado.

Además, si alguien tiene un buen tutorial sobre alineación de miembros/memoria, tenga la amabilidad de compartirlo.

  • Vea esta respuesta: stackoverflow.com/a/9468315/612429

    – está bien

    6 de junio de 2012 a las 11:22


  • Coincide con la alineación de caché y también con los requisitos de instrucción SSE.

    –Oliver Charlesworth

    6 de junio de 2012 a las 11:40

  • Todo esto depende de la arquitectura del hardware y no de C.

    – m0skit0

    6 de junio de 2012 a las 13:47

  • @ m0skit0: si todo depende de la arquitectura, ¿por qué es diferente para diferentes compiladores? A double (eight bytes) will be 8-byte aligned on Windows and 4-byte aligned on Linux (8-byte with -malign-double compile time option). … fuente en.wikipedia.org/wiki/Data_structure_alignment

    – Ravi Gupta

    7 de junio de 2012 a las 5:00

  • @OliverCharlesworth: SSE no requiere cargas/almacenes de alineación de 8 bytes. Se requiere alineación de 16 bytes para cargas/almacenamientos de 16 bytes, o no se requiere alineación para operandos más estrechos. Pero sí, es bueno para el rendimiento alinear dobles de 8 bytes para que no puedan dividirse en líneas de caché. (O a través de cualquier otro límite de más de 8 bytes, para las CPU que se preocupan por la alineación dentro de una línea de caché).

    – Peter Cordes

    15 de octubre de 2019 a las 5:02


¿Por que el doble en C tiene 8 bytes alineados
Ira Baxter

La razón para alinear un valor de datos de tamaño 2^N en un límite de 2^N es evitar la posibilidad de que el valor se divida en un límite de línea de caché.

El procesador x86-32 puede obtener un doble de cualquier límite de palabra (8 bytes alineados o no) en un máximo de dos lecturas de memoria de 32 bits. Pero si el valor se divide en un límite de línea de caché, entonces el tiempo para obtener la segunda palabra puede ser bastante largo debido a la necesidad de obtener una segunda línea de caché de la memoria. Esto produce un bajo rendimiento del procesador innecesariamente. (En la práctica, los procesadores actuales no obtienen 32 bits de la memoria a la vez; tienden a obtener valores mucho más grandes en buses mucho más anchos para permitir anchos de banda de datos realmente altos; el tiempo real para obtener ambas palabras si están en la misma línea de caché, y ya están en caché, puede ser solo 1 reloj).

Una consecuencia gratuita de este esquema de alineación es que dichos valores tampoco cruzan los límites de la página. Esto evita la posibilidad de una falla de página en medio de una búsqueda de datos.

Por lo tanto, debe alinear los dobles en los límites de 8 bytes por motivos de rendimiento. Y los compiladores lo saben y simplemente lo hacen por usted.

  • Entonces, ¿cuál es el problema con la alineación en el límite de 4 bytes? todavía necesitaría 2 ciclos para el sistema de 32 bits

    – BitFlip

    23 de noviembre de 2018 a las 9:06

  • @Raman: no está considerando el costo de leer los segundos 32 bits desde una ubicación que hace que se obtenga una línea de caché de la memoria principal. Tales recuperaciones toman decenas de nanosegundos, en contraste con “1 ciclo” que toma 0.2 ns, por lo que es mucho más que solo 1 ciclo. Esto puede ser raro, pero es bastante caro si sucede.

    –Ira Baxter

    23 de noviembre de 2018 a las 9:33


  • La FPU x87 en CPU tan antiguas como P5 Pentium puede cargar 64 bits a la vez desde la memoria caché. Es por eso que gcc elige dar double Alineación de 8 bytes incluso con -m32, excepto en las estructuras donde el i386 System V ABI puede forzarlo a desalinearse. Pregunta de alineación de doble pila usando el compilador gcc para la arquitectura x86. Todo esto de que las CPU de 32 bits no pueden obtener un doble completo es una tontería en 2012; eso es solo el entero ancho de registro. Sin embargo, eso fue cierto históricamente y la razón del diseño de ABI.

    – Peter Cordes

    15 de octubre de 2019 a las 5:22

1647721088 472 ¿Por que el doble en C tiene 8 bytes alineados
Benoit

Alinear un valor en un límite más bajo que su tamaño hace que sea propenso a dividirse en dos líneas de caché. Dividir el valor en dos líneas de caché significa un trabajo adicional al desalojar las líneas de caché al almacén de respaldo (se expulsarán dos líneas de caché en lugar de una), lo que es una carga inútil de buses de memoria.

1647721089 33 ¿Por que el doble en C tiene 8 bytes alineados
nitina

La alineación de 8 bytes para el doble en la arquitectura de 32 bits no reduce las lecturas de memoria, pero aún mejora el rendimiento del sistema en términos de acceso reducido a la memoria caché. Lea lo siguiente: https://stackoverflow.com/a/21220331/5038027

1647721090 636 ¿Por que el doble en C tiene 8 bytes alineados
Manik Sidana

Consulte este artículo de wiki sobre formato de punto flotante de precisión doble

La cantidad de ciclos de memoria depende de la arquitectura de su hardware, que determina cuántos bancos de RAM tiene. Si tiene una arquitectura de 32 bits y 4 bancos de RAM, solo necesita 2 ciclos de memoria para leer (cada banco de RAM contribuye con 1 byte)

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad