En informática , una instrucción de control de caché es una sugerencia incrustada en el flujo de instrucciones de un procesador destinado a mejorar el rendimiento de los cachés de hardware , utilizando el conocimiento previo del patrón de acceso a la memoria proporcionado por el programador o compilador . [1] Pueden reducir la contaminación de la memoria caché , reducir los requisitos de ancho de banda, omitir latencias, proporcionando un mejor control sobre el conjunto de trabajo . La mayoría de las instrucciones de control de caché no afectan la semántica de un programa, aunque algunas pueden hacerlo.
Ejemplos de
Varias de estas instrucciones, con variantes, son compatibles con varias arquitecturas de conjuntos de instrucciones de procesador , como ARM , MIPS , PowerPC y x86 .
Prefetch
También denominado toque de bloque de caché de datos , el efecto es solicitar la carga de la línea de caché asociada con una dirección determinada. Esto se realiza mediante la PREFETCH
instrucción en el conjunto de instrucciones x86 . Algunas variantes pasan por alto los niveles más altos de la jerarquía de caché , lo que es útil en un contexto de 'transmisión' para los datos que se atraviesan una vez, en lugar de mantenerse en el conjunto de trabajo. La captación previa debe ocurrir con suficiente anticipación en el tiempo para mitigar la latencia del acceso a la memoria, por ejemplo, en un bucle que atraviesa la memoria linealmente. La función intrínseca de la colección de compiladores GNU se puede utilizar para invocar esto en los lenguajes de programación C o C ++ . __builtin_prefetch
Captación previa de instrucciones
Una variante de captación previa para la caché de instrucciones.
El bloque de caché de datos asigna cero
Esta sugerencia se utiliza para preparar líneas de caché antes de sobrescribir el contenido por completo. En este ejemplo, la CPU no necesita cargar nada desde la memoria principal . El efecto semántico es equivalente a un conjunto de memorias alineado de un bloque del tamaño de una línea de caché a cero, pero la operación es efectivamente gratuita.
El bloque de caché de datos invalida
Esta sugerencia se utiliza para descartar líneas de caché, sin enviar su contenido a la memoria principal. Es necesario tener cuidado ya que es posible que se obtengan resultados incorrectos. A diferencia de otras sugerencias de caché, la semántica del programa se modifica significativamente. Se utiliza junto con allocate zero
para gestionar datos temporales. Esto ahorra ancho de banda innecesario de la memoria principal y contaminación de la caché.
Vaciado del bloque de caché de datos
Esta sugerencia solicita el desalojo inmediato de una línea de caché, dando paso a futuras asignaciones. Se utiliza cuando se sabe que los datos ya no forman parte del conjunto de trabajo .
Otras sugerencias
Algunos procesadores admiten una variante de instrucciones de almacenamiento de carga que también implican sugerencias de caché. Un ejemplo está load last
en el conjunto de instrucciones de PowerPC , que sugiere que los datos solo se usarán una vez, es decir, la línea de caché en cuestión puede ser empujada al principio de la cola de desalojo, mientras se mantiene en uso si todavía se necesita directamente.
Alternativas
Captación previa automática
En los últimos tiempos, las instrucciones de control de caché se han vuelto menos populares a medida que los diseños de procesadores de aplicaciones cada vez más avanzados de Intel y ARM dedican más transistores a acelerar el código escrito en lenguajes tradicionales, por ejemplo, realizar una captación previa automática, con hardware para detectar patrones de acceso lineal sobre la marcha. Sin embargo, las técnicas pueden seguir siendo válidas para los procesadores orientados al rendimiento, que tienen un equilibrio entre rendimiento y latencia diferente, y pueden preferir dedicar más área a las unidades de ejecución.
Memoria del bloc de notas
Algunos procesadores admiten memoria de bloc de notas en la que se pueden colocar temporales y acceso directo a la memoria (DMA) para transferir datos hacia y desde la memoria principal cuando sea necesario. Este enfoque lo utilizan el procesador Cell y algunos sistemas integrados . Estos permiten un mayor control sobre el tráfico de memoria y la localidad (ya que el conjunto de trabajo se administra mediante transferencias explícitas) y elimina la necesidad de una costosa coherencia de caché en una máquina de muchos núcleos .
La desventaja es que requiere técnicas de programación significativamente diferentes para usar. Es muy difícil adaptar programas escritos en lenguajes tradicionales como C y C ++ que presentan al programador una vista uniforme de un gran espacio de direcciones (que es una ilusión simulada por cachés). Un microprocesador tradicional puede ejecutar más fácilmente código heredado, que luego puede acelerarse mediante instrucciones de control de caché, mientras que una máquina basada en bloc de notas requiere una codificación dedicada desde cero hasta que funcione uniformemente. Las instrucciones de control de caché son específicas para un determinado tamaño de línea de caché, que en la práctica puede variar entre generaciones de procesadores en la misma familia arquitectónica. Los cachés también pueden ayudar a fusionar las lecturas y escrituras de patrones de acceso menos predecibles (por ejemplo, durante el mapeo de texturas ), mientras que el DMA de scratchpad requiere la reelaboración de algoritmos para recorridos 'lineales' más predecibles.
Como tales, los blocs de notas son generalmente más difíciles de usar con los modelos de programación tradicionales, aunque los modelos de flujo de datos (como TensorFlow ) pueden ser más adecuados.
Búsqueda de vector
Los procesadores vectoriales (por ejemplo, la unidad de procesamiento de gráficos (GPU) moderna y Xeon Phi ) utilizan un paralelismo masivo para lograr un alto rendimiento mientras trabajan con la latencia de la memoria (lo que reduce la necesidad de captación previa). Muchas operaciones de lectura se emiten en paralelo, para invocaciones posteriores de un núcleo de cálculo ; los cálculos se pueden poner en espera a la espera de datos futuros, mientras que las unidades de ejecución se dedican a trabajar con datos de solicitudes pasadas que ya han aparecido. Esto es más fácil de aprovechar para los programadores junto con los modelos de programación apropiados ( núcleos de cómputo ), pero más difícil de aplicar a la programación de propósito general.
La desventaja es que muchas copias de estados temporales pueden guardarse en la memoria local de un elemento de procesamiento , esperando datos en vuelo.
Referencias
- ^ "Manual de Power PC, consulte 1.10.3 Instrucciones de control de caché" (PDF) .