stringtranslate.com

Espiando en el autobús

Bus snooping o bus sniffing es un esquema mediante el cual un controlador de coherencia (snooper) en un caché (un snoopy cache ) monitorea o husmea las transacciones del bus, y su objetivo es mantener una coherencia de caché en sistemas de memoria compartida distribuida . Este esquema fue introducido por Ravishankar y Goodman en 1983, bajo el nombre de coherencia de caché de "escritura única". [1] Un caché que contiene un controlador de coherencia (snooper) se llama caché snoopy.

Cómo funciona

Cuando varios cachés comparten datos específicos y un procesador modifica el valor de los datos compartidos, el cambio debe propagarse a todos los demás cachés que tienen una copia de los datos. Esta propagación de cambios evita que el sistema viole la coherencia de la caché . La notificación de cambio de datos se puede realizar mediante el espionaje del autobús. Todos los fisgones controlan cada transacción en un autobús. Si aparece en un bus una transacción que modifica un bloque de caché compartido, todos los fisgones verifican si sus cachés tienen la misma copia del bloque compartido. Si un caché tiene una copia del bloque compartido, el fisgón correspondiente realiza una acción para garantizar la coherencia del caché. La acción puede ser un vaciado o una invalidación del bloque de caché. También implica un cambio del estado del bloque de caché dependiendo del protocolo de coherencia de caché. [2]

Tipos de protocolos de espionaje

Existen dos tipos de protocolos de espionaje según la forma de gestionar una copia local de una operación de escritura:

invalidar escritura

Cuando un procesador escribe en un bloque de caché compartido, todas las copias compartidas en los otros cachés se invalidan mediante la vigilancia del bus. Este método garantiza que un procesador solo pueda leer y escribir exclusivamente una copia de un dato. Todas las demás copias en otras cachés quedan invalidadas. Este es el protocolo de espionaje más utilizado. Los protocolos MSI , MESI , MOSI , MOESI y MESIF pertenecen a esta categoría.

Actualización de escritura

Cuando un procesador escribe en un bloque de caché compartido, todas las copias compartidas de los otros cachés se actualizan mediante la vigilancia del bus. Este método transmite datos de escritura a todos los cachés de un bus. Incurre en un mayor tráfico de bus que el protocolo de invalidación de escritura. Por eso este método es poco común. Los protocolos Dragon y Firefly pertenecen a esta categoría. [3] [4]

Implementación

Una de las posibles implementaciones es la siguiente:

El caché tendría tres bits extra :

Cada línea de caché se encuentra en uno de los siguientes estados: "sucia" (ha sido actualizada por el procesador local), "válida", "no válida" o "compartida". Una línea de caché contiene un valor y se puede leer o escribir. Escribir en una línea de caché cambia el valor. Cada valor está en la memoria principal (a la que el acceso es muy lento) o en uno o más cachés locales (que es rápido). Cuando un bloque se carga por primera vez en el caché, se marca como "válido".

En caso de error de lectura en la memoria caché local, la solicitud de lectura se transmite en el bus. Todos los controladores de caché monitorean el bus. Si uno ha almacenado en caché esa dirección y está en el estado "sucio", cambia el estado a "válido" y envía la copia al nodo solicitante. El estado "válido" significa que la línea de caché está actual. En caso de error de escritura local (se intenta escribir ese valor, pero no está en el caché), el espionaje del bus garantiza que cualquier copia en otros cachés esté configurada como "no válida". "No válido" significa que solía existir una copia en el caché, pero ya no está actualizada.

Por ejemplo, un estado inicial podría verse así:

Etiqueta | identificación | V | D | S---------------------1111 | 00 | 1 | 0 | 00000 | 01 | 0 | 0 | 00000 | 10 | 1 | 0 | 10000 | 11 | 0 | 0 | 0

Después de escribir la dirección 1111 00, cambiaría a esto:

Etiqueta | identificación | V | D | S---------------------1111 | 00 | 1 | 1 | 00000 | 01 | 0 | 0 | 00000 | 10 | 1 | 0 | 10000 | 11 | 0 | 0 | 0

La lógica de almacenamiento en caché monitorea el bus y detecta si se solicita alguna memoria en caché. Si el caché está sucio y compartido y hay una solicitud en el bus para esa memoria, un elemento de espionaje sucio proporcionará los datos al solicitante. En ese punto, el solicitante puede asumir la responsabilidad de los datos (marcando los datos como sucios), o la memoria puede tomar una copia (se dice que la memoria ha "rompido" los datos) y los dos elementos pasan al estado compartido. [5]


Al invalidar una dirección marcada como sucia (es decir, un caché tendría una dirección sucia y el otro caché está escribiendo), el caché ignorará esa solicitud. El nuevo caché se marcará como sucio, válido y exclusivo y ese caché ahora asumirá la responsabilidad de la dirección. [1]

Beneficio

