Un buffer de estantería es una técnica que se utiliza en los procesadores de ordenador para aumentar la eficiencia de los procesadores superescalares . Permite que se envíen varias instrucciones a la vez independientemente de las dependencias de datos entre ellas. Esto permite que se produzca una ejecución fuera de orden , lo que aumenta el rendimiento del microprocesador.
Un procesador superescalar permite la ejecución de varias instrucciones simultáneamente en el núcleo del propio procesador, aunque este comportamiento no debe confundirse con un sistema multiprocesador. La mayoría de los procesadores modernos son superescalares. En un procesador superescalar se envían varias instrucciones desde el mismo hilo. Los procesadores multinúcleo contienen varios procesadores que ejecutan todos hilos separados.
La ejecución de instrucciones en paralelo (es decir, simultáneamente) plantea problemas con las dependencias de datos, lo que significa que algunas instrucciones pueden depender de los resultados de otras y, por lo tanto, se debe tener cuidado para ejecutarlas en el orden correcto.
Tomemos como ejemplo esta secuencia de instrucciones:
r1 = r2 + r3
r7 = r1 + r4
La actualización de r7 introduce una dependencia de datos (Read After Write) . La primera línea de instrucciones debe completarse antes de que comience la ejecución de la segunda, ya que r7 requiere que se conozca el valor correcto de r1 (registro 1) antes de la ejecución. Este tipo de instrucción no se puede ejecutar de manera concurrente o simultánea, el orden de las operaciones es implícitamente serial.
Con un procesador superescalar, la ventana de instrucciones del procesador se llena con una cantidad de instrucciones (conocida como tasa de emisión). Según el esquema que utilice el procesador superescalar para enviar estas instrucciones desde la ventana al núcleo de ejecución de la CPU, pueden surgir problemas si existe una dependencia similar a la que se muestra arriba.
Considere una ventana de instrucciones de 3 instrucciones de ancho, que contiene i1, i2, i3 (instrucciones 1, 2 y 3). Suponga que i2 depende de una instrucción que aún no ha terminado de ejecutarse y que aún no se puede ejecutar.
Sin el uso de un búfer de estantería, el procesador superescalar ejecutará i1, esperará hasta que se pueda ejecutar i2 y luego ejecutará i2 e i3 simultáneamente.
Sin embargo, con el uso de un búfer de estantería, la ventana de instrucciones se vaciará en búferes de estantería independientemente del contenido. El procesador buscará entonces una cantidad adecuada de instrucciones en los búferes de estantería que se puedan ejecutar en paralelo (es decir, sin dependencias).
Por lo tanto, el procesador tiene una mayor probabilidad de ejecutar el máximo número de instrucciones simultáneamente y maximizar el rendimiento.