¿Por qué la CPU accede a la memoria en un límite de palabras?

9 minutos de lectura

avatar de usuario
smwikipedia

Escuché mucho que los datos deben alinearse correctamente en la memoria para una mejor eficiencia de acceso. Memoria de acceso de la CPU en un límite de palabra.

Entonces, en el siguiente escenario, la CPU tiene que hacer 2 accesos a la memoria para obtener una sola palabra.

Supposing: 1 word = 4 bytes

("|" stands for word boundary. "o" stands for byte boundary)


|----o----o----o----|----o----o----o----|   (The word boundary in CPU's eye)
           ----o----o----o----              (What I want to read from memory)

¿Por qué debería suceder esto? ¿Cuál es la causa principal de que la CPU solo pueda leer en el límite de palabras?

Si la CPU solo puede acceder al límite de palabra de 4 bytes, la línea de dirección solo debería necesitar 30 bits, no 32 bits de ancho. Porque los últimos 2 bits siempre son 0 en el ojo de la CPU.

AÑADIR 1

Y aún más, si admitimos que la CPU debe leer en el límite de palabras, ¿por qué no puede la límite de inicio en el que quiero leer? Parece que el límite es fijado en el ojo de la CPU.

AÑADIR 2

De acuerdo a Hormiga, parece que la configuración de límites está cableada y está cableada por el hardware de acceso a la memoria. La CPU es inocente en lo que a esto se refiere.

avatar de usuario
AnT apoya a Rusia

El significado de “puede” (en “…CPU puede acceder…”) en este caso depende de la plataforma de hardware.

En las instrucciones de la CPU de la plataforma x86 pueden acceder a datos alineados en absolutamente ningún límite, no sólo en el “límite de palabra”. El acceso desalineado puede ser menos eficiente que el acceso alineado, pero los motivos no tienen absolutamente nada que ver con la CPU. Tiene todo que ver con cómo funciona el hardware de acceso a la memoria de bajo nivel subyacente. Es muy posible que en este caso el hardware relacionado con la memoria tenga que hacer dos accesos a la memoria real, pero eso es algo que las instrucciones de la CPU no saben y no necesitan saber. En lo que respecta a la CPU, puede acceder a cualquier dato en cualquier límite. El resto se implementa de forma transparente a las instrucciones de la CPU.

En plataformas de hardware como Sun SPARC, CPU no poder acceder a datos desalineados (en palabras simples, su programa fallará si lo intenta), lo que significa que si por alguna razón necesita realizar este tipo de acceso desalineado, tendrá que implementarlo de forma manual y explícita: dividirlo en dos (o más) instrucciones de la CPU y, por lo tanto, realiza explícitamente dos (o más) accesos a la memoria.

En cuanto a por qué es tan… bueno, así es como funciona el hardware de memoria de la computadora moderna. Los datos tienen que estar alineados. Si no está alineado, el acceso es menos eficiente o no funciona en absoluto.

Un modelo muy simplificado de la memoria moderna sería una cuadrícula de celdas (filas y columnas), cada celda almacenando una palabra de datos. Un brazo robótico programable puede poner una palabra en una celda específica y recuperar una palabra de una celda específica. Uno a la vez. Si sus datos están repartidos en varias celdas, no tiene más remedio que hacer varios viajes consecutivos con ese brazo robótico. En algunas plataformas de hardware, la tarea de organizar estos viajes consecutivos está oculta para la CPU (lo que significa que el propio brazo sabe qué hacer para ensamblar los datos necesarios de varias piezas), en otras plataformas es visible para la CPU (lo que significa que es el CPU que se encarga de organizar estos viajes consecutivos del brazo).

  • Gracias por señalar la diferencia entre la CPU y el hardware de acceso a la memoria. es refrescante

    – smwikipedia

    7 de septiembre de 2010 a las 5:18

  • Parece que el establecimiento de límites es cableado y está cableado por el hardware de acceso a la memoria. La CPU es inocente en lo que a esto se refiere.

    – smwikipedia

    7 de septiembre de 2010 a las 5:21


  • @smwikipedia: Bueno, sí. Los límites de las palabras se implementan en los chips de RAM reales instalados en su computadora. Dentro de estos chips, los bits de datos se organizan en palabras. Entonces, las palabras están predeterminadas, implementadas en el hardware real. Son absolutamente fijos por esa razón. Para acceder a los datos, seleccione una palabra específica usando las llamadas “líneas de palabras” dentro del chip y luego lea o escriba bits usando las llamadas “líneas de bits”.

    – AnT apoya a Rusia

    7 de septiembre de 2010 a las 5:27


  • Esto es un poco simplificado, en mi opinión. La CPU incluye el caché L1 en estos días, por lo que el acceso no alineado requiere transistores adicionales en la CPU. Pero sí, está en la parte de acceso a caché de la CPU, que sería más simple si las compensaciones en una línea de caché tuvieran que ser múltiplos de 4. Más importante aún, cruzar un límite de línea de caché requiere dos accesos separados, y este es un gran complicación para soportar accesos desalineados. (El acceso real a la DRAM ocurre al leer o escribir una línea de caché completa a la vez, en sistemas con caché).

    – Peter Cordes

    11 de agosto de 2016 a las 20:18


  • Ver también Lo que todo programador debe saber sobre la memoria de Ulrich Drepper. Y, por cierto, las CPU x86 modernas gastan los transistores para hacer que los accesos no alineados no tengan penalización cuando no cruzan un límite de línea de caché. (p. ej., Intel Nehalem tiene cargas/almacenes rápidos no alineados incluso para vectores 16B SSE, a diferencia de Core2). Si un bucle no tiene un cuello de botella en el rendimiento de uop de carga (p. ej., 2 por ciclo), el hardware puede absorber las cargas adicionales necesarias para la memoria caché. la línea se divide mientras recorre una matriz. Consulte también la wiki de etiquetas x86

    – Peter Cordes

    11/08/2016 a las 20:25


Ahorra silicio en la lógica de direccionamiento si puede hacer ciertas suposiciones sobre la dirección (como “abajo n los bits son cero). Algunas CPU (x86 y sus similares) implementarán la lógica para convertir los datos desalineados en múltiples recuperaciones, ocultando algunos problemas de rendimiento desagradables del programador. La mayoría de las CPU fuera de ese mundo generarán un error de hardware que explica en términos inequívocos que no les gusta esto.

Todos los argumentos que vas a escuchar sobre la “eficiencia” son tonterías o, más precisamente, son una petición de principio. La verdadera razón es simplemente que ahorra silicio en el núcleo del procesador si se puede reducir la cantidad de bits de dirección para las operaciones. Cualquier ineficiencia que surja del acceso desalineado (como en el mundo x86) es el resultado de decisiones de diseño de hardware, no intrínsecas al direccionamiento en general.

Dicho esto, para la mayoría de los casos de uso, la decisión de diseño de hardware tiene sentido. Si está accediendo a datos en palabras de dos bytes, los casos de uso más comunes le hacen acceder offsetdespués offset+2después offset+4 y así. Ser capaz de incrementar la dirección por bytes mientras se accede a palabras de dos bytes normalmente (como en el 99,44 %) no es lo que desea hacer. Como tal, no está de más requerir desplazamientos de dirección para alinear los límites de las palabras (es un inconveniente leve y único cuando diseña sus estructuras de datos), pero seguro que ahorra en su silicio.

Como un aparte histórico, trabajé una vez en un Interdata Modelo 70, una minicomputadora de 16 bits. Requería que todo el acceso a la memoria estuviera alineado con 16 bits. También tenía una cantidad muy pequeña de memoria en el momento en que estaba trabajando en él según los estándares de la época. (Era una reliquia incluso en ese entonces). La alineación de palabras se usó para duplicar la capacidad de la memoria, ya que la CPU envuelta en alambre podía piratearse fácilmente. Se agregó una nueva lógica de decodificación de direcciones que tomó un 1 en el bit inferior de la dirección (anteriormente un error de alineación en proceso) y lo usó para cambiar a un segundo banco de memoria. ¡Pruébalo sin lógica de alineación! 🙂

Porque es más eficiente.

En su ejemplo, la CPU tendría que hacer dos lecturas: tiene que leer la primera mitad, luego leer la segunda mitad por separado y luego volver a ensamblarlas para hacer el cálculo. Esto es mucho más complicado y más lento que hacer la lectura de una sola vez si los datos se alinearon correctamente.

Algunos procesadores, como x86, pueden tolerar el acceso a datos desalineados (por lo que aún necesitaría los 32 bits); otros, como Itanium, no pueden manejar los accesos a datos desalineados y se quejarán de manera bastante espectacular.

  • Gracias por su respuesta. Acabo de agregar algo a mi publicación.

    – smwikipedia

    7 de septiembre de 2010 a las 5:17

La alineación de palabras no solo se presenta en las CPU

A nivel de hardware, la mayoría de los módulos RAM tienen un tamaño de palabra determinado con respecto a la cantidad de bits a los que se puede acceder por ciclo de lectura/escritura.

En un módulo que tuve que interconectar en un dispositivo integrado, el direccionamiento se implementó a través de tres parámetros: El módulo se organizó en cuatro bancos que podían seleccionarse antes de la operación RW. cada uno de estos bancos era esencialmente una gran tabla de palabras de 32 bits, que podía ser direccionada a través de un índice de filas y columnas.

En este diseño, el acceso sólo era posible por celdapor lo que cada operación de lectura devolvió 4 bytes y cada operación de escritura esperaba 4 bytes.

Un controlador de memoria conectado a este chip RAM podría diseñarse de dos maneras: ya sea permitiendo el acceso sin restricciones al chip de memoria usando varios ciclos para dividir/combinar datos no alineados hacia/desde varias celdas (con lógica adicional), o imponiendo algunas restricciones sobre cómo se puede acceder a la memoria con la ganancia de una complejidad reducida.

Como la complejidad puede impedir la mantenibilidad y el rendimiento, la mayoría de los diseñadores eligieron este último [citation needed]

¿Ha sido útil esta solución?