El rastreo de bus o el rastreo de bus es un esquema mediante el cual un controlador de coherencia (snooper) en un caché (un caché de snoopy ) monitorea o rastrea las transacciones del bus, y su objetivo es mantener una coherencia de caché en los sistemas de memoria compartida distribuida . [ cita requerida ] Un caché que contiene un controlador de coherencia (snooper) se llama caché snoopy. Este esquema fue introducido por Ravishankar y Goodman en 1983. [1]
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 la búsqueda del bus. Todos los fisgones monitorean cada transacción en un autobús. Si una transacción que modifica un bloque de caché compartido aparece en un bus, todos los fisgones verifican si sus cachés tienen la misma copia del bloque compartido. Si una caché tiene una copia del bloque compartido, el fisgón 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é en función del protocolo de coherencia de caché. [2]
Tipos de protocolos de espionaje
Hay dos tipos de protocolos de espionaje según la forma de administrar una copia local de una operación de escritura:
Escritura invalidada
Cuando un procesador escribe en un bloque de caché compartido, todas las copias compartidas en los otros cachés se invalidan mediante la búsqueda de bus. Este método asegura que solo una copia de un dato pueda ser leída y escrita exclusivamente por un procesador. Todas las demás copias de otras memorias caché se invalidan. Este es el protocolo de espionaje más utilizado. Los protocolos MSI , MESI , MOSI , MOESI y MESIF pertenecen a esta categoría.
Escritura-actualización
Cuando un procesador escribe en un bloque de caché compartido, todas las copias compartidas de los otros cachés se actualizan mediante la búsqueda de bus. Este método transmite datos de escritura a todas las cachés a lo largo de un bus. Incurre en un tráfico de bus mayor que el protocolo de invalidación de escritura. Por eso este método es poco común. Los protocolos de dragón y luciérnaga pertenecen a esta categoría. [3]
Implementación
Una de las posibles implementaciones es la siguiente:
La caché tendría tres bits adicionales :
- V - válido
- D - bit sucio, significa que los datos en la caché no son los mismos que en la memoria
- S - compartido
Cada línea de caché se encuentra en uno de los siguientes estados: "sucio" (ha sido actualizado por el procesador local), "válido", "inválido" o "compartido". 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 (que es muy lento para acceder), o en una o más cachés locales (que es rápido). Cuando un bloque se carga por primera vez en la caché, se marca como "válido".
En un 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é es actual. En un error de escritura local (se hace un intento de escribir ese valor, pero no está en la caché), la búsqueda de bus asegura que cualquier copia en otras cachés esté configurada como "inválida". "No válido" significa que solía existir una copia en el caché, pero ya no es actual.
Por ejemplo, un estado inicial podría verse así:
Etiqueta | ID | 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 | ID | 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 el bus solicita esa memoria, los elementos de espionaje proporcionarán el valor del caché y luego notificarán a cada unidad que necesita esa memoria que la memoria se actualizó. Cuando se notifique a las otras unidades de la caché actualizada, desactivarán el bit válido para su caché de esa variable. Por lo tanto, la caché original se marcará como exclusiva (el bit S sería cero)
Al invalidar una dirección marcada como sucia (es decir, una caché tendría una dirección sucia y la otra caché está escribiendo), la caché ignorará esa solicitud. El nuevo caché se marcará como sucio, válido y exclusivo y ese caché ahora se hará cargo de la dirección. [1]
Beneficio
La ventaja de utilizar el bus snooping 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 los cachés en un sistema basado en directorios. La búsqueda de bus es normalmente más rápida si hay suficiente ancho de banda , porque todas las transacciones son una solicitud / respuesta que ven todos los procesadores. [2]
Retirarse
La desventaja de fisgonear en el autobús es la escalabilidad limitada . El espionaje frecuente en un caché provoca una carrera con un acceso desde un procesador, por lo que puede aumentar el tiempo de acceso al 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 se hace más grande. [2] Dado que la búsqueda del bus no escala bien, los sistemas NUMA coherentes de caché más grandes (ccNUMA) tienden a utilizar protocolos de coherencia basados en directorios .
Filtro Snoop
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 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 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 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 verificar su etiqueta de caché o no. Un filtro de rastreo 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 las 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é hagan un espionaje innecesario. Hay tres tipos de filtros según la ubicación de los filtros de rastreo. 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 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 evita el mensaje de coherencia inicial de la fuente. Por último, los filtros en la red eliminan el tráfico de coherencia de forma dinámica dentro del bus compartido. [4] El filtro snoop también se clasifica como inclusivo y exclusivo. El filtro de rastreo inclusivo realiza un seguimiento de la presencia de bloques de caché en cachés. Sin embargo, el filtro de rastreo exclusivo monitorea la ausencia de bloques de caché en los cachés. En otras palabras, un acierto en el filtro de snoop inclusivo significa que el bloque de caché correspondiente está en cachés. Por otro lado, un acierto en el filtro de rastreo exclusivo significa que ningún caché tiene el bloque de caché solicitado. [5]
Referencias
- ^ a b Ravishankar, Chinya; Goodman, James (28 de febrero de 1983). Implementación de caché para varios microprocesadores (PDF) . págs. 346–350.
- ^ a b c Yan Solihin (2016). Fundamentos de la Arquitectura de Computadores Paralelos . págs. 239–246.
- ^ Hennessy, John L; Patterson, David A. (2011). Arquitectura informática: un enfoque cuantitativo . págs. 355 –356. ISBN 978-0123838728.
- ^ Agarwal, N .; Peh, L .; Jha, NK (diciembre de 2009). "Filtrado de coherencia en la red: coherencia de Snoopy sin emisiones" . 2009 42º Simposio Internacional Anual de Microarquitectura IEEE / ACM (MICRO) : 232–243. doi : 10.1145 / 1669112.1669143 . hdl : 1721,1 / 58870 .
- ^ 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.
enlaces externos
- Jim Plusquellic. Arquitecturas de memoria compartida centralizada .
- Filtro Snoop .
- http://www.icsa.inf.ed.ac.uk/research/groups/hase/models/coherence/index.html
- http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi/0650/bks/SGI_Developer/books/T_IRIX_Prog/sgi_html/ch01.html