coherencia en memoria

41
Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores MULTIPROCESADORES En el capitulo 7 se clasificaron los computadores con múltiples procesadores, en función de la organización del sistema de memoria en dos grupos: multiprocesadores o computadores paralelos en los que todos los procesadores comparten el mismo espacio de direcciones y multicomputadores o computadores paralelos en los que cada procesador tiene su espacio de direcciones particular. Estos grupos se han comparado en algunos de sus aspectos de diseño y en los que respecta a la diferencia en el estilo de programación al que esta mas orientada su implementación. En multiprocesadores, como todos los procesadores comparten el mismo espacio de direcciones, la comunicación entre ellos se lleva a cabo a través de la memoria común. Como se comentaba en el Capitulo 8, el sistema de comunicación en multiprocesadores ofrece una visión global de la memoria, formando parte, del sistema de memoria. En un sistema uniprocesador, el programador espera que el sistema de memoria proporcione al leer en una dirección, el último valor escrito en la misma, según el orden de las instrucciones especificado en el código (orden del programa). Igualmente, en el multiprocesador, se espera que el sistema de memoria proporcione al leer en una dirección, el ultimo valor que se ha escrito en dicha dirección (por el mismo procesador que lee o por otro procesador), según el orden que asegura el sistema de memoria (modelo de consistencia de memoria) y el forzado explícitamente por el programador con código adicional de sincronización. El

Upload: olinda-atoche-chauca

Post on 27-Jun-2015

796 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

MULTIPROCESADORES

En el capitulo 7 se clasificaron los computadores con múltiples procesadores, en función de la

organización del sistema de memoria en dos grupos: multiprocesadores o computadores paralelos

en los que todos los procesadores comparten el mismo espacio de direcciones y multicomputadores

o computadores paralelos en los que cada procesador tiene su espacio de direcciones particular.

Estos grupos se han comparado en algunos de sus aspectos de diseño y en los que respecta a la

diferencia en el estilo de programación al que esta mas orientada su implementación. En

multiprocesadores, como todos los procesadores comparten el mismo espacio de direcciones, la

comunicación entre ellos se lleva a cabo a través de la memoria común. Como se comentaba en el

Capitulo 8, el sistema de comunicación en multiprocesadores ofrece una visión global de la

memoria, formando parte, del sistema de memoria. En un sistema uniprocesador, el programador

espera que el sistema de memoria proporcione al leer en una dirección, el último valor escrito en la

misma, según el orden de las instrucciones especificado en el código (orden del programa).

Igualmente, en el multiprocesador, se espera que el sistema de memoria proporcione al leer en una

dirección, el ultimo valor que se ha escrito en dicha dirección (por el mismo procesador que lee o

por otro procesador), según el orden que asegura el sistema de memoria (modelo de consistencia de

memoria) y el forzado explícitamente por el programador con código adicional de sincronización.

El presente capitulo estudia aspectos de diseño particulares de multiprocesadores derivados del

espacio de memoria compartido mantenimiento de coherencia en el sistema de memoria, modelo

de consistencia de memoria, mecanismos de sincronización entre otros del cual solo tomaremos el

primero.

Page 2: Coherencia en Memoria

Pj

Cj

PkD=4

Ck

-34

2E

Memoria

3D

1L

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

10.1 MANTENIMIENTO DE COHERENCIA EN EL SISTEMA DE MEMORIA

En el primer apartado de esta sección se describe el problema de mantenimiento de coherencia. Ademas se presentan las facetas de diseño de un protocolo de mantenimiento de coherencia y se clasifican los protocolos en dos grupos: protocolos de espionaje (snooping protocols) y protocolos basados en directorios. Los siguientes apartados se dedican a estudiar estos dos tipos de protocolos.

10.1.1 Problema de coherencia y espacio de diseño La utilización de jerarquía de memoria con el fin de acercar la velocidad de acceso a memoria a la velocidad del procesador, posibilita que pueda haber varias copias en el sistema de memoria de la misma dirección (bloque de memoria). Esto puede ocurrir tanto en sistemas multiprocesadores como en sistemas uniprocesador. El sistema de memoria incluye caches, memoria principal, controladores, buffer (buffer de escritura, buffer para combinar escrituras, etc.) y también el medio para comunicar estos componentes (red de interconexión).

Si en el sistema de memoria las copias de una dirección no tienen el mismo contenido, tendremos una incoherencia en el sistema de memoria. La falta de coherencia en el sistema de memoria puede provocar problemas si los componentes del sistema (dispositivos de E/S, procesadores) se comunican entre si a traces de posiciones de memoria (escribiendo y leyendo en posiciones de memoria) . No se podrá conseguir llevar a cabo satisfactoriamente la comunicación si el componente que recibe no lee a través de la dirección de memoria a la que accede lo último que se ha escrito. En sistemas con un único componente con caché, se puede dar una situación de incoherencia entre memoria caché y la memoria principal. En sistemas con múltiples componentes con caché, además, puede haber incoherencia entre distintas caches

En el ejemplo de la figura 10.1, el procesador Pk lee la posición de memoria D (1L), lo que provoca que el bloque de memoria donde se encuentra esta dirección se copie a su cache. Tras la transferencia, el contenido de la posición de memoria D en la cache es 3, coincide con el contenido de la dirección en memoria principal. Si a continuación Pk escribe un nuevo valor, 4, en la dirección D (2E), escribirá en la copia de la dirección que tienen en su caché. Tendremos entonces una incoherencia en el sistema de memoria, ya que la posición D no tiene el mismo contenido en memoria principal y en la caché.

Figura 10.1

Page 3: Coherencia en Memoria

Pi

Ci

Memoria

3D

Pj

Cj

3 D

1L2L

3E

PkD=4

Ck

-34 D

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

En el ejemplo de la figura 10.2, dos procesos que se ejecutan en procesadores distintos, Pk y Pj, acceden a una dirección D que comparten y que además pueden modificar. Primero leen (1L y 2L) el contenido de la dirección de memoria D, lo que provoca los correspondientes fallos de caché y la transferencia del bloque de memoria donde se encuentra la dirección a la cache de los procesadores. A continuación, uno de ellos, Pk, , escribe en D, pasando el contenido de D en su cache a 4. Como consecuencia se produce una falta de coherencia en el sistema de memoria entre la cache de Pj y Pk, además de una falta de coherencia con la memoria principal. Si, además, un dispositivo de E/S se escribe en la posición D, modificara la copia de memoria. Entonces ninguna de las 3 copias de D en el sistema tendrá el mismo contenido. En el ejemplo de la Figura 10.3, tres procesadores, Pk, Pj y Pi, escriben en secuencia en una misma dirección, y como resultado, las cuatro copias en el sistema relativas a la misma dirección tienen distinto contenido.

Figura 10.2

A continuación se presentan algunos ejemplos que destapan situaciones de incoherencia en el sistema de memoria. En la tabla 10.1 se resumen estos ejemplos. La falta de coherencia entre caché y memoria principal que se muestra en las Figuras 10.1, 10.2 o 10.3 se podrá de manifiesto si un dispositivo de E/S lee la posición de memoria D, ya que accedería al valor no actualizado de la memoria. En estos ejemplos, la falta de coherencia entre cache y memoria principal, también se hace visible si alguna caché del sistema falla al acceder a la dirección compartida D, por ejemplo la cache de Pi en la figura 10.2, ya que leería el contenido no actualizado de la memoria.

