¿Qué son las unidades Load/Store en CPU y GPU y para que sirven?

¿Qué son las unidades Load/Store en CPU y GPU y para que sirven?

Josep Roca

Una de las piezas esenciales de toda arquitectura son las unidades Load-Store, las cuales se encargan de ejecutar las instrucciones relativas a memoria tanto en CPU como en GPU. Si queréis saber cuál es la función y cómo funcionan estas unidades de manera simple y accesible entonces seguid leyendo.

La comunicación de la CPU con la memoria es importante, aquí en HardZone hemos hecho varios artículos para explicar los diferentes elementos y ahora es el turno de las unidades Load-Store, las cuales son esenciales y por tanto imprescindibles en cualquier arquitectura tanto de CPU como de GPU.

¿Qué son las unidades Load-Store?

Load-Store Unit

Se trata de una unidad de ejecución en una CPU, las unidades de ejecución son aquellas que se utilizan para resolver una instrucción una vez esta ha sido descodificada. Recordemos de paso que existen los otros tipos de unidades de ejecución:

  • ALUs: son diferentes tipos de unidades que se encargan de ejecutar diferentes tipos de operaciones aritméticas. Pueden trabajar con un solo número, una cadena de números o incluso en matriz.
  • Unidad de salto: estas unidades toman las instrucciones de salto en el código, que consisten en que la ejecución se mueve a otra parte de la memoria.

Las unidades Load/Store en cambio son las encargadas de ejecutar las instrucciones relativas al acceso a la memoria RAM del sistema, ya sean de lectura como de escritura. No existe una unidad L/S, sino que son dos tipos de unidades que funcionan en paralelo y que gestionan el acceso a los datos.

La descripción más simple de su funcionamiento es la siguiente: una unidad Load se encarga de almacenar la información desde la memoria RAM a los registros y una unidad Store lo hace en sentido inverso. Para su funcionamiento hacen tienen una memoria propia para este tipo de unidades, donde almacenan las peticiones a memoria de cada instrucción.

¿Dónde se encuentran las unidades Load-Store?

Load-Store localización

Lo primero que podemos pensar es que las unidades Load/Store se encuentran lo más cercanas al procesador posible, pero pese a que su trabajo es el de mover datos desde la RAM a los registros no tiene acceso directo a la RAM, sino que de eso se encarga otro mecanismo del que ya os hablamos en: «Así es como la CPU accede a la memoria RAM tan rápidamente«, donde os hablamos de la comunicación de la interfaz de memoria de la CPU con la RAM.

En su concepción más simple, las unidades Load/Store se comunican con las interfaces que comunican al procesador con la memoria RAM, en concreto con los registros MAR y MDR, y son las únicas unidades con permiso de manipular dichos registros, así como de trasladar los datos a los diferentes registros para la ejecución de ciertas instrucciones.

Por lo tanto, las unidades Load/Store no se sitúan en la parte más cercana a la memoria, sino que se encuentran a medio camino entre los registros de los registros de las diferentes unidades de ejecución y la interfaz de memoria que en todo procesador se encuentra en perímetro.

Añadiendo una jerarquía de cachés

Cache primer nivel spllit

La memoria caché no es más que memoria interna al procesador que copia los datos más cercanos a donde se encuentra la ejecución del código en ese momento. Cada nuevo nivel de la jerarquía tiene mayor capacidad de almacenamiento, pero a la misma vez es más lenta y tiene mayor latencia. En cambio en el camino inverso, cada nivel de caché contiene una porción solo de la anterior, pero es más rápida y de menor latencia.

En las CPU actuales todos los niveles contienen información de las instrucciones y los datos en una misma memoria excepto en un nivel que es la caché de nivel más bajo. Donde hay una caché para instrucciones y otra para datos. Las unidades Load/Store no interactúan jamás con la caché de instrucciones, sino con la de datos.

LSU Data Cache

