stringtranslate.com

Espionaje en el autobús

Bus snooping o bus sniffing es un esquema por el cual un controlador de coherencia (snooper) en un caché (un snoopy cache ) monitorea o espía 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 "una sola escritura". [1] Un caché que contiene un controlador de coherencia (snooper) se llama snoopy cache.

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 del cambio evita que el sistema viole la coherencia de la caché . La notificación del cambio de datos se puede realizar mediante el espionaje del bus. Todos los espionajes monitorean cada transacción en un bus. Si aparece una transacción que modifica un bloque de caché compartido en un bus, todos los espionajes verifican si sus cachés tienen la misma copia del bloque compartido. Si un caché tiene una copia del bloque compartido, el espionaje correspondiente realiza una acción para garantizar la coherencia de la caché. La acción puede ser un vaciado o una invalidación del bloque de caché. También implica un cambio de estado del bloque de caché según el protocolo de coherencia de caché. [2]

Tipos de protocolos de espionaje

Hay 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 las otras cachés se invalidan mediante el espionaje del bus. [3] Este método garantiza que solo una copia de un dato pueda ser leída y escrita exclusivamente por un procesador. Todas las demás copias en otras cachés se invalidan. Este es el protocolo de espionaje más comúnmente 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 las demás cachés se actualizan mediante el rastreo de bus. Este método transmite datos de escritura a todas las cachés a lo largo 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. [4] [5]

Implementación

Una de las posibles implementaciones es la siguiente:

El caché tendría tres bits adicionales :

Cada línea de caché se encuentra en uno de los siguientes estados: "sucia" (ha sido actualizada por el procesador local), "válida", "invá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 se encuentra en la memoria principal (a la que se accede muy lentamente) o en una o más cachés locales (que es rápida). Cuando un bloque se carga por primera vez en la caché, se marca como "válido".

En caso de error de lectura en la caché local, la solicitud de lectura se transmite por el bus. Todos los controladores de caché monitorean el bus. Si uno ha almacenado en caché esa dirección y está en 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á actualizada. En caso de error de escritura local (se intenta escribir ese valor, pero no está en la caché), el espionaje del bus garantiza que todas las copias en otras cachés se configuren como "inválidas". "Inválido" significa que existía una copia en la 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é supervisa el bus y detecta si se solicita alguna memoria en caché. Si la memoria caché está sucia y compartida y hay una solicitud en el bus para esa memoria, un elemento espía sucio proporcionará los datos al solicitante. En ese momento, el solicitante puede asumir la responsabilidad de los datos (marcándolos como sucios) o la memoria puede tomar una copia (se dice que la memoria ha "capturado" los datos) y los dos elementos pasan al estado compartido. [6]


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 sucia, válida y exclusiva y ese caché ahora asumirá la responsabilidad de la dirección. [1]

Beneficio

La ventaja de utilizar el espionaje de 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 memorias caché en un sistema basado en directorios. El espionaje de bus normalmente es más rápido si hay suficiente ancho de banda , porque todas las transacciones son una solicitud/respuesta que ven todos los procesadores. [2]

Inconveniente

La desventaja del espionaje de bus es la escalabilidad limitada . El espionaje frecuente en una caché provoca una competencia con un acceso desde un procesador, por lo que puede aumentar el tiempo de acceso a la caché y el consumo de energía. Cada una de las solicitudes tiene que transmitirse a todos los nodos de un sistema. Esto 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 se hace más grande. [2] Dado que el espionaje de bus no escala bien, los sistemas NUMA coherentes de caché más grandes (ccNUMA) tienden a utilizar protocolos de coherencia basados ​​en directorios .

Filtro de espionaje

Cuando se produce una transacción de bus en un bloque de caché específico, todos los espías deben espiar la transacción de bus. Luego, los espías buscan su etiqueta de caché correspondiente para verificar si tiene el mismo bloque de caché. En la mayoría de los casos, las 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 la etiqueta de caché por parte del espía suele ser un trabajo innecesario para la caché que no tiene el bloque de caché. Pero la búsqueda de la etiqueta perturba el acceso a la caché por parte de un procesador y genera un consumo de energía adicional.

Una forma de reducir el espionaje innecesario es utilizar un filtro de espionaje. Un filtro de espionaje determina si un espía necesita comprobar su etiqueta de caché o no. Un filtro de espionaje es una estructura basada en directorios y supervisa todo el tráfico coherente para realizar un seguimiento de los estados de coherencia de los bloques de caché. Esto significa que el filtro de espionaje 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 el espionaje innecesario. Hay tres tipos de filtros según la ubicación de los filtros de espionaje. Uno es un filtro de origen que se encuentra en un 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 encuentra en los 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 evita el mensaje de coherencia inicial de la fuente. Por último, los filtros en la red podan el tráfico de coherencia de forma dinámica dentro del bus compartido. [7] El filtro de espionaje también se clasifica como inclusivo y exclusivo. El filtro de espionaje inclusivo realiza un seguimiento de la presencia de bloques de caché en los cachés. Sin embargo, el filtro de espionaje exclusivo monitorea la ausencia de bloques de caché en los cachés. En otras palabras, un acierto en el filtro de espionaje inclusivo significa que el bloque de caché correspondiente está en manos de los cachés. Por otro lado, un acierto en el filtro de espionaje exclusivo significa que ningún caché tiene el bloque de caché solicitado. [8]

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 computadoras paralelas . págs. 239–246.
  3. ^ Eggers, SJ; Katz, RH (1989). "Evaluación del rendimiento de cuatro protocolos de coherencia de caché de espionaje". Actas del 16.º simposio internacional anual sobre arquitectura informática - ISCA '89 . ACM Press. págs. 2–15. doi :10.1145/74925.74927. ISBN. 978-0-89791-319-5.
  4. ^ Hennessy, John L; Patterson, David A. (2011). Arquitectura informática: un enfoque cuantitativo . Elsevier. ISBN 978-0123838728.
  5. ^ Patterson, David A.; Hennessy, John L. (1990). Arquitectura informática: un enfoque cuantitativo . Morgan Kaufmann Publishers. págs. 469–471. ISBN 1-55860-069-8.
  6. ^ Siratt, Adrem. "¿Qué es la coherencia de caché?". EasyTechJunkie . Consultado el 1 de diciembre de 2021 .
  7. ^ Agarwal, N.; Peh, L.; Jha, NK (diciembre de 2009). "Filtrado de coherencia en 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.S2CID6626465  .​
  8. ^ Ulfsnes, Rasmus (junio de 2013). Diseño de un filtro de espionaje para protocolos de coherencia de caché basados ​​en espionaje . Universidad Noruega de Ciencia y Tecnología.{{cite book}}: CS1 maint: location missing publisher (link)

Enlaces externos