Page 4: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

TABLA 10.1 Tipos de estructuras de datos, falta de coherencia y ejemplos de causas que ocasionan problemas si hay una falta de coherencia, C denota caché y MP memoria principal.

Clases de estructuras de datos Falta de coherencia Causa que ocasiona problemas si hay falta de coherencia

Datos modificables C-MP E/SDatos modificables compartidos entre procesos

C-MP Fallo de caché

Datos modificables privados a un proceso

C-MP Emigra procesofallo de caché

Datos modificables compartidos entre procesos

C-C Lectura de caché no actualizada

También pueden dar problemas las situaciones de incoherencia entre caché y memoria principal para datos modificables privados de un proceso si el sistema operativo permite que los procesos migren de un procesador a otro. Supongamos que en el ejemplo de la figura 10.1, el proceso en Pk que acaba de modificar D en su caché, emigra al procesador Pj. Si e Pj el proceso accede a D, leería de memoria un contenido no actualizado.

La falta de coherencia entre cachés de la figura 10.2 o de la figura 10.3, provocada al modificar un dato compartido, se hace patente si, por ejemplo, el proceso Pj vuelve a leer el contenido de D, ya que el valor que obtiene, es el contenido no actualizado de su caché.

Hay dos métodos de actualización de Memoria Principal utilizados en cachés: escritura inmediata (write-through) y posescritura (write-back). Con escritura inmediata, siempre que se modifica una dirección en caché de un procesador, se modifica en memoria principal. Cada escritura supone entonces la utilización de la red, y, además, para transferir datos aislados, con el consiguiente desaprovechamiento del ancho de banda de la red.

La situación del tráfico empeora en sistemas con múltiples procesadores, ya que puede haber varios procesadores escribiendo simultáneamente. Dado que es probable que en una aplicación se escriba varias veces en un bloque (a las variables contiguas en el código del programa se les asigna posiciones consecutivas de memoria), en la misma dirección i en distintas direcciones (principios de localidad temporal y espacial), se incrementarían entonces las prestaciones si el bloque se transfiere por la red una vez realizadas todas las modificaciones (se disminuye el número de accesos, y cuando se accede, se aprovecha en mayor medida el ancho de banda de la red). Con escritura inmediata se opta por no provocar incoherencia entre cache y memoria principal cuando se escribe en caché; pero no obstante, no se evita la incoherencia entre cachés, o entre caché y memoria cuando escribe en memoria principal algún componente. Con posescritura, cuando un procesador modifica una dirección solo se escribe la caché del procesador; el dato no se transfiere a memoria principal, por lo que se puede escribir varias veces en un bloque sin acceder a memoria principal. La actualización de memoria se realiza

Page 5: Coherencia en Memoria

Memoria

3D

1E

PkD=4

Ck

-34 D

2E

PjD=6

Cj

-36 D

3E

PiD=5

Ci

-35

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

posteriormente, cuando el bloque que contiene la dirección modificada se elimina de caché a fin de dejar espacio para otro bloque. Se debe, pues, mantener información en el directorio caché sobre los bloques de memoria modificados en la caché. Utilizando posescritura, en lugar de escritura inmediata, se permite que aparezcan incoherencias ente caché y memoria también cuando se escribe en caché. En definitiva, la situación empeora con posescritura frente a escritura inmediata. Por ejemplo, supongamos un sistema con cachés de posescritura, aunque la red garantice orden en las transferencias, el orden en el que se transfieren a memoria una seria de escrituras en una dirección en caché por parte de distintos procesadores, dependerá del orden en el que se produzcan los reemplazos en las cachés, pero no del orden en el que se haya escrito en la dirección (Ejemplo de la figura 10.3)

La falta de coherencia entre cachés, y los problemas debidos a la incoherencia entre memoria principal y cache, se pueden solventar con hardware específico de coherencia.

Existen alternativas para abordar incoherencias entre caché y memoria principal cuando hay algún componente en el sistema que no tiene hardware especifico de mantenimiento de coherencia. Por ejemplo, se puede evitar la falta de coherencia, declarando las zonas de memoria implicadas en la comunicación con estos componentes como <<no cacheables>> (bloques no transferibles a caché), o con escritura inmediata (para dispositivos de salida). Otra posibilidad es eliminar los problemas por falta de coherencia cuando el componente implicado va a acceder a los datos, utilizando para ellos instrucciones que desalojan líneas de la caché trasladándolas a la memoria si esta no esta actualizada (flush). Los programadores de bajo nivel (lenguaje maquina o ensamblador) y de alto nivel, deberían conocer las peculiaridades de la arquitectura abstracta del procesador relacionada con la memoria (instrucciones flush, instrucciones para cambiar de tipo zonas de memoria, por ejemplo, para cambiar a no cacheable) para abordar de la forma mas eficiente posible la comunicación entre componentes a través dl sistema de memoria.

Figura 10.3

Como ya se ha apuntado, en sistemas con múltiples cachés, como los multiprocesadores, puede haber falta de coherencia entre cachés, tanto si se utiliza escritura inmediata como si se utiliza posescritura. Los protocolos de coherencia de caché resuelven este problema haciendo que cada

Page 6: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

escritura sea visible a todos los procesadores, propagando de forma fiable un nuevo valor escrito en una dirección. Los protocolos de coherencia de caché utilizan dos alternativas para propagar una escritura: escritura con actualización (write-update), y escritura con invalidación (write-invalidate). Si se utiliza escritura con actualización, siempre que se modifica una dirección en la copia de un bloque en la caché de un procesador, se modifica la dirección en todas las copias del bloque que se encuentren en cachés de otros procesadores.

Si se utiliza escritura con invalidación, cuando se va a modificar una dirección en la caché de un procesador, primero se invalidan las copias del bloque que contiene esa dirección en otras cachés. De esta forma, el procesador que va a modificar una dirección, primero obtiene acceso exclusivo al bloque que la contiene. Cuando a continuación otro procesador lea la dirección, su caché falla, provocando que tenga que acceder a memoria principal, consiguiendo asi el dato actualizado. El acceso exclusivo pretende asegurar que no hay otras copias del bloque en cachés de otros procesadores que se puedan leer o escribir cuando se esta realizando la escritura. Invalidar es más rápido que actualizar, ya que solo se debe transferir la dirección (bloque) en la que se va a escribir, mientras que al actualizar, se deben transferir además los datos a escribir. Obsérvese que usando la invalidación solo se permite compartir un bloque de memoria mientras se lee el bloque.

Si se escribe varias veces sucesivas en un bloque sin que otro procesador lea, usando invalidación se puede reducir el acceso a la red (transferencias) frente ala política de actualización, ya que una vez invalidado un bloque, nuevas modificaciones del bloque por parte del mismo procesador no originan transferencias. Por contra, si se escribe para que a continuación otros u otros procesadores lean lo escrito, podría se mas eficiente actualizar, ya que al invalidad las copias en otras cachés cuando se escribe, la lecturas posteriores de esa dirección por otros procesadores provocan fallos de caché, lo que origina trafico en la red. Obsérvese que en un bus estos fallos de caché provocan cada uno una transferencia del bloque a través del bus. Sin embargo, con actualización, al modificar el bloque en la caché, se actualizan el resto de cachés con un único acceso a través del bus con el que se difunde el bloque. La escritura con actualización no presenta este beneficio en redes que no implementan difusión. En general, la política de actualización genera un tráfico innecesario cuando los datos compartidos se leen por pocos procesadores.