Cuando las unidades Load dentro de cada núcleo necesitan un dato, lo primero que hacen es “preguntar” a la caché de datos si contienen la información de cierta dirección de memoria. La operación es solo de lectura por lo que si la encuentran entonces la copiarán de la caché al registro correspondiente. Si en un nivel de caché no la encuentra ira bajando nivel por nivel. Pensad en ello como alguien que busca un documento un edificio de oficinas piramidal, donde cada nivel tiene más ficheros a buscar.

En cambio, las unidades Store son un poco más complejas, también realizan la búsqueda de una dirección de memoria en la caché, pero desde el momento en que hablamos de modificar el dato que alberga en su interior es necesario que haya un sistema de coherencia que cambie la referencia a esa dirección de memoria en toda la jerarquía de la caché y en la propia memoria RAM.

¿RISC = Load-Store?

RISC vs CISC

Una vez hemos aprendido que hacen las unidades Load/Store hay que darles contexto histórico y es que no son la única forma en la que una CPU puede acceder a la RAM del sistema para cargar y almacenar datos.

El concepto Load-Store está relacionado con los sets de registros e instrucciones del tipo RISC, donde el set de instrucciones es reducido y una forma de hacerlo es separar el proceso de acceso a la memoria de las diferentes instrucciones en otra instrucción, como varias instrucciones van a tener un proceso de acceso a la memoria similar se hace uso de las unidades Load/Store para llevar a cabo esa parte.

Las consecuencias ya las conocemos, el código binario de los programas para sets de instrucciones CISC terminan teniendo un binario más compacto y de menor tamaño, mientras que las unidades RISC lo tienen de mayor tamaño. Hay que tener en cuenta que en los inicios de la informática la RAM era muy cara y escasa y era importante mantener el código binario lo más reducido posible. A día de hoy todas las CPU x86 son Post-RISC, debido a que a la hora de descodificar las instrucciones x86 lo hacen en una serie de microinstrucciones que le permiten a la CPU funcionar como si fuese una CPU RISC.

Las LSU en las GPUs

NVIDIA GPU

Pues sí, las GPUs también tienen unidades Load/Store, las cuales se encuentran en las Compute Units y se encargan de buscar los datos que las ALUs de esta tiene que ejecutar. Hay que recordar que las Compute Units de AMD, Sub-Slices de Intel o los Stream Multiprocessors de NVIDIA en el fondo son diferentes significantes para una misma cosa, los núcleos de la GPU donde se ejecutan sus programas, conocidos coloquialmente como shaders.

Las diferentes ALUs de una Compute Unit suelen trabajar a nivel de registro la mayoría de veces, esto significa que la instrucción viene con el dato a operar de manera directa, pero algunas instrucciones hacen referencia a datos que no encuentran en los registros, por lo que es necesario buscarlos a través de las cachés.

El sistema de búsqueda de datos es el mismo que en las CPU, primero mira en la caché de datos de cada Compute Unit y va bajando hasta llegar al final de la jerarquía de memoria hasta donde la GPU puede acceder. Esto es esencial de cara al acceder a datos de gran tamaño como por ejemplo los mapas de textura.

Función fija en las GPUs y unidades Load-Store

Esquema SM NVIDIA Turing

Algunas de las unidades situadas en las Compute Unit hacen uso de las unidades Load-Store para comunicarse con la GPU, dichas unidades no son ALUs, sino unidades independientes de función fija o aceleradores. A día de hoy existen dos tipos de unidades que hacen uso de las unidades Load/Store en una GPU:

  • Las unidades de filtrado de texturas
  • La unidad encargada de calcular la intersección de los rayos en el Ray Tracing

Dado que estas unidades necesitan acceder a la caché de datos para obtener los ídem como parámetros de entrada para realizar su función. La cifra de unidades Load/Store en una Compute Unit es variable, pero suele ser igual o mayor a 16, ya que tenemos 4 unidades de texturas que requieren 4 datos para realizar el filtro bilineal.

De la misma manera, los datos de los nodos de los árboles BVH se almacenan en los diferentes niveles de caché. En algunos casos concreto, como en las GPU de NVIDIA, las unidades para el Ray Tracing tienen una LSU interna que lee de la caché L0 del propio RT Core.