Arquitecturas de Memoria Compartida y Distribuida
Memoria Compartida
- Extiende el sistema de memoria para soportar múltiples procesadores.
- La organización es atractiva para:
- Multiprogramación de alta productividad.
- Computación paralela (facilidad de programación).
- La comunicación es implícita: operaciones de lectura/escritura en variables globales.
- Los accesos a memoria global desde diferentes procesadores no están ordenados.
- La sincronización permite establecer ordenamientos parciales.
- La comunicación entre procesos/tareas se realiza mediante la jerarquía de memoria.
- Es importante eliminar el tráfico de memoria innecesario.
Memoria Distribuida
- Memoria asociada a cada procesador.
- Acceso privado.
- Red de Interconexión.
- Intercambio de información entre procesadores.
- Alternativas para la RI:
- Las mismas que para MMC -> problemas de escalabilidad.
- Utilizar enlaces punto a punto entre procesadores:
- Problemas de encaminamiento.
- Rendimiento = f (topología de la red).
Arquitecturas UMA y NUMA
UMA (Uniform Memory Access)
- Todos los procesadores tienen igual tiempo de acceso a la Memoria compartida.
- Todos se conectan a la memoria a través de un bus.
- La red de interconexión permite soportar un número considerable de procesadores.
- Debe soportar el tráfico de memoria para resolver TODOS los fallos caché.
- No debe ser muy profunda la red para no aumentar la latencia.
NUMA (Non-Uniform Memory Access)
- El tiempo de acceso de cada procesador depende de la ubicación del elemento de proceso y la memoria.
- La red de interconexión permite soportar un número bastante elevado de procesadores.
- Debe soportar el tráfico de memoria para resolver sólo los fallos caché que NO corresponden a la memoria local.
- No debe ser muy profunda la red para no aumentar la latencia.
Coherencia de Caché
El Problema de la Coherencia de Caché
- Las cachés juegan un papel clave en el acceso a los datos
- Reducen la latencia media de acceso.
- Reducen el ancho de banda medio en el bus.
- Las cachés privadas en cada procesador introducen un problema
- Pueden encontrarse copias de la misma variable en diversas cachés.
- Escrituras por un procesador pueden no hacerse visibles al resto de los procesadores (fallo de comunicación).
- Esto constituye el problema de la coherencia caché.
- ¿Cómo resolver el problema de coherencia caché?
- Organizar la jerarquía de memoria de manera que se elimine el problema.
- Mantener la jerarquía de memoria e incorporar mecanismos que detecten y corrijan el problema.
Protocolo MESI
- Las operaciones de memoria y las transacciones en el bus son atómicas.
- La memoria debería actualizarse sólo cuando desaparecen las copias de un bloque en todas las cachés del sistema.
- Sin embargo, el protocolo MESI provoca una actualización (BusWB) cuando algún procesador lee un bloque modificado por otro: Esta actualización es realmente innecesaria (sin embargo, hay que hacerlo, pues el estado S implica que la memoria está actualizada).
Invalidar
- Una escritura provoca una situación de exclusividad en el bloque caché.
- Otra escritura local no provoca tráfico en el bus.
- Las escrituras se propagan cuando hay un fallo caché en el sistema.
- La escritura se termina cuando se actualiza la caché local.
Actualizar
- Una escritura actualiza las copias del mismo bloque en otras cachés.
- No se producen fallos caché cuando se accede de nuevo a ese bloque.
- Una sola transacción de bus propaga una escritura a varias cachés.
- Múltiples escrituras provoca múltiples actualizaciones MOESI.
Protocolo MOESI
- Eliminación de las actualizaciones de memoria innecesarias (MESI) Definiendo un nuevo estado, O (propietario).
- Cinco estados para cada bloque de caché:
- I: estado inválido
- S: estado compartido (posiblemente, dos o más cachés tienen copia y la memoria puede ser coherente o no)
- E: estado exclusivo no modificado (ninguna otra caché tiene copia y la memoria es coherente)
- O: estado propietario (posiblemente, dos o más cachés tienen copia en estado S y la memoria es incoherente)
- M: estado exclusivo modificado (ninguna otra caché tiene copia y la memoria es incoherente)
Caché No Bloqueante
- Los fallos caché se resuelven sin bloquear la caché.
- Pueden procesar múltiples aciertos y fallos concurrentemente.
- La resolución de fallos se solapan con otros fallos y con computación.
Caché Uniprocesador
Caché Compartida
- L1 es privada para minimizar la latencia de acceso.
- L2 es compartida entre los núcleos.
- No se duplican los datos compartidos en la L2.
- El espacio L2 se asigna a los núcleos dinámicamente (según demanda).
- Interferencia entre los datos accedidos por diferentes núcleos.
- Cachés compartidas grandes tienen latencia alta.
Caché Privada
- L1 y L2 son privadas.
- No hay interferencia entre los datos accedidos por diferentes núcleos.
- Las cachés L2 privadas tiene menos latencia.
- Se duplican los datos compartidos en la L2.
Caché Compartida/Privada
Cuando el número de núcleos es amplio, una solución parcialmente compartida puede ser la mejor opción.
Caché Centralizada
- Si la caché compartida es grande, se divide en bancos interconectados en red, pero ubicados de forma compacta en el chip.
- El directorio para localizar los datos puede estar centralizado o distribuido en controladores asociados a cada banco.
- La caché compartida constituye una estructura centralizada en el chip:
- Se simplifica el movimiento de datos entre bancos.
- Se simplifica la conexión de la caché compartida con el controlador de memoria.
Caché Distribuida
- Los bancos de la caché compartida se distribuyen físicamente en el chip.
- Cada banco se ubica próximo físicamente a un núcleo.
- El conjunto núcleo – caché L1 – banco caché L2 se denomina tile (segmento).
- Facilita el diseño escalable (replicación de segmentos) y la verificación.
- Sin embargo, la latencia de acceso a los datos compartidos es mayor.
- Tiene un mejor comportamiento térmico y escalabilidad que la solución centralizada.
Caché Uniforme y No Uniforme
Programación de MMD (Memoria Distribuida)
- Descomposición en tareas + Distribución de datos.
- Estática: Programador
- Comunicaciones.
- librerías de paso de mensajes
- Ej. MPI (Message Passing Interface)
- Planificación de tareas
- Programador + SO
- Estática (sobrecarga excesiva en la dinámica)
- Objetivos:
- Mínima comunicación
- Máxima concurrencia
Tipos de MMD
- MPP (Massively Parallel Processor)
- máquinas con cientos o miles de procesadores
- COW (Cluster of Workstations)
- cada nodo es una estación de trabajo o PC
- Constellation (Cluster of SMPs)
- Cada nodo es un multiprocesador simétrico.
- Cluster: conjunto de computadores construidos mediante el uso de hardware común y que se comportan como si fuesen una única computadora.
- De alto rendimiento HPC
- De balanceo de carga LBC
- De alta disponibilidad
Coherencia Escalable
Problemas con la Coherencia Escalable
- En general, la coherencia es más compleja de hacer cumplir en un sistema escalable
- Las transacciones de red no son visibles globalmente (propagación de escrituras).
- No hay un árbitro de red global que permita serializar las escrituras.
Solución Básica Basada en Directorios
- Las transacciones de red no son visibles globalmente y no existe un bus común a todos los nodos, por lo que debemos introducir un nuevo recurso hardware que nos dé información global sobre las copias caché de los bloques de memoria: Directorio.
- Funcionalidad de un directorio
- Cada bloque de memoria tiene asociado una entrada en el directorio, que guarda Información sobre el estado y ubicación de las las copias caché de cada bloque de memoria.
- Las operaciones de lectura y escritura modifican la información de estado mediante transacciones de red.
- Ejemplo de operación
- Cuando se produce un fallo caché, el nodo peticionario envía una transacción de red al módulo de memoria correspondiente.
- Antes de acceder a la memoria, se busca en el directorio información sobre el bloque caché fallado.
- Esta información se utiliza para enviar nuevas transacciones de red a los nodos oportunos.