Hay que tener en cuenta que puede ocurrir que la propagación de una escritura a todos los procesadores a través del sistema de comunicación, requiera un tiempo no predecible distinto por cada procesador. Entonces, si se solapan varias propagaciones de escrituras de la misma dirección, distintos procesadores podrían recibir y leer en distinto orden las escrituras en la dirección. Esto haría al sistema incoherente, aunque propaga las escrituras. Debe tenerse en cuenta por ejemplo, que hay redes de interconexión que no garantizan que los paquetes lleguen al destino en el mismo orden en el que se inyectaron en la red; e, incluso, hay redes que no garantizan ni tan siquiera un orden en las transferencias punto-a-punto (misma fuente y mismo destino). Por otra parte, el buffer entre la red y una caché también puede reordenar operaciones de memoria entrantes.

Page 7: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

Para que el sistema de memoria de un multiprocesador sea coherente, los resultados de cualquiera ejecución de un programa deben ser tales que, para cualquier dirección, sea posible generar un orden serie en los accesos a dicha dirección (es decir, generar un orden global entre todas las lecturas y escrituras emitidas respecto a dicha dirección), que sea consistente con los resultados de la ejecución (valores devueltos con lecturas) y en el que a) los accesos generados por cualquier proceso particular ocurran en el orden en el que han sido emitidos al sistema de memoria por este proceso, y b) el valor obtenido por cualquier acceso de lectura sea el ultimo valor escrito en esa dirección en el orden serie. Esta definición de coherencia de caché requiere que se cumplan dos condiciones para garantizarla: 1) la escritura en una dirección se debe hacer visible en un tiempo finito (no se especifica cuando) a otros procesadores (propagar escrituras) y 2) las escrituras en una misma dirección deben verse en el mismo orden por todos los procesadores (un proceso/ procesador <<ve>> un valor escrito emitiendo una operación de lectura). El segundo punto supone que el sistema de memoria debe realizar en serie (una detrás de otra) las operaciones de escritura en la misma dirección, para que así todos los procesadores vean estas escrituras en el mismo orden (serializar escrituras).

Una forma de obtener un orden en las escrituras en una dirección consiste en asegurar que todas las actualizaciones o invalidaciones de esa dirección parten del mismo punto del sistema de comunicación, y si es necesario, no comenzar una nueva escritura (no emitir nuevas actualizaciones o invalidaciones) hasta no haber recibido reconocimientos de las actualizaciones o invalidaciones de la escritura anterior de todas las cachés con copa (así se asegura que la escritura anterior ha terminado con respecto a todos los procesadores).

Las comunicaciones uno-a-muchos para actualizar o invalidar las copias del bloque que se modifica, se pueden implementar cómodamente en un bus, ya que admite la difusión de forma natural. En buses se utilizan para mantener la coherencia protocolos de espionaje (snoopy) que aprovechan que todos los componentes conectados al bus pueden ver (espiar) el contenido del bus. El controlador de caché espía los paquetes en el bus y actúa en consecuencia (por ejemplo, invalidando o actualizando la copia que tienen de un bloque). En el bus es sencillo implementar coherencia, ya que 1) todas las transferencias que aparecen en el son visibles a todos los controladores de caché (propagación), y 2) las transferencias son visibles a todos los controladores en el mismo orden, el orden en el que aparecen en el bus (serialización). Pero los esquemas de espionaje no escalan bien debido a los retardos que supone tener que esperar a que todas las cachés vean las peticiones en el bus (ocupación del bus por las peticiones) y a que se debe atender peticiones de todos los componentes del sistema.

En redes en las que la difusión es costosa de implementar o en la que se requiera una mayor escalabilidad, se utilizan esquemas basados en directorios, en los que, para reducir el trafico, se envían los paquetes únicamente a las cachés implicadas (cachés con copia del bloque al que se accede). La información sobre las cachés con copia de un bloque se mantiene en un directorio asociado a la memoria principal. Los protocolos basados en directorios aparecieron antes que los basados en espionaje. Inicialmente se propuso in directorio centralizado con información de todos los bloques de la memoria principal. Pero este directorio centralizado monolítico supone un cuello de botella al igual que el bus (debe atender a todas las peticiones) Se obtienen mejores

Page 8: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

prestaciones distribuyendo el directorio entre los módulos de memoria principal; el subdirectorio de cada modulo mantiene información solo son de los bloques que contiene el modulo. Los diferentes subdirectorios procesan peticiones en paralelo.

El hecho de que las operaciones de acceso a memoria tengan que llegar al directorio para obtener información de un bloque (cachés con copia), permite poder utilizar el directorio para establecer un orden entre accesos a una misma dirección (serializar), de forma que todos los procesadores vean este mismo orden. No obstante, para establecer un orden en algunos sistemas se pueden necesitar paquetes de reconocimiento de actualizaciones o invalidaciones que confirmen que ha finalizado una escritura anterior (como se comento mas arriba), e información de estado para el bloque en el directorio que informen sobre si esta o no pendiente de terminar un acceso (esperando reconocimientos). Veamos un ejemplo con protocolo de actualización. Supongamos que llegan al directorio dos escrituras a una dirección. Las dos originan el envío de paquetes de actualización desde el directorio a las cachés con copia. El directorio genera los paquetes de actualización de las dos peticiones en el orden en las que las atiende. Si el sistema de comunicación garantiza un orden en los paquetes enviados entre dos puntos (enviados entre una misma fuente y un mismo destino), entonces el orden en el que todos los procesadores van a ver las escrituras seria el orden en el que se atienden en el directorio. Sin embargo, si la red no garantiza un orden en los paquetes enviados entre dos nodos de red, las actualizaciones pueden llegar a alguna cache en distinto orden en las escrituras. Si la red no garantiza un orden en los paquetes entre 2 puntos, se podrían utilizar paquetes de reconocimiento de actualización para detectar que ha finalizado una escritura, de forma que el directorio no debería emitir nuevas actualizaciones de una escritura hasta haber recibido los reconocimientos de la escritura anterior en la misma dirección.

También se pueden encontrar esquemas de coherencia de cache organizados en jerarquías compuestos por protocolos de espionaje y directorios, según la red utilizada en cada nivel. En la siguiente tabla se resumen las facetas de diseño generales de un protocolo para mantenimiento de coherencia de sistemas con múltiples caches en el que se mantiene coherencia en el sistema de memoria. La ejecución de una operación de lectura o escritura por el procesador del nodo deberá generar el envío de paquetes cuando el bloque donde se encuentra la dirección a la que se accede no esta en su cache en un estado valido o cuando se realiza una escritura en una dirección que esta en cache y hay copias en otras caches.Por otra parte, también se generan paquetes como consecuencia de transferencias recibidas desde otros nodos (por ejemplo, por la llegada de la petición de un bloque del que se tiene la única copia valida).

