¿Cuál es el motor de stack en la microarchitecture Sandybridge?

Estoy leyendo http://www.realworldtech.com/sandy-bridge/ y tengo algunos problemas para comprender algunos problemas:

El rastreador de puntero de stack dedicado también está presente en Sandy Bridge y cambia el nombre del puntero de la stack, eliminando las dependencias en serie y eliminando una cantidad de uops.

¿Qué es realmente un dedicated stack pointer tracker ?

Para Sandy Bridge (y el P4), Intel todavía usa el término ROB. Pero es fundamental entender que, en este contexto, solo se refiere a la matriz de estado para los uops en vuelo

¿Qué significa de hecho? Por favor aclare.

  1. Al igual que explica el microarch documental de Agner Fog , el motor de stack maneja la parte rsp+=8 / rsp-=8 de push / pop / call / ret en la etapa de emisión de la canalización (antes de emitir uops en Out-of-Order (OoO) parte del núcleo).

    Entonces, la parte de ejecución de OoO del núcleo solo tiene que manejar la parte de carga / almacenamiento, con una dirección generada por el motor de stack. Ocasionalmente tiene que insertar un uop para sincronizar su desplazamiento desde rsp cuando el contador de desplazamiento de 8 bits se desborda, o cuando el núcleo OoO necesita el valor de rsp directamente (ej. sub rsp, 8 , o mov [rsp-8], eax después de una call , ret , push o pop generalmente provocan que se inserte un uop extra en las CPU de Intel. Las CPU de AMD aparentemente no necesitan uops de sincronización extra).

    Tenga en cuenta que las tablas de instrucciones de Agner muestran que Pentium-M y más tarde decodifican popreg a un solo uop que se ejecuta solo en el puerto de carga. Pero Pentium II / III decodifica pop eax a 2 uops; 1 ALU y 1 carga , porque no hay un motor de acumulación para manejar el ajuste del ESP fuera del núcleo fuera de servicio. Además de tomar uops extra, una larga cadena de push / pop y call / ret crea una dependencia en serie de ESP, por lo que la ejecución fuera de orden tiene que masticar los uou de ALU antes de que un valor esté disponible para un mov ebp, esp o dirección para mov eax, [esp+16] .


  1. La familia de microarcas P6 (PPro a Nehalem) almacenó los valores de entrada para un uop directamente en el ROB. En cuestión / cambio de nombre, las entradas de registro “frío” se leen desde el archivo de registro arquitectónico en el ROB (que puede ser un cuello de botella, debido a puertos de lectura limitados. Consulte puestos de lectura de registro). Después de ejecutar un uop, el resultado está escrito en el ROB para que otros uops lo lean. El archivo de registro de architecture se actualiza con valores del ROB cuando uops se retira.

    Las microarchitectures de la familia SnB (y P4) tienen un archivo de registro físico, por lo que ROB almacena números de registro (es decir, un nivel de indirección) en lugar de los datos directamente. Reordenar búfer sigue siendo un nombre excelente para esa parte de la CPU.

Tenga en cuenta que SnB introdujo AVX, con 256b vectores. Hacer que cada entrada de ROB sea lo suficientemente grande como para almacenar vectores de doble tamaño era presumiblemente indeseable en comparación con solo mantenerlas en un archivo de registro FP más pequeño.

SnB simplificó el formato uop para ahorrar energía. Sin embargo, esto condujo a un sacrificio en la capacidad de microfusión de uop: los decodificadores y el uop-caché aún pueden micro fusibles operandos de memoria usando modos de direccionamiento de 2 registros (indexados), pero están “sin laminar” antes de emitirse en el OOO. núcleo .

La máquina de stack es como otro puerto de ejecución / memoria. Como dice Fog:

La modificación del puntero de stack mediante instrucciones PUSH, POP, CALL y RET se realiza mediante un motor de stack especial. … Esto alivia la tubería de la carga de μops que modifican el puntero de la stack.

Entonces eso es cuidar la aritmética rsp + = 8 / rsp- = 8. Se manejan con la máquina de stack sin competir por los recursos de puerto de ejecución. Pero hay más.

La stack de direcciones de retorno de hardware de 16 profundidades (Sección 3.4.1.4 del Manual de referencia de optimización de architectures Intel® 64 e IA-32) es una sombra rápida de las direcciones de retorno. Apareció en Pentium M. También se usa predicción de retorno. Busque el documento de microarchitecture de Fog para “buffer de stack de retorno” un poco, pero no mucho más.

Así que ahora tiene un buen HW para reducir la contención del puerto de ejecución para la aritmética de la stack y los valores de la dirección de retorno de la caché rápida. Puedes dificultar la vida de la máquina de la stack al tratar de burlarla. Básicamente, siempre coincide con llamadas / rets y empuja y muestra. Entonces estás listo para ir.