La ventaja de utilizar la vigilancia del bus es que es más rápido que el mecanismo de coherencia basado en directorios . Los datos que se comparten se colocan en un directorio común que mantiene la coherencia entre las cachés en un sistema basado en directorios. La vigilancia del bus normalmente es más rápida si hay suficiente ancho de banda , porque todas las transacciones son una solicitud/respuesta vista por todos los procesadores. [2]

Retirarse

La desventaja del espionaje de autobuses es su escalabilidad limitada . El espionaje frecuente en una memoria caché provoca una carrera con el acceso desde un procesador, por lo que puede aumentar el tiempo de acceso a la memoria caché y el consumo de energía. Cada una de las solicitudes debe transmitirse a todos los nodos de un sistema. Significa que el tamaño del bus (físico o lógico) y el ancho de banda que proporciona deben crecer a medida que el sistema crece. [2] Dado que el espionaje del bus no se escala bien, los sistemas NUMA coherentes con caché más grandes (ccNUMA) tienden a utilizar protocolos de coherencia basados ​​en directorios .

Filtro de fisgoneo

Cuando se produce una transacción de bus en un bloque de caché específico, todos los fisgones deben espiar la transacción de bus. Luego, los fisgones buscan su etiqueta de caché correspondiente para comprobar si tiene el mismo bloque de caché. En la mayoría de los casos, los cachés no tienen el bloque de caché ya que un programa paralelo bien optimizado no comparte muchos datos entre subprocesos. Por lo tanto, la búsqueda de etiquetas de caché por parte del fisgón suele ser un trabajo innecesario para el caché que no tiene el bloque de caché. Pero la búsqueda de etiquetas perturba el acceso a la caché por parte de un procesador e incurre en un consumo de energía adicional.

Una forma de reducir el espionaje innecesario es utilizar un filtro de espionaje. Un filtro de vigilancia determina si un espía necesita comprobar su etiqueta de caché o no. Un filtro de vigilancia es una estructura basada en directorios y monitorea todo el tráfico coherente para realizar un seguimiento de los estados de coherencia de los bloques de caché. Significa que el filtro snoop conoce los cachés que tienen una copia de un bloque de caché. Por lo tanto, puede evitar que los cachés que no tienen la copia de un bloque de caché realicen espionaje innecesario. Hay tres tipos de filtros según la ubicación de los filtros de snoop. Uno es un filtro de origen que se ubica en el lado de la caché y realiza el filtrado antes de que el tráfico de coherencia llegue al bus compartido. Otro es un filtro de destino que se ubica en las cachés del receptor y evita búsquedas innecesarias de etiquetas de caché en el núcleo del receptor, pero este tipo de filtrado no logra evitar el mensaje de coherencia inicial desde la fuente. Por último, los filtros dentro de la red eliminan el tráfico de coherencia de forma dinámica dentro del bus compartido. [6] El filtro snoop también se clasifica como inclusivo y exclusivo. El filtro de vigilancia inclusivo realiza un seguimiento de la presencia de bloques de caché en las cachés. Sin embargo, el filtro snoop exclusivo monitorea la ausencia de bloques de caché en las cachés. En otras palabras, un acierto en el filtro de vigilancia inclusivo significa que el bloque de caché correspondiente está retenido por cachés. Por otro lado, un acierto en el filtro de snoop exclusivo significa que ningún caché tiene el bloque de caché solicitado. [7]

Referencias

  1. ^ ab Ravishankar, Chinya; Goodman, James (28 de febrero de 1983). Implementación de caché para múltiples microprocesadores (PDF) . págs. 346–350.
  2. ^ abc Yan Solihin (2016). Fundamentos de la arquitectura de ordenadores paralelos . págs. 239–246.
  3. ^ Hennessy, John L; Patterson, David A. (2011). Arquitectura informática: un enfoque cuantitativo . Elsevier. págs. 355–356. ISBN 978-0123838728.[ enlace muerto ]
  4. ^ Patterson, David A.; Hennessy, John L. (1990). Arquitectura informática: un enfoque cuantitativo . Editores Morgan Kaufmann. págs. 469–471. ISBN 1-55860-069-8.
  5. ^ Siratt, Adrem. "¿Qué es la coherencia de caché?". EasyTechJunkie . Consultado el 1 de diciembre de 2021 .
  6. ^ Agarwal, N.; Peh, L.; Jha, NK (diciembre de 2009). "Filtrado de coherencia en la red". Actas del 42º Simposio Internacional Anual IEEE/ACM sobre Microarquitectura . págs. 232-243. doi :10.1145/1669112.1669143. hdl : 1721.1/58870 . ISBN 9781605587981. S2CID  6626465.
  7. ^ Ulfsnes, Rasmus (junio de 2013). Diseño de un filtro Snoop para protocolos de coherencia de caché basados ​​en Snoop . Universidad Noruega de Ciencia y Tecnología.{{cite book}}: CS1 maint: location missing publisher (link)

enlaces externos