Además del estado de un bloque en la caché, se pueden definir diversos estados de un bloque en memoria que van a reflejar en el estado en caches. El estado de un bloque en memoria informa al controlador de la memoria sobre las acciones que debe realizar ante paquetes que reciba que impliquen a dicho bloque. Igualmente el estado de un bloque en cache informa al controlador de caché sobre las acciones que debe realizar ante peticiones del procesador del nodo sobre dicho bloque, paquetes recibidos con peticiones sobre dicho bloque u otros eventos que afecten al bloque.

Page 9: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

Como se indican en la tabla, en un protocolo basado en directorios, se deben, además, definir la consecuencia de transferencias punto-a –punto que se deben generar para completar un acceso a memoria (que requiere comunicación entre nodos) y los nodos que intervienen en estas transferencias

Tabla: Facetas de diseño lógico de protocolos para mantenimiento de coherencia

Espacio de diseño: Mantenimiento de coherencia (1) Política de actualización de MP

Escritura inmediata , posescritura, mixta(2) Política de coherencia entre caches

Escritura con invalidación, escritura con actualización, mixta(3) Describir el comportamiento

(3.1) Definir posibles estados de los bloques en cache y en memoria (directorio)(3.2) Definir transferencias a generar ante acciones lectura/escritura del procesador del nodo o como consecuencia de la llegada de transferencias desde otros nodos. Indicar los nodos que intervienen en las transferencias y orden entre ellas (en protocolos de espionaje no hay que indicar los nodos que intervienen, ya que se difunden los paquetes a todos los nodos)(3.3) Definir transiciones de estados para un bloque en cache y en memoria (directorio)

Los multiprocesadores UNA y CC-NUMA tienen hardware para mantenimiento de coherencia. La mayor parte de las cachés utilizan posescritura con memoria principal, e igualmente es más común utilizar escritura con invalidación, especialmente si se utilizan directorios. Los sistemas pueden ofrecer la posibilidad de utilizar diferentes políticas con diferentes bloques de memoria; así, además de bloques con posescritura, se pueden definir con escritura inmediata, o con bloques no cacheables. En NUMA se pueden declarar los datos compartidos como no cacheables. También la implementación del protocolo puede permitir cambiar de política dinámicamente (en Symmetry de Sequent, en la primera escritura en un bloque se utilizaba actualización, y en las siguientes invalidación), o utilizar distinta política según el estado del bloque en caché (implementación mixta). Para flexibilizar el cambio de política, la actualización con el tiempo y la depuración de errores, se ha propuesto la utilización de procesadores para implementar el protocolo de coherencia, es decir, como asistentes de comunicación (Stanford FLASH, Wisconsin Typhoon), tanto procesadores de propósito general como propósito especifico. Pero esta alternativa ofrece significativamente menores prestaciones que una implementación a nivel hardware del protocolo con una maquina de estado finitos [Michael, 1999].

A continuación se presentan con mas detalles los protocolos de coherencia basados en espionaje (snoopy) y los protocolos basados en directorios

Page 10: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

10.1.2. Protocolos de coherencia basados en espionaje (snoopy)

Los protocolos de espionaje se basan en la difusión de los paquetes asociados al mantenimiento de coherencia a todas las caché. Se implementan eficientemente en multiprocesadores basados en buses, ya que el bus realiza la difusión de forma natural. El hardware de coherencia asociado a las cachés puede espiar fácilmente en un bus los accesos a memoria del resto de componentes del sistema y actuar en consecuencia. Como ejemplo se estudian dos protocolos para mantenimiento de coherencia basados en invalidación: el protocolo de tres estados MSI y el protocolo de cuatro estados MESI. En su estudio se tendrán en cuentan las facetas de diseño de la Tabla 10.2.

10.1.2.1. Protocolo de invalidación de tres estados (MSI).

El protocolo de tres estados que se va a mostrar en este apartado utiliza pos escritura como política de actualización de memoria principal, y escritura con invalidación como política para mantener coherencia entre caché. El acrónimo MSI se forma concatenando las iniciales del nombre en inglés de los tres estados para los bloques en caché que incluye el protocolo. A continuación se describe el resto de facetas lógicas de diseño para una posible implementación de protocolo MSI.

Posible estado de bloques:

Un bloque en caché puede estar en alguno de los siguientes estados:

- Modificado (M). Si el bloque en la caché se encuentra en este estado, significa que es el único componente en el sistema con una copia valida del bloque; el resto de caché y la memoria tiene una copia do autorizada. La caché debe entonces proporcionar el bloque si observa al espiar el bus que algún componente lo solicita, y debe invalidarla si algún otro nodo solicita una copia exclusiva del bloque para su modificación.

- - Compartida (C, shared). Supone que todas las copias de bloque que pueda haber en el sistema, en cachés y en la memoria principal, están actualizada. La caché debe invalidar su copia si observa al espiar el bus que algún otro nodo solicita una copia exclusiva del bloque para su modificación.

- Invalido (I). Supone que el bloque no está físicamente en la caché, o si se encuentra, ha sido invalido por el controlador como consecuencia de la escritura en el bloque en otra caché.

Se puede ordenar estos estados en función del grado de propiedad o disponibilidad del bloque por parte del procesador al que pertenece la caché, de la siguiente forma (orden creciente): Inválido, Compartido y Modificado. El estado modificado supone que el procesador tiene el uso exclusivo de bloque, de forma que puede disponer él, tanto para leer como para escribir, sin informar al resto del sistema. Como en este caso la caché del procesador tiene la única copia válida del bloque en el sistema (único propietario), debe atender a las peticiones del bloque a través del bus. Mientras que el estado invalido supone que el procesador tiene que acceder al bloque a través de la red.

Page 11: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

Se podría utilizar dos estados en memoria para un bloque: válido, si tiene una copia válida, o invalida (modificador o dirty), si la copia no es la última actualizando; es decir, hay un caché que ha modificado el bloque (Estado modificado). Un estado valido para un bloque informa al controlador de memoria que puede proporcionar el bloque en caso de haber en el bus una petición que incluya la lectura de dicho bloque. La implementación puede evitar el uso de estados en la memoria con el fin de ahorrar en almacenamiento. En este caso, la memoria siempre entregaría el bloque ante una petición de lectura; no obstante, el sistema permitiría inhibir a la memoria si resulta necesario.

Transferencias que puede generar un nodo con caché.

Un nodo terminal, a través del controlador de caché, puede generar las siguientes transferencias como consecuencia de paquetes recibidos de otros nodos:

- Paquete de petición de lectura de un bloque (PtLec). Este paquete se genera como consecuencia de la lectura del procesador (PrLec) de una dirección que no se encuentra en su caché. El controlador de la caché inicia la transacción de lectura poniendo en el bus la dirección a la que se desea acceder. El sistema de memoria (memoria principal u otra caché) proporcionará el bloque donde se encuentra la dirección solicitada.

- Paquete de petición de acceso exclusivo a un bloque (PtLecEx). Como el bloque puede estar en estado inválido el paquete pedirá también la lectura del bloque; si el paquete estuviera en estado compartido, se descartará la respuesta con el bloque que esta petición provoca. Este paquete se genera como consecuencia de una escritura del procesador (PrEsc) en una dirección cuyo bloque en la caché del procesador se encuentra en estado compartido o inválido (incluyendo dentro de inválido la no presencia). El controlador del caché genera un paquete que indicará una dirección en la que se desea escribir. El resto de cachés con copias válidas del bloque invalidan sus copias. También se invalida el bloque en memoria si se encuentra en estado válido. El procesador puede solicitar una confirmación de ese paquete.

