¿Qué información almacena exactamente una caché de instrucciones?

ingrese la descripción de la imagen aquí

Los procesadores utilizan cachés de datos e instrucciones para reducir el número de accesos lentos a la memoria principal. Sin embargo, aunque para mí está claro que el propósito del caché de datos es almacenar elementos de datos de uso frecuente (como elementos en una matriz o dentro de un bucle), no puedo ver qué almacena exactamente el caché de instrucciones que ayuda a aliviar los tiempos de acceso a la memoria.

En la imagen de arriba, tenemos un ejemplo de una instrucción "addi" que agrega un valor constante al valor almacenado en el registro de propósito general "r2" y escribe el resultado en el registro de propósito general "r1".

Después de ejecutar esta instrucción, ¿qué se guarda exactamente en el caché?

  • No puede ser solo el código de operación: la mayoría de los conjuntos de instrucciones de la CPU contienen solo unos pocos cientos de códigos de operación únicos o menos, por lo que si el caché de instrucciones se precargara con todos los códigos de operación posibles, siempre tendría una tasa de éxito del 100%. Sin embargo, eso anularía el propósito de tener un caché, además, he leído que las fallas en el caché de instrucciones son muy posibles.
  • No pueden ser los valores de la memoria principal los que se cargan en los registros de propósito general, ya que eso es exactamente para lo que sirve el caché de datos.

Gracias de antemano.

¿Por qué cree que le importa a la memoria caché si se ejecutó o no una instrucción en particular? Las instrucciones generalmente no cambian en tiempo de ejecución.

Respuestas (3)

Literalmente almacena líneas de código de máquina desde la memoria del programa (también conocido como la instrucción completa que alineaste en tu publicación original).

El hecho de que incluso discuta "almacenar todos los códigos de operación posibles en caché" apunta a un malentendido más profundo. Hablar de almacenar todos los códigos de operación posibles en caché (o cualquier memoria) no tiene sentido. Todos los posibles códigos de operación que puede ejecutar el procesador están integrados en el circuito lógico del procesador. No están "almacenados" en ningún lado.

Ya veo, tenía la falsa impresión de que las instrucciones en la memoria del programa señaladas por el contador del programa estaban disponibles instantáneamente para la CPU, es decir, que todas las instrucciones estaban de alguna manera "cableadas". Gracias por aclararme las cosas.
Tenga en cuenta que esto solo es cierto para la mayoría de las CPU. Las recientes microoperaciones descodificadas de la tienda Intel x86 (es decir, el resultado de una etapa temprana del proceso de ejecución), y creo que AMD también puede haber cambiado a un caché de microoperaciones en lugar de un caché de instrucciones estricto.
@MartinX Cuando dice "todas las instrucciones estaban cableadas de alguna manera", ¿está diciendo que pensó que algo como "ADD, Reg1, Reg2" completo estaba cableado? ¿Y luego algo como "ADD, Reg2, Reg3" era un cableado separado? Porque ese no es el caso. No todas las combinaciones posibles de código de operación y argumento tienen un circuito único conectado a la CPU.
@Mark: Intel P4 tenía un caché de seguimiento en lugar de un caché L1i. Esto funcionó mal y fue un gran cuello de botella (porque era lento para generar rastros de fallas con sus decodificadores débiles). Intel desde Sandybridge ( realworldtech.com/sandy-bridge ) y AMD desde Zen todavía tienen cachés L1i regulares que almacenan en caché bytes de código de máquina x86, pero también tienen cachés uop decodificados muy rápidos más pequeños. Todavía tienen potentes decodificadores para un buen rendimiento en errores de caché uop, y no es un caché de seguimiento. (Una línea de caché de uop solo puede almacenar en caché uops contiguos de un fragmento de 32B, en lugar de seguir los saltos).
@PeterCordes ¿Esos cachés de microoperaciones son realmente cachés? ¿O son más como una memoria fuertemente acoplada?
@Mark: Algunas CPU AMD más antiguas almacenan metadatos adicionales junto con el caché L1i: marcan los límites de las instrucciones en el caché para acelerar la decodificación. Ver el pdf del microarco de Agner Fog . También David Kanter menciona los metadatos previos a la decodificación en realworldtech.com/bulldozer/4 . Más información al respecto en su artículo sobre K10: realworldtech.com/barcelona/4
@Toor: Intel llama a su caché decodificada-uop "Decode Stream Buffer (DSB)", incluido en los nombres de eventos del contador de rendimiento HW. Físicamente, está muy construido como un caché asociativo con cada "vía" de un conjunto con capacidad para 6 uops. Está indexado y etiquetado por dirección virtual (por lo que omite las búsquedas de TLB). Por supuesto, los cachés se crean a partir de matrices SRAM "estrechamente acopladas", pero lo que los convierte en cachés es el sistema de administración y el mecanismo de búsqueda/indexación.
La etapa de obtención toma un ciclo para pasar de la obtención del DSB a la decodificación heredada (MITE) o viceversa. Por lo tanto, no es solo un nivel adicional de la misma jerarquía que L1i / L2 / L3. Pero si quiere verlo como parte de esa jerarquía, a veces se le llama L0. Falta en el caché de uop no puede simplemente intentar obtener los mismos datos de otro lugar, tiene que cambiar a decodificar el código de máquina x86 (para ejecutarse directamente y llenar nuevas líneas en el caché de uop). A diferencia de Pentium 4, que tenía que crear un seguimiento antes de poder ejecutarlo, lo que hacía que los errores de caché de seguimiento fueran muy costosos.

La memoria caché de instrucciones almacena las instrucciones utilizadas más recientemente y sus direcciones, de modo que si es necesario repetir una instrucción, no es necesario recuperarla de la memoria principal; esto es mucho más rápido.

Por ejemplo, la primera vez que se realiza un bucle, las instrucciones se recuperarán de la memoria principal y se colocarán simultáneamente en la memoria caché. En iteraciones posteriores del bucle, las instrucciones se pueden recuperar rápidamente de la memoria caché rápida.

Las direcciones se almacenan en el caché junto con información que indica si el caché está actualizado para que el control de la CPU sepa si puede usar las instrucciones almacenadas en caché o necesita ir a la memoria principal.

Buena respuesta. Puede valer la pena enfatizar que las instrucciones se colocan en el caché a medida que se recuperan de la memoria (y, de hecho, antes de que se ejecuten) para aclarar el posible malentendido del OP de que la instrucción se guarda en el caché "después de que se ejecuta".

La memoria caché de instrucciones almacena las instrucciones individuales para la CPU del programa que se está ejecutando actualmente. Es el programa en sí. La memoria principal a menudo es demasiado lenta (o tiene demasiada latencia) para poder enviar a la CPU su siguiente instrucción cada vez que está lista para una. Es por eso que se usa un caché rápido cerca de la CPU, este es el caché de instrucciones.