Download 1. Introducci´on. 2. Mejora de la penalizaci´on por fallo. 3. Mejora de
Document related concepts
no text concepts found
Transcript
T EMA 11: M EJORA DE LAS PRESTACIONES DE LAS CACHE . 1. Introducción. 2. Mejora de la penalización por fallo. 3. Mejora de la tasa de fallos. 4. Mejora de la tasa de fallos y penalización por fallo mediante paralelismo. 5. Mejora del tiempo en caso de acierto. Bibliografı́a: J.L. Hennessy & D. A. Patterson. Computer Architecture: A Quantitative Approach 2a y 3a ed., Morgan Kauffman Publishers, 1996 y 2002. Departamento de Informática de Sistemas y Computadores (DISCA) Facultad de Informática de Valencia 11-1 1 INTRODUCCIÓN 1. Introducción Tiempo de acceso medio a memoria: Tacceso = T A + T F × P F ¿Mejorar las prestaciones de las cache? Para mejorar las prestaciones de las cache hay que actuar sobre cada uno de los términos: Reducir el tiempo en caso de acierto (T A). Reducir la tasa de fallos (T F ). Reducir la penalización por fallo (P F ). 11-2 2 MEJORA DE LA PENALIZACIÓN POR FALLO 2. Mejora de la penalización por fallo Caches multinivel Nuevo nivel de cache (L2) ubicado entre la memoria cache y la memoria principal: • La cache L1 es lo suficientemente pequeña como para ser tan rápida como el procesador. • La cache L2 es lo suficientemente grande como para capturar muchos de los accesos a memoria principal. ¿Cómo cambia la ecuación del tiempo de acceso? Tacceso = T AL1 + T FL1 × P FL1 Y la penalización en caso de fallo de cache L1 es: P FL1 = T AL2 + T FL2 × P FL2 Sustituyendo: Tacceso = T AL1 + T FL1 × (T AL2 + T FL2 × P FL2 ) En un sistema de memoria con varios niveles de cache distinguimos dos tipos de tasas de fallos: • Tasa de fallos local= Num. de fallos de la cache Num. total accesos cache ◦ Para la cache L1 es T FL1 ◦ Para la cache L2 es T FL2 • Tasa de fallos global= Num. de fallos de la cache Num. total accesos ◦ Para la cache L1 es T FL1 Fallos L2 Fallos L1 ◦ Para la cache L2 es Total = Total · Fallos L2 = accesos accesos Fallos L1 Fallos L2 = T FL1 × T FL2 Accesos L2 → Fracción de accesos que llegan a la memoria Fallos L1 AccesosL1 11-3 · 2 MEJORA DE LA PENALIZACIÓN POR FALLO Caches multinivel (cont.) Efecto sobre la tasa de fallos: Algunos aspectos de diseño: • La velocidad de la cache L1 afecta al ciclo de reloj del procesador ◦ Cache L1 pequeña y con correspondencia directa. • Velocidad de la cache L2 afecta la penalizaci ón por fallo de L1 ¿Reducir P FL1 = T AL2 + T FL2 × P FL2 ? → Reducir T FL2 ◦ Cache L2 mucho mayor que L1 y con correspondencia asociativa. Inclusión/exclusión multinivel • Inclusión multinivel ◦ Los datos que están en la cache L1 están siempre en la cache L2. ◦ Interesante para garantizar coherencia. Sólo es necesario comprobar el nivel superior (L2). ◦ Deben emplearse tamaños de bloque iguales en la caches L1 y L2 o en caso de reemplazamiento en L2 hay que invalidar todos los bloques de L1 que componen el bloque de L2, aumentando T F L1 . • Exclusión multinivel (AMD Athlon) ◦ Los datos contenidos en L1 nunca están en la cache L2 ◦ Un fallo en L1 intercambia bloques entre las cache L1 y L2 ◦ Evita desperdiciar espacio en la cache L2. ◦ Es interesante cuando el tamaño de la cache L2 es solo ligeramente superior al de la cache L1 11-4 2 MEJORA DE LA PENALIZACIÓN POR FALLO “Critical word first y “Early restart” El procesador sólo necesita una palabra del bloque que ha provocado el fallo. Idea: no esperar a tener el bloque totalmente cargado para entregar la palabra solicitada al procesador. Critical word first • Accede primero en memoria a la palabra solicitada por el procesador. • Trae el resto del bloque mientras el procesador continua con la ejecución. Early restart: • Acceder a las palabras del bloque normalmente. • En cuanto se lee la palabra solicitada por el procesador se le entrega y éste continua con la ejecución. Con estas técnicas, se obtienen ventajas cuando: Se emplean tamaños de bloque grandes. Cuanto menor sea la probabilidad de acceder a otra palabra del bloque antes de que se haya cargado totalmente. 11-5 2 MEJORA DE LA PENALIZACIÓN POR FALLO Buffers de escritura Problema de las escrituras: • Write-through: y No-write allocate Las escrituras se hace directamente sobre la memoria principal. El procesador se detiene hasta que la escritura se ha hecho. • Write-back: Cuando se reemplaza un bloque ”sucio”, hay que escribirlo en memoria principal. El procesador se detiene hasta que la escritura se ha hecho. Idea: buffer de escritura. • el procesador escribe sobre el buffer en vez de sobre la memoria y • continua la ejecución en paralelo con la escritura en memoria. Problema: dependencias de datos con la memoria. 1 sd r3,a(r10) 2 ld r1,b(r11) 3 ld r2,a(r10) ; Escritura con fallo y write-through en Mem[a+r10] ; Lectura con fallo de Mem[a+r10] → Si la escritura del r3 (instr 1) no se ha realizado cuando se lee el r2 (instr 3), el valor cargado es incorrecto Solución: • Esperar a que el buffer de escritura se vacı́e antes de leer el dato. • Comprobar si la dirección referenciada está en el buffer de escritura, y, sino está dejar que la lectura continúe. 11-6 2 MEJORA DE LA PENALIZACIÓN POR FALLO Buffer de escrituras combinadas Escribir un bloque completo en memoria es más efectivo que una palabra. Idea: Se intenta completar todo un bloque antes de escribir en la memoria. Caches vı́ctima Idea: guardar lo que se desecha por si acaso se necesita nuevamente → cache vı́ctima. Cache vı́ctima: pequeña cache totalmente asociativa que alberga los bloques desechados por reemplazamientos. En caso de fallo de cache, se comprueba si está alojado en la cache vı́ctima. En caso afirmativo, se intercambia el bloque entre la cache y la cache vı́ctima. Es una técnica efectiva con tan sólo unos pocos bloques en la cache vı́ctima (8 entradas en el Athlon) . 11-7 3 REDUCIR LA TASA DE FALLOS. 3. Reducir la tasa de fallos. Clasificación de los fallos de bloque: Primera vez (compulsory). Los originados la primera vez que se accede a un bloque. → Suelen representar un bajo porcentaje del total de fallos. Capacidad. Si la cache no puede alojar todos los bloques necesarios durante la ejecución de un programa, se producirán fallos de capacidad: hay bloques que se descartan y que después deben volver a cargarse. → Una cache muy grande los reduce a cero. Conflicto. Si la correspondencia es directa o asociativa por conjuntos, aparecen fallos por conflicto: hay bloques que se descartan y luego tienen que cargarse nuevamente si se ubican en el mismo lugar de la cache. → Una cache totalmente asociativa los reduce a cero, pero necesita mucho hardware y puede reducir la frecuencia de reloj. La técnicas para reducir la tasa de fallos pretenden reducir cada uno de ellos. 11-8 3 REDUCIR LA TASA DE FALLOS. Aumentar el tamaño de bloque Reduce los fallos de primera vez (↓ T F ). Mejora la localidad espacial. Reduce el número de bloques para un misma capacidad de la cache. • Puede empeorar los fallos por conflicto (↑ T F ). • Puede empeorar los fallos por capacidad (↑ T F ). Aumenta la penalización en caso de fallo (↑ P F ), ya que hay que traer más información de la memoria. P F depende de la latencia L y ancho de banda B de la memoria: P F = L + B1 n, siendo n el tamaño de bloque. Recordando la ecuación del tiempo de acceso Tacc = T A + T F × P F : • Si la memoria tiene alta latencia y alto ancho de banda: Interesa tamaño de bloque grande, ya que reduce T F con poco aumento de P F . • Si la memoria tiene baja latencia y bajo ancho de banda: Interesa tamaño de bloque pequeño. Traerse un bloque más grande reduce T F pero aumenta notablemente P F . 11-9 3 REDUCIR LA TASA DE FALLOS. Aumentar el tamaño de la cache Reduce los fallos por capacidad (↓ T F ). Aumenta el coste. Aumenta el tiempo en caso de acierto (↑ T A). Mayor asociatividad Reduce los fallos por conflicto (↓ T F ). Requiere más comparadores → puede aumentar el tiempo en caso de acierto (↑ T A) Reglas empı́ricas: Una correspondencia asociativa de 8 vı́as es casi tan buena como totalmente asociativa. Una cache con correspondencia directa de tama ño N tiene la misma tasa de fallos que una asociativa de dos vı́as de tamaño N2 . 11-10 3 REDUCIR LA TASA DE FALLOS. Predicción de vı́a y cache pseudo-asociativas Objetivo: reducir los fallos por conflicto sin aumentar el tiempo en caso de acierto. Idea: predicción de vı́a (Alpha 21264): • La cache es asociativa. • La cache incluye un predictor de qué bloque del conjunto se referenciará la próxima vez que se acceda a la cache. • Se accede al bloque predicho, y si la predicci ón es correcta, se devuelve. En otro caso, se compara con el resto de etiquetas. • Hay dos tiempos en caso de acierto: ◦ Si la predicción es correcta: sólo se compara con la etiqueta de este bloque → tiempo en caso de acierto bajo ◦ En caso de fallo en la predicción, se compara con el resto de bloques del conjunto → tiempo en caso de acierto más elevado. El predictor acierta en el 85 % de los casos. Cache pseudoasociativa. • Un bloque puede estar ubicado en dos sitios en la cache: ◦ El obtenido aplicando una correspondencia directa. ◦ El obtenido aplicando otra función sencilla (por ejemplo, invertir el bit de mayor peso del ı́ndice) → pseudo-conjunto. • Hay dos tiempo en caso de acierto: ◦ Si el bloque se encuentra en el primer lugar: tiempo en caso de acierto similar al de una correspondencia directa. ◦ Si el bloque se encuentra en el pseudo-conjunto: tiempo en caso de acierto mayor. Aumenta la penalización por fallo (P F ↑) en caso de que el bloque no esté ni en la primera ni en la segunda ubicación. Se gasta tiempo en comprobar la segunda ubicación antes de ir a la memoria principal. 11-11 3 REDUCIR LA TASA DE FALLOS. Optimizaciones del compilador El compilador genera un código optimizado que reduce la tasa de fallos. Reducción de la tasa de fallos de instrucciones: • Obtención de estadı́sticas sobre conflictos entre grupos de instrucciones. • Reordenación de grupos de instrucciones para reducir los fallos de conflicto. Reducción de los fallos de datos Ejemplo: operaciones con vectores. Reorganizar el c ódigo para operar sobre todos los datos de un bloque antes de pasar al siguiente. • Mejorar la localidad espacial. Intercambio de bucles Simplemente cambiando el anidamiento de los bucles podemos conseguir operar con los datos en el orden en que están almacenados: Ejemplo, vector x almacenado por filas: /* antes */ for (j=0; j<100; j=j+1) for (i=0; i<5000; i=i+1) x[i][j] = 2* x[i][j] /* despues */ for (i=0; i<5000; i=i+1) for (j=0; j<100; j=j+1) x[i][j] = 2* x[i][j] → salta 100 palabras en cada acceso → accede secuencialmente los datos. • Mejorar la localidad temporal: blocking Si los vectores se acceden tanto por filas como por columnas, es mejor operar sobre submatrices o bloques, tratando de maximizar los accesos a los datos cargados en la cache antes de reemplazarlos. Ejemplo: multiplicación de matrices /* despues */ /* antes */ for (jj=0; jj<N; jj=jj+B) for (i=0; i<N; i=i+1) for (kk=0; kk<N; kk=kk+B) for (j=0; j<N; j=j+1) for (i=0; i<N; i=i+1) { r=0; for (j=jj; j< min(jj+B,N); j=j+1) for (k=0; k<N; k=k+1) { r=0; r = r+y[i][k]*z[k][j] for (k=kk; k<min(kk+B,N); k=k+1) x[i][j] =r; r = r+y[i][k]*z[k][j] }; x[i][j] =x[i][j]+r; }; 11-12 4 REDUCIENDO PF/TF MEDIANTE PARALELISMO 4. Reduciendo la penalización por fallo/tasa de fallos mediante paralelismo → técnicas que solapan la ejecución de instrucciones en el procesador con el acceso a la memoria. Cache no bloqueante La cache continua aceptando peticiones de acceso mientras se está sirviendo un fallo de cache. Posibilidades: • “acierto ante fallo”: la cache suministra o acepta nuevas peticiones, siempre éstas sean aciertos. • “fallo ante fallo”/“acierto ante múltiples fallos”: se pueden servir múltiples fallos simultáneamente. 11-13 4 REDUCIENDO PF/TF MEDIANTE PARALELISMO Pre-búsqueda hardware de instrucciones y datos Idea: buscar la información antes de que sea solicitada por el procesador. La información pre-búscada se almacena en un buffer externo, que se accede más rápido que la memoria principal. Pre-búsqueda de instrucciones. • El procesador trae dos bloques ante un fallo: el bloque solicitado, que se ubica en la cache y el consecutivo, que se ubica en el buffer de instrucciones. • Cuando se produce un fallo de cache, se lee el bloque del buffer de instrucciones, si está disponible y se lanza la siguiente pre-búsqueda. • Evaluación de la propuesta. Cache de 4KB con bloques de 16 bytes: 1 único buffer evita un 15 %–25 % de los fallos 4 buffers evitan un 50 % de los fallos 16 buffers evitan un 72 % de los fallos Pre-búsqueda de datos. • Similar a la de instrucciones. • El bloque pre-buscado puede ser el consecutivo o estimado de alguna manera (por ejemplo, tomando en cuenta la diferencia entre la última dirección y la previa, UltraSPARC III). Los accesos a memoria principal por pre-búsqueda pueden interferir con los fallos de cache → puede aumentar la penalizaci ón por fallo de estos últimos. 11-14 4 REDUCIENDO PF/TF MEDIANTE PARALELISMO Pre-búsqueda controlada por el compilador El compilador inserta instrucciones de “pre-búsqueda” para solicitar los datos antes de que se necesiten. La pre-búsqueda debe ser invisible al programa: • no debe cambiar el contenido de los registros ni de la memoria • no debe generar fallos de página de memoria virtual ni excepciones por violación de protección. → nonbinding fetch Especialmente útil en bucles. Ejemplo: /* original */ for (i=0; i<3; i=i+1) for (j=0; j<100; j=j+1) a[i][j] = b[j][0]* b[j+1][0]; /* con pre-búsqueda */ for (j=0; j<100; j=j+1) { prefetch(b[j+7][0]) prefetch(a[0][j+7]) a[0][j] = b[j][0]* b[j+1][0];}; for (i=1; i<3; i=i+1) for (j=0; j<100; j=j+1) { prefetch(a[i][j+7]) a[i][j] = b[j][0]* b[j+1][0];}; Hay cierta sobrecarga: la inserción de instrucciones de pre-búsqueda aumenta el número de instrucciones ejecutadas por el programa. → hay que concentrarse en los accesos que serán fallos de bloque con una probabilidad alta. 11-15 5 REDUCIENDO EL TIEMPO EN CASO DE ACIERTO. 5. Reduciendo el tiempo en caso de acierto. Reducir el tiempo en caso de acierto es muy importante: afecta al periodo de reloj del procesador (la T de la ecuación del tiempo de ejecución). Caches pequeñas y sencillas Un gran % del tiempo de acceso a la cache se invierte en comparar el campo de etiqueta de la dirección con las etiquetas almacenadas en la cache. Modo de reducir este tiempo: • Cache pequeña: “el hardware pequeño es más rápido” y cabe en el mismo chip que el procesador. • Cache sencilla: correspondencia directa → puede solaparse la lectura del dato con la comprobación de la etiqueta. Tendencia: • Caches L1: pequeñas y sencillas. • Cache L2: más grandes, manteniendo las etiquetas en el mismo chip que el procesador y los datos en otro chip. 11-16 5 REDUCIENDO EL TIEMPO EN CASO DE ACIERTO. Evitar la traducción de memoria virtual durante el acceso a la cache Otra componente del tiempo en caso de acierto es el invertido en traducir la dirección virtual emitida por el procesador en una direcci ón fı́sica de memoria. Idea. Utilizar direcciones virtuales en la cache. Caches virtuales vs. caches fı́sicas Problemas: • Protección. Es parte del proceso de traducción dirección virtual → fı́sica. Hay que copiar información de la TLB a la cache. • Procesos. Cada vez que se cambia de contexto, una misma direcci ón virtual apunta a una dirección fı́sica distinta. Hay que vaciar la cache con cada cambio de contexto o bien añadir identificadores de proceso (PID) a las etiquetas de la cache. • Sinónimos o alias. Una misma dirección fı́sica puede referenciarse mediante dos o más direcciones virtuales. Hay varias copias del mismo dato, que deben mantenerse idénticas. Nueva idea. La dirección dentro de la página (page offset) es la misma, tanto en la dirección virtual como en la fı́sica. Virtually indexed physically tagged caches (Alpha 21264). • Utiliza parte de la dirección dentro de la página para seleccionar el conjunto (campo de “Índice”). • La lectura de la cache se realiza en paralelo con la traducci ón. • Limitación: el tamaño de una cache con correspondencia directa o del número de conjuntos de una cache con correspondencia asociativa no puede exceder el tamaño de página de memoria virtual. 11-17 5 REDUCIENDO EL TIEMPO EN CASO DE ACIERTO. Virtually indexed physically tagged caches (cont.) 11-18 5 REDUCIENDO EL TIEMPO EN CASO DE ACIERTO. Segmentación de la cache Segmenta el hardware de acceso a la cache de instrucciones. Un acceso a la cache requiere varios ciclos de reloj (por ejemplo, 4 ciclos en el Pentium 4). Pero pueden haber varios accesos en curso. Tiene implicaciones en la segmentación del procesador: más ciclos de parada en los saltos y en las operaciones de carga. Realmente, esta técnica aumenta el ancho de banda de la cache de instrucciones más que reducir su latencia. 11-19