- Paquete de petición de pre escritura (PtPEsc). Este paquete lo genera el controlador de caché cuando se reemplaza un bloque modificado en la caché como consecuencia del acceso del procesador a un bloque que no se encuentra en la caché. El bloque a reemplazar generado por la circuitería de reemplazo debe transferirse a memoria principal si está en estado modificado (ya que la memoria no tiene el bloque actualizado). El controlador de la caché genera la transferencia poniendo en el bus la dirección del bloque a escribir en memoria y el contenido del propio bloque. El procesador no conoce este hecho y no espera ninguna respuesta.

- Paquete de reconocimiento con el bloque solicitado (RpBloque) por una caché. La genera un nodo que observa en el bus una petición del bloque que incluye su lectura (PtLec, PtLecEx) si el nodo comprueba que tiene la única copia válida del bloque en el sistema (es decir, el bloque está en estado modificado en su caché).

Page 12: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

Transiciones de estado de un bloque

Tabla 10.3. Tabla de estados MSI. Aparecen con fondo más oscuro las situaciones que provocan cambio de estado.

Estado inicialEvento Acción

Estado Siguiente

Modificado (M)

Procesador lee (PrLec) ModificadoProcesador escribe (PrEsc) ModificadoPaquete Lectora (PtLec)

Genera Paquete Respuesta Bloque (RpBloque) Compartido

Paquete de acceso exclusivo al bloque (PtLecEx)

Genera respuesta bloque (RpBloque) Invalida copia local Inválido

ReemplazoGenera paquete pos escritura Bloque (PtPEsc) Inválido

Compartido (S. Shared)

Proceso lee (PrLec) CompartidoProcesador escribe (PrEsc)

Genera paquete PtLecExModificado

Paquete de Lectura (PtLec) CompartidoPaquete de acceso exclusivo al bloque

Invalida Copia LocalInvalido

Invalido (I)

Procesador lee (PrLec) Genera Paquete PtLec CompartidoProcesador escribe (PrEsc) Genera Paquete PtLecEx ModificadoPaquete de lectura PtLec InvalidoPaquete de acceso exclusivo al bloque (PtLecEx) Invalido

En la tabla 10.3 y la figura 10.4 se resumen las transiciones de estado de un bloque en la caché

de un procesador como consecuencia de acciones de lectura/ escritura del procesador (PtLec,

Page 13: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

PtLecEx) y como consecuencia de paquetes que el controlador observa en el bus (PtLec, PtLecEx).

- Fallo de lectura, es decir, el procesador lee (PrLec) y el bloque no está en caché (estado inválido). El controlador de caché del procesador que lee difunde un paquete de petición de lectura de un bloque de memoria (PtLec); el estado del bloque en la caché después de la lectura será compartido. La copia del bloque en otras cachés también tendrá estado compartido, y en la memoria, válido. El paquete PtLec provoca los siguientes efectos en otras cachés:1. Si el bloque se encuentra en otra caché en estado modificado, deposita el bloque en el

bus (respuesta RpBloque) y pasa a estado compartido. La memoria también recoge el bloque del bus pasando a estado válido.

2. Si el bloque está compartido, la memoria proporciona el bloque a la caché que lo solicita. El bloque sigue en estado compartido.

- Fallo de escritura al no estar el bloque en la caché, es decir, el procesador escribe (PrEsc) y el bloque no está en caché. El controlador de caché del procesador que escribe difunde un paquete de petición de acceso exclusivo al bloque (PtLecEx); el estado del bloque en la caché después de la escritura se promociona. El paquete PtLecEx provoca los siguientes efectos:

1. Si la memoria tiene el bloque válido, lo deposita en el bus y pasa a estado inválido.2. Si una caché tiene el bloque en estado modificado, deposita el bloque en el bus y pasa a

estado inválido.3. Si una caché tiene el bloque en estado compartido, pasa a estado inválido.

- Acierto de escritura en bloque compartido, es decir, el procesador escribe (PrEsc) y el bloque está en caché en estado compartido. Si el bloque está en la caché en estado compartido, antes de escribir se debe obtener acceso exclusivo al bloque, para lo cual el controlador de caché difunde un paquete de petición de acceso exclusivo al bloque (PtLecEx); el estado del bloque en la caché después de la escritura se promociona a modificado (el acierto de escritura en bloque compartido se trata esencialmente como el fallo de escritura). El paquete PtLecEx generado provoca los siguientes efectos:

1. La memoria deposita el bloque en el bus, ya que lo tiene válido (el bloque depositado se puede ignorar), y pasa a estado inválido. Para evitar que la memoria deposite en este caso el bloque en el bus y reducir así el tráfico, se debe añadir un nuevo paquete al sistema para esta situación en la que el procesador escribe y el bloque está en estado compartido. Sería un paquete de petición de acceso exclusivo, pero sin lectura (PtEx).

2. El bloque no puede estar en estado modificado en otra caché.3. Si una caché tiene el bloque en estado compartido, pasa a estado inválido.

- Acierto de escritura en bloque modificado, es decir, el procesador escribe (PrEsc) y el bloque está en caché en estado modificado. Como el nodo ya tiene la propiedad exclusiva del bloque, no se genera ningún paquete. El bloque sigue en estado modificado.

Page 14: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

- Acierto de lectura, es decir, el procesador lee (PrLec) y el bloque se encuentra actualizado en la caché. En este caso el bloque se mantiene en el mismo estado. No genera ningún paquete.

Reemplazo, fallo en el acceso del procesador a otro bloque, y la política de reemplazo selecciona este bloque para hacer sitio al nuevo (no mostrado en la figura 10.4). Si el bloque reemplazado se encuentra en estado modificado, el controlador de caché del procesador que escribe difunde un paquete de pos escritura en memoria (PtPEsc), el estado del bloque en la caché pasa a ser inválido (no está presente físicamente). Hay que tener en cuenta que se utiliza pos escritura como política de actualización de memoria principal. Este paquete PtPEsc provoca que el bloque se transfiera a memoria pasando el estado del bloque en memoria a válido.

10.1.2.2. Protocolo de invalidación de cuatro estados (MESI)

El ´protocolo de cuatro estados que se va a mostrar utiliza pos escritura como política de actualización de memoria principal, y escritura con invalidación como política para mantener coherencia entre cachés.

Según hemos visto en la sección anterior, en el protocolo MSI, si un procesador escribe en un bloque en su caché, debe generar una transferencia que invalide copias en otras cachés, aunque no haya otras copias del bloque en cachés de otros procesadores. Esto degrada las prestaciones de aplicaciones secuenciales ejecutadas en multiprocesadores, ya que estas no se comparten variables entre procesos. Por tanto, no habrá bloques de memoria realmente compartidos por cachés de distintos procesadores: un bloque que se encuentra en una caché en el estado MSI de compartido, estará solo en esta caché y en la memoria principal (suponiendo que los procesos no emigran a otros nodos). En el protocolo MESI se ha añadido un nuevo estado, llamado exclusivo, que describe esta situación. Un bloque en estado exclusivo en una caché estará válido solo en esta caché y en la memoria. Si un bloque se encuentra en estado exclusivo en la caché de un nodo y del procesador del nodo escribe en el bloque, no se genera paquete para solicitar uso exclusivo del bloque (invalidando posibles copias), ya que se sabe que ninguna otra caché tiene copia del bloque. En este nuevo estado incluido en MESI, el grado de disponibilidad de un bloque por parte del procesador se encuentra en el grado de disponibilidad del estado compartido y el estado modificado. En el estado exclusivo son dos los propietarios del bloque: memoria principal y una caché. A continuación se describe el resto de facetas lógicas de diseño para una posible implementación del protocolo MESI.

