La captación previa de caché es una técnica utilizada por los procesadores informáticos para aumentar el rendimiento de ejecución mediante la obtención de instrucciones o datos de su almacenamiento original en una memoria más lenta a una memoria local más rápida antes de que realmente se necesite (de ahí el término "captación previa"). [1] La mayoría de los procesadores de computadora modernos tienen una memoria caché local y rápida en la que los datos precargados se guardan hasta que se necesitan. El origen de la operación de captación previa suele ser la memoria principal . Debido a su diseño, acceder a las memorias caché suele ser mucho más rápido que acceder a la memoria principal , por lo que la obtención previa de datos y luego acceder a ellos desde las cachés suele ser muchos órdenes de magnitud más rápido que acceder a ellos directamente desde la memoria principal.. La captación previa se puede realizar con instrucciones de control de caché sin bloqueo .
Precarga de caché de datos frente a instrucciones
La captación previa de caché puede recuperar datos o instrucciones en caché.
- La captación previa de datos recupera los datos antes de que se necesiten. Debido a que los patrones de acceso a datos muestran menos regularidad que los patrones de instrucción, la captura previa de datos precisa es generalmente más desafiante que la captura previa de instrucciones.
- La captación previa de instrucciones recupera las instrucciones antes de que deban ejecutarse. Los primeros microprocesadores convencionales que utilizaron alguna forma de captación previa de instrucciones fueron el Intel 8086 (seis bytes) y el Motorola 68000 (cuatro bytes). En los últimos años, todos los procesadores de alto rendimiento utilizan técnicas de captación previa.
Precarga de caché de hardware frente a software
La captación previa de caché se puede realizar mediante hardware o software. [2]
- La captación previa basada en hardware generalmente se logra al tener un mecanismo de hardware dedicado en el procesador que observa el flujo de instrucciones o datos que solicita el programa en ejecución, reconoce los siguientes elementos que el programa podría necesitar en función de este flujo y los capta previamente en la memoria caché del procesador. . [3]
- La captación previa basada en software se logra típicamente haciendo que el compilador analice el código e inserte instrucciones de "captación previa" adicionales en el programa durante la propia compilación. [4]
Métodos de obtención previa de hardware
Búferes de transmisión
- Los búferes de flujo se desarrollaron basándose en el concepto de "esquema de búsqueda anticipada de un bloque (OBL)" propuesto por Alan Jay Smith . [1]
- Los búferes de transmisión son una de las técnicas de captura previa basadas en hardware más comunes que se utilizan. Esta técnica fue propuesta originalmente por Norman Jouppi en 1990 [5] y desde entonces se han desarrollado muchas variaciones de este método. [6] [7] [8] La idea básica es que la dirección de falta de caché (y direcciones posteriores) se obtienen en un búfer de profundidad separado . Este búfer se denomina búfer de flujo y está separado del caché. A continuación, el procesador consume datos / instrucciones del búfer de flujo si la dirección asociada con los bloques precargados coincide con la dirección solicitada generada por el programa que se ejecuta en el procesador. La siguiente figura ilustra esta configuración:
- Siempre que el mecanismo de captación previa detecta un error en un bloque de memoria, digamos A, asigna un flujo para comenzar a captar bloques sucesivos desde el bloque perdido en adelante. Si el búfer de flujo puede contener 4 bloques, entonces obtendríamos previamente A + 1, A + 2, A + 3, A + 4 y los mantendríamos en el búfer de flujo asignado. Si el procesador consume A + 1 a continuación, se moverá "hacia arriba" del búfer de flujo al caché del procesador. La primera entrada del búfer de flujo ahora sería A + 2 y así sucesivamente. Este patrón de captación previa de bloques sucesivos se denomina captación previa secuencial . Se utiliza principalmente cuando las ubicaciones contiguas se van a buscar previamente. Por ejemplo, se utiliza al obtener instrucciones previamente.
- Este mecanismo se puede ampliar agregando varios de estos "búferes de flujo", cada uno de los cuales mantendría un flujo de captación previa independiente. Para cada nueva falla, habría una nueva memoria intermedia de flujo asignada y funcionaría de una manera similar a la descrita anteriormente.
- La profundidad ideal del búfer de flujo es algo que está sujeto a experimentación con varios puntos de referencia [5] y depende del resto de la microarquitectura involucrada.
Otro patrón de precarga de instrucciones es precargar direcciones que son direcciones adelante en la secuencia. Se utiliza principalmente cuando los bloques consecutivos que se van a precargar sondirecciones aparte. [2] Esto se denomina Prefetching Strided.
Métodos de obtención previa de software
Precarga dirigida por el compilador
La captación previa dirigida por el compilador se usa ampliamente en bucles con una gran cantidad de iteraciones. En esta técnica, el compilador predice fallas futuras de caché e inserta una instrucción de captación previa basada en la penalización por fallar y el tiempo de ejecución de las instrucciones.
Estas captaciones previas son operaciones de memoria sin bloqueo, es decir, estos accesos a la memoria no interfieren con los accesos reales a la memoria. No cambian el estado del procesador ni provocan fallos en la página.
Una de las principales ventajas de la captación previa de software es que reduce el número de pérdidas de caché obligatorias. [2]
El siguiente ejemplo muestra cómo se agregará una instrucción de captación previa a un código para mejorar el rendimiento de la caché .
Considere un bucle for como se muestra a continuación:
para ( int i = 0 ; i < 1024 ; i ++ ) { matriz1 [ i ] = 2 * matriz1 [ i ]; }
En cada iteración, se accede al i- ésimo elemento de la matriz "matriz1". Por lo tanto, podemos precargar los elementos a los que se accederá en futuras iteraciones insertando una instrucción "prefetch" como se muestra a continuación:
for ( int i = 0 ; i < 1024 ; i ++ ) { prefetch ( array1 [ i + k ]); matriz1 [ i ] = 2 * matriz1 [ i ]; }
Aquí, el paso previo a la captación, depende de dos factores, la penalización por falta de caché y el tiempo que se tarda en ejecutar una única iteración del bucle for . Por ejemplo, si una iteración del ciclo tarda 7 ciclos en ejecutarse, y la penalización por error de caché es de 49 ciclos, entonces deberíamos tener- lo que significa que precargamos 7 elementos por delante. Con la primera iteración, i será 0, por lo que buscamos previamente el séptimo elemento. Ahora, con esta disposición, los primeros 7 accesos (i = 0-> 6) aún serán fallidos (bajo el supuesto simplificador de que cada elemento de array1 está en una línea de caché separada).
Comparación de la captación previa de hardware y software
- Mientras que la captación previa de software requiere la intervención del programador o del compilador , la captación previa de hardware requiere mecanismos de hardware especiales. [2]
- La captación previa de software funciona bien solo con bucles donde hay acceso regular a la matriz, ya que el programador tiene que codificar manualmente las instrucciones de captación previa. Mientras que los captadores previos de hardware funcionan dinámicamente en función del comportamiento del programa en tiempo de ejecución . [2]
- La captación previa de hardware también tiene menos sobrecarga de CPU en comparación con la captación previa de software. [9]
Métricas de captación previa de caché
Hay tres métricas principales para juzgar la captación previa de caché [2]
Cobertura
La cobertura es la fracción del total de errores que se eliminan debido a la captación previa, es decir
,
dónde,
Precisión
La precisión es la fracción del total de captaciones previas que fueron útiles, es decir, la relación entre el número de direcciones de memoria captadas previamente a las que el programa hizo referencia en realidad al total de captaciones previas realizadas.
Si bien parece que tener una precisión perfecta podría implicar que no hay errores, este no es el caso. Las captaciones previas en sí pueden dar lugar a nuevos fallos si los bloques captados previamente se colocan directamente en la caché. Aunque estos pueden ser una pequeña fracción del número total de errores que podríamos ver sin ninguna búsqueda previa, este es un número de errores distinto de cero.
Oportunidad
La definición cualitativa de puntualidad es qué tan pronto se precarga un bloque en comparación con cuándo se hace referencia a él. Un ejemplo para explicar mejor la puntualidad es el siguiente:
Considere un bucle for donde cada iteración tarda 3 ciclos en ejecutarse y la operación de 'captación previa' tarda 12 ciclos. Esto implica que para que los datos capturados previamente sean útiles, debemos iniciar la captura previa iteraciones antes de su uso para mantener la puntualidad.
Ver también
Referencias
- ↑ a b Smith, Alan Jay (1 de septiembre de 1982). "Caché de memorias". Computación ACM. Surv . 14 (3): 473–530. doi : 10.1145 / 356887.356892 . ISSN 0360-0300 .
- ^ a b c d e f Solihin, Yan (2016). Fundamentos de la arquitectura multinúcleo en paralelo . Boca Raton, FL: CRC Press, Taylor & Francis Group. pag. 163. ISBN 978-1482211184.
- ^ Baer, Jean-Loup; Chen, Tien-Fu (1 de enero de 1991). Un esquema efectivo de precarga en chip para reducir la penalización por acceso a datos . 1991 Conferencia ACM / IEEE sobre supercomputación. Albuquerque, Nuevo México, EE.UU .: ACM. págs. 176-186. CiteSeerX 10.1.1.642.703 . doi : 10.1145 / 125826.125932 . ISBN 978-0897914598.
- ^ Kennedy, Porterfield, Allan (1 de enero de 1989). Métodos de software para mejorar el rendimiento de la caché en aplicaciones de supercomputadoras (Tesis). Universidad de Rice. hdl : 1911/19069 .
- ^ a b c Jouppi, Norman P. (1990). Mejora del rendimiento de la caché de asignación directa mediante la adición de una pequeña caché totalmente asociativa y búferes de captación previa . Nueva York, Nueva York, Estados Unidos: ACM Press. CiteSeerX 10.1.1.37.6114 . doi : 10.1145 / 325164.325162 . ISBN 0-89791-366-3.
- ^ Chen, Tien-Fu; Baer, Jean-Loup (1 de mayo de 1995). "Precarga efectiva de datos basada en hardware para procesadores de alto rendimiento". Transacciones IEEE en computadoras . 44 (5): 609–623. doi : 10.1109 / 12.381947 . ISSN 0018-9340 . S2CID 1450745 .
- ^ Palacharla, S .; Kessler, RE (1 de enero de 1994). Evaluación de búferes de transmisión como reemplazo de caché secundario . 21º Simposio Internacional Anual de Arquitectura de Computadores. Chicago, IL, EE.UU .: IEEE Computer Society Press. págs. 24–33. CiteSeerX 10.1.1.92.3031 . doi : 10.1109 / ISCA.1994.288164 . ISBN 978-0818655104.
- ^ Grannaes, Marius; Jahre, Magnus; Natvig, Lasse (2011). "Precarga de hardware de almacenamiento eficiente mediante tablas de predicción de correlación delta". Journal of Instruction-Level Parallelism (13): 1–16. CiteSeerX 10.1.1.229.3483 .
- ^ Callahan, David; Kennedy, Ken; Porterfield, Allan (1 de enero de 1991). Precarga de software . IV Congreso Internacional de Soporte Arquitectónico para Lenguajes de Programación y Sistemas Operativos. Santa Clara, CA, EE.UU .: ACM. págs. 40–52. doi : 10.1145 / 106972.106979 . ISBN 978-0897913805.