Posibles estados de un bloque:

Un bloque en caché puede estar en alguno de los siguientes estados:

- Modificado (M). Si el bloque en la caché se encuentra en este estado, significa que es el único componente en el sistema con una copia válida del bloque, el resto de cachés y la memoria, tienen una copia no actualizada. La caché debe proporcionar el bloque si observa al espiar el bus que algún componente lo solicita, y debe invalidarla si algún otro nodo solicita una copia exclusiva del bloque para su modificación.

Page 15: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

- Exclusivo (E). Si el bloque en la caché se encuentra en este estado, significa que es la única caché en el sistema con una copia válida del bloque; el resto de cachés tienen una copia no válida. La memoria tiene también una copia actualizada del bloque. La caché debe invalidar su copia si observa al espiar el bus que algún otro nodo solicita una copia exclusiva del bloque para su modificación.

- Compartido (C, Shared). Supone que el bloque es válido en esta caché, en memoria y en al menos alguna otra caché. La caché debe invalidar su copia si observa al espiar el bus que algún otro nodo solicita una copia exclusiva del bloque para su modificación.

- Invalido (I). Supone que el bloque no está físicamente en la caché, o si se encuentra, ha sido invalidado por el controlador como consecuencia de la escritura en la copia del bloque situada en otra caché.

Transferencias que puede generar un nodo con caché:

Usaremos los mismos paquetes que en el protocolo MSI.

Transiciones de estado de un bloque

Tabla 10.4. Tabla de estados MESI. Aparecen con fondo más oscuro las situaciones que provocan cambio de estado.

Page 16: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

Estado inicialEvento Acción

Estado Siguiente

Modificado (M)

Procesador lee (PrLec) ModificadoProcesador escribe (PrEsc) ModificadoPaquete Lectora (PtLec)

Genera Paquete Respuesta Bloque (RpBloque) Compartido

Paquete de acceso exclusivo al bloque (PtLecEx)

Genera respuesta bloque (RpBloque) Invalida copia local Inválido

ReemplazoGenera paquete pos escritura Bloque (PtPEsc) Inválido

Exclusivo (E)

Procesador lee (PrLec) ExclusivoProcesador Escribe (PrEsc) ModificadoPaquete Lectura (PtLec) CompartidoPaquete de acceso exclusivo al bloque (PtLecEx)

Invalida Copia LocalInválido

Compartido (S. Shared)

Proceso lee (PrLec) CompartidoProcesador escribe (PrEsc)

Genera paquete PtLecExModificado

Paquete de Lectura (PtLec) CompartidoPaquete de acceso exclusivo al bloque

Invalida Copia LocalInvalido

Invalido (I)

Procesador lee (PrLec) Genera Paquete PtLec CompartidoProcesador escribe (PrEsc) Genera Paquete PtLecEx ModificadoPaquete de lectura PtLec InvalidoPaquete de acceso exclusivo al bloque (PtLecEx) Invalido

TABLA:

En la tabla 10.4 y la figura 10.5 se resumen las transiciones de estado para un bloque en la caché de un procesador para una implementación del protocolo de cuatro estados MESI. Las transiciones son consecuencias de acciones de lectura/escritura del procesador y de transferencia que el controlador observa en el bus. Se genera una transferencia cuando se detecta un fallo en el acceso inmediato a la caché en una operación de lectura o escritura, bien porque no se encuentra en caché una copia actualizada del bloque o bien porque antes de poder escribir en caché debe obtener el uso exclusivo del bloque.

Page 17: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

- Fallo de lectura, es decir, el procesador lee una dirección del bloque (PtLec) y éste no está en caché. El controlador de caché del procesador que lee difunde un paquete de petición de lectura de un bloque de memoria (PtLec). El estado del bloque en la caché después de la lectura pasará a ser compartido si hay copias del bloque en otras cachés, y pasará a estado exclusivo si no hay copias del bloque en otras cachés. El controlador de la caché que solicita el bloque, requiere conocer, pues, si el bloque solicitado se encuentra en otras cachés. Se puede añadir una línea OR cableada que informe si hay cachés con copias del bloque solicitado. La actualización de esta OR por parte de los controladores de caché realizaría en la fase de direccionamiento (en el diagrama de estados de la figura 10.5 y en la tabla 10.4 se ha notado por S la salida de esta OR). La memoria dispondrá del bloque válido al terminar el proceso. El paquete PtLec provoca los siguientes efectos en otras caché:

1. Si el bloque se encuentra en otra caché en estado modificado, deposita el bloque en el bus y pasa a estado compartido. La memoria también coge el bloque del bus.2. Si el bloque se encuentra en estado exclusivo, pasa a estado compartido. En este caso, la respuesta con el bloque que llega a la caché del nodo que lo cita procede de memoria.3. Si el bloque está compartido, sigue en estado compartido. El bloque que llega a la caché del nodo que lo solicita procede de memoria.

Hay implementaciones en las que, si el bloque solicitado esta disponible en estado válido en alguna caché en lugar de obtener el bloque de memoria, se proporciona por parte de alguna de estas cachés con bloque válido. Hay que añadir entonces hardware, que decida qué caché con bloque válido va a generar la respuesta con el bloque. Esta alternativa es interesante en sistemas con memoria físicamente distribuida (protocolos basados en directorios), ya que se puede proporcionar el bloque desde el nodo cercano al que lo solicita.

- Fallo de escritura al no estar el bloque en caché, es decir, el procesador escribe (PrEsc) y el bloque no está en caché. El controlador de caché del procesador que escribe difunde un paquete de petición de acceso exclusivo al bloque (PtLecEx). El estado del bloque en la caché después de la escritura será de modificado. El paquete PtLecEx provoca los siguientes efectos:

1. Si una caché tiene el bloque en estado modificado, bloquea la lectura de memoria y deposita el bloque en el bus. El bloque pasa en esta caché a estado inválido.

2. Si una caché tiene el bloque en estado exclusivo o compartido, pasa a estado inválido.

- Acierto de escritura en bloque compartido, es decir, el procesador escribe (PrEsc) y hay una copia del bloque en su caché y en la caché de algún otro procesador. El controlador de caché del procesador que escribe difunde un paquete de petición de acceso exclusivo al bloque (PtLecEx). El estado del bloque en la caché después de la escritura será de modificado. El paquete PtLecEx provoca los siguientes efectos:

Page 18: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

1. La memoria puede depositar el bloque en el bus, pero se puede ignorar (la caché que ha generado la petición PtLecEx tiene el bloque válido). Para evitar que se utilice el bus de datos innecesariamente se puede añadir el diseño otro paquete distinto que pida acceso exclusivo pero no la lectura de los datos (PtEx).

2. El bloque no puede estar en estado exclusivo o modificado en otra caché.3. Si una caché tiene el bloque en estado compartido, pasa a estado inválido.

- Acierto de escritura en bloque modificado o exclusivo, es decir, el procesador escribe (PrEsc) y el bloque está en caché en estado modificado o exclusivo. Como no hay otro nodo con copia válida del bloque en su caché no es necesario generar un paquete. El bloque pasa a estado modificado si está en estado exclusivo o continúa en estado modificado.

- Acierto de lectura, es decir, el procesador lee (PrLec) y el bloque se encuentra en la caché actualizado. En este caso el bloque se mantiene en el mismo estado. No genera ningún paquete.

- Reemplazo, fallo en el acceso del procesador a otro bloque y la política (No mostrado en Figura 10.5). El controlador de caché del procesador que escribe difunde un paquete de pos escritura en memoria (PtPEsc) si el bloque reemplazado se encuentra en estado modificado. El bloque pasa a estado inválido (no está presente físicamente). Este paquete PtPEsc provoca que el bloque se trasfiera a la memoria pasando el estado del bloque en memoria a válido (si se almacena información de estado en memoria).

Page 19: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

PARTE DE CARLOS

Page 20: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

10.1.3.2. Alternativas de Organización del directorio

Comentaremos cuatro alternativas para implementar un directorio (Tabla 10.5): directorio de vector de bits completo (full vector), directorio de vector de bits asignados a grupos (coarse bit vector), directorio limitado y directorio encadenado. Estas cuatro implementaciones difieren en cuanto el almacenamiento que requieren para mantener el directorio; también influyen en las transferencias entre nodos que genera el protocolo para mantener coherencia. En todas las alternativas, el directorio está distribuido entre los nodos, en lugar de estar centralizado en una zona del sistema. El directorio asociado a un modulo de memoria (a un nodo) tiene una entrada por cada bloque de modulo. El estado de la copia de un bloque de un caché se encuentra en el directorio de caché, en la entrada asignada del bloque. En el esquema de directorio encadenado la entrada de un bloque está distribuido entre los cachés (directorio de caché).

El directorio se puede implementar en memoria principal, o bien en un módulo de memoria independiente con mayores prestaciones que la memoria principal (por ejemplo, en Origen [Laudon, 1997]). En caso de utilizar una implementación en memoria principal, se puede añadir para mejorar prestaciones una caché de directorio para almacenar la información de los bloques recientemente accedidos (por ejemplo, en el sistema Fireplane de Sun [Charlesworth, 2001]).

Directorio de vector de bits completo

En esta alternativa, como ilustra la Figura 10.8, la entrada de un bloque en el directorio tiene un bit asociado a cada nodo de procesamiento del sistema, vector de bits de presencia esta activo, indica que la caché del nodo asociado tiene una copia válida del bloque . Además habrá uno o más bits de estado que utilizara el controlador de memoria para determinar las acciones que ha de realizar .Como refleja la figura, las cachés a su ve en el directorio caché, tendrán información sobre el estado en el que se encuentra el bloque en la cache.

En esta implementación, el tamaño del directorio depende del número de nodos, N, en la red .Esto supone que la expansibilidad del sistemas está limitada por el diseño del directorio (tamaño del vector de bits), que además tendrá un tamaño excesivo para un numero de nodos elevados.

El tamaño de un subdirectorio (directorio de un nodo) depende del número de nodos, y del número de bloques de memoria en un nodo:

Tamaño_subdirectorio =(N+bits_estado) × (Tamaño_memoria_nodo/Tamaño_linea_cache)

El tamaño del directorio en el sistema completo depende entonces del cuadrado del número de nodos y del número de bloques en un nodo. Obsérvese que si N+ bits_estado coincidiera

Page 21: Coherencia en Memoria

Estado bloque en caché

Estado bloqueBits de presencia (N si hay N nodos)

MemoriaBloque

Directorio caché

1 E1 0

Directorio caché

1 0

Red escalable

P

C

E/S M

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

con el tamaño de una línea o bloque de caché, el tamaño del subdirectorio seria igual al tamaño de la memoria del nodo. Así, por ejemplo, si una línea de cache en el sistema tiene 64 bytes=512 bits, un sistemas con 512 nodos requeriría un tamaño de directorio completo mayor que el tamaño de la memoria.

Para aumentar la escabilidad se han utilizado varias alternativas, como el directorio con vector de bits asignados a grupos, directorio limitado y el directorio encadenado, comentados a continuación.

Directorio de vector de bits asignados a grupos

Con esta alternativa también se utiliza un vector de bits de presencia para cada bloque pero para incrementar escabilidad se asigna a cada bit de presencia del vector, un grupo de nodos del sistema (coarse bit vector).Si el sistemas permite incrementar el número de nodos asignados a un bit de presencia conforme se añaden mas nodos al sistema, la escabilidad no estaría limitada por el numero de bits de presencia fijados para cada bloque en el directorio. El problema de este esquema es que se deben enviar invalidaciones a todos los nodos asignados a un bit de presencia, tengan o no copia del bloque.

El tamaño de un subdirectorio depende del número de nodos, N, del tamaño del grupo al que se asigna un bit de presencia y del número de bloques de memoria en un nodo:

Tamaño_subdirectorio = (N/Tamaño_grupo+bits_estado) × (Tamaño_memoria_nodo/Tamaño_linea_cache)

El Origin 2000 se utiliza un directorio con un vector de 64 bits de presencia. Asignando a un bit un único nodo el Origin puede llegar hasta 64 nodos. Para incrementar la escabilidad

Figura 10.8 directorio de bits completo

Page 22: Coherencia en Memoria

Red escalable

P

C

E/S M

K punteros a cachés

MemoriaBloque

Estado bloque

Directorio caché

EC4 C2 …

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

hasta 512 nodos, Origin permite que un bit de presencia pueda representar 8 nodos [Laudon, 1997].

Directorio limitado

Para disminuir la necesidad de almacenamiento del directorio con respecto a la implementación de directorio de bits completo, este esquema tiene en cuenta que en la práctica habrá, en un momento dado, un número limitado de caches del sistema con una copia valida de un bloque.

En esta alternativa, como se ilustra la figura 10.9, cada entrada del directorio, tiene capacidad para k punteros (identificadores de caches o nodos) con copias del bloque con k<N(N es el numero de nodos).Cada puntero necesita log2 N bits para codificar la

Figura 10.9 directorio limitado

dirección de un nodo. En total, cada entrada del directorio necesita entonces k× log2N bits. El tamaño de un subdirectorio dependerá de k × log2N, en lugar de N, y del número de bloques en la memoria de un nodo:

Tamaño_subdirectorio= (k × log2N + bits_estado) × (Tamaño_memoria_nodo/Tamaño_linea_cache)

Con 512 nodos, el numero de bits para especificar caches con copia para una entrada de 9k.Con k<57, los bits de una entrada de directorio para especificar cachés con copia seria menor de 512 bits.

Page 23: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

Con este esquema, mientras que el número de copias valida en el sistemas se mantenga menor o igual a k, el protocolo de coherencia de cache (incluidos los paquetes que genera) puede ser similar al implementado con directorio de vector d bits completo.

Pero con esta implementación, hay que plantearse que puede ocurrir la siguiente situación: una petición de lectura de un bloque puede encontrar llena en el nodo origen la entrada del directorio correspondiente a ese bloque. En ese caso hay invalidar una de las caches con copia válida para ubicar la nueva cache. Esto supone tener que implementar algún algoritmo de reemplazo (para seleccionar la copia a invalidar) y generar transferencias adicionales.

En el chip EV7 de Compaq/HP se ha integrado, además del procesador Alpha 21364,la interfaz de red (incluido controlador de memoria) y el encaminador (conmutador).El controlador de memoria implementa un protocolo de coherencia de cache con directorio de vector de bits o directorio limitado según el numero de nodos con copia de bloque. Si el numero de caches con copia del bloque es pequeño, se puede almacenar en el directorio el identificador de todas ellas (directorio limitado).Pero si hay un numero de vector de bits asociados a grupos, en la que un bit de presencia, para una configuración de 64 nodos, cada bit puede representar un grupo de cuatro procesadores.

Directorio encadenado

En esta implementación, la entrada de un bloque en el directorio se implementa como una lista enlazada (o doblemente enlazada) distribuido entre los directorios de las caches con copia del bloque, como se ilustra en figura 10.10 .En memoria principal, la entrada del directorio para el bloque queda reducida a los bits de estado y a un puntero a la ultima cache que accedió al bloque. En el directorio de esta cache, en la entrada asociada al marco donde se encuentra el bloque, habrá un puntero a la penúltima caché que leyó el bloque; en una implementación doblemente enlazada habrá, además, un puntero al nodo origen. En definitiva, en el directorio de las caches con copia del bloque. La entrada asociada al marco donde está el bloque tendrá un puntero a otra cache con copia del bloque o dos punteros en una implementación doblemente enlazada. Si un nuevo nodo solicita una copia compartida del bloque, se inserta como nueva cabecera. La inserción en la cabecera supone menos transferencias que la inserción al final de la lista.

El tamaño del subdirectorio en un nodo, sin contar los bits de estado, para una implementación con un puntero a la siguiente cache con copia es:

Tamaño_subdirectorio= log2N × ((Tamaño_memoria_nodo +Tamaño_cache_nodo)/Tamaño_linea_cache)

Teniendo en cuenta que la memoria cache tiene un tamaño menor que la memoria principal, la capacidad del directorio para información de nodos con copia seria menor que

Page 24: Coherencia en Memoria

Directorio caché

EF

Directorio caché

E

P

C

E/S M

P

C

E/S M

Red escalable

P

C

E/S M

Directorio MP

E

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

la que se utilizaría con una implementación de directorio limitado con capacidad para dos identificadores(k=2).

La implementación distribuida en las cachés del directorio mejora considerablemente las necesidades de almacenamiento, pero supone un incremento en la latencia debido a los paquetes de secuencia que se deben generar, Así, por ejemplo, supongamos que se tienen que invalidar las copias de un bloque en otras caches como consecuencia de una petición de acceso exclusivo(con o sin lectura). No se pueden generar los paquetes de invalidación para todos los nodos simultáneamente, ya que la información sobre los nodos con copia del bloque esta distribuida. Hay que recorrer la lista con paquetes para poder acceder a todos los nodos e invalidar sus copias.

Figura 10.10 Directorio encadenado

10.2 CONSISTENCIA DE MEMORIAComo comentamos en capitulo 7, el modelo de programación de memoria compartida ofrece varias ventajas al programador respecto al modelo de paso de mensaje. En particular, evita, o al menos relaja, la necesidad de distribuir la carga de trabajo (código y datos). Por ello, los multiprocesadores han tenido una amplia aceptación en computación comercial, y también en computación científica.

No obstante, para programar de forma eficiente y correcta multiprocesadores, los programadores(a bajo y alto o nivel) deben tener u conocimiento preciso de la semántica del sistemas de memoria. Si programan a bajo nivel con ensamblador o implementan

Page 25: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

herramientas de programación, sistemas operativos o controladores de dispositivos(figura 10.11),deben tener en cuenta la semántica proporcionada por el multiprocesador o modelo de consistencia de memoria del hardware(arquitectura abstracta del sistemas de memoria).Si programan a alto nivel con OpenMP,POSIX.Thread o HPF(Seccion 7.4), deben tener en cuenta entonces la semántica del sistemas de memoria proporcionada por las herramientas software de programación o modelo de consistencia de memoria del software.

Un modelo de consistencia de memoria especifica el orden en el cual las operaciones de acceso a memoria deben parecer haberse realizado (operaciones de lectura, escritura).

En un procesador (o en un sistema uniprocesador), el orden en el que deben parecer haberse ejecutado los accesos a memoria es el orden secuencial especificado por el programador(o la herramienta de programación en el código que añade), denominado orden del programa. Esto significa que el hardware o la herramienta de programación no puedan alterar, para mejorar las prestaciones, el orden de las instrucciones.

Realmente pueden alterar el orden, pero deben parecer que nos e han alterado para garantizarle al programador el modelo de consistencia .En concreto, se debe garantizar que:

Cada lectura de una dirección (o variable, si se programa en alto nivel), proporciona el ultimo valor escrito en dicha dirección (dependencia de datos lectura después escritura).

Si se escribe varias veces en la misma dirección, se deben retornar el ultimo valor escrito (escritura después escritura).

Si se escribe en una dirección a la que previamente se ha accedido para leer, no se debe obtener en la lectura previa el valor escrito posteriormente en la secuencia del programa especificada por el programador (escritura después lectura).

No se puede escribir en una dirección si la escritura depende de una condición que no se cumple (dependencias de control).

Page 26: Coherencia en Memoria

Mantenimiento y Coherencia en el Sistema de Memoria Multiprocesadores

PREGUNTAS:

1. Si en el sistema de memoria las copias de una dirección no tienen el mismo contenido, tendremos una incoherencia en el sistema de memoria…………………………………… ( V )

2. Si usamos posescritura en lugar de escritura inmediata, NO se permite que aparezcan incoherencias entre cache y memoria, también cuando se escribe en caché……………….. ( F )

3. La falta de coherencia en el sistema de memoria puede provocar problemas si los componentes del sistema se comunican entre si a través de posiciones de memoria……………………...( V )

4. Cuanto utilizamos posescritura siempre que se modifica una dirección en cache se modifica también en memoria principal………………………………………...……….…………….( F )

5. Para invalidar se debe transferir la dirección (bloque) y los datos………………..…………( F )6. Un bloque en caché puede estar en alguno de los siguientes estados: Modificado, Compartida e

invalido………………………………………………………………………….…………….(V)7. El Paquete de petición de lectura de un bloque, se genera como consecuencia de la lectura del

procesador (PrLec)……………………………………………………………… …………...(V)8. Los Protocolos de coherencia basados en espionaje son : Protocolo de invalidación de tres

estados y Protocolo de invalidación de cuatro estados ……………………..………………(V)9. Los estados MESI son: Modificado, Exclusivo, Compartido y Valido……………………...(V)10. Los protocolos de espionaje se basan en la difusión de los paquetes asociados al mantenimiento

de coherencia a todas las caché…..…………………...………………………………………(V)