2. La CDC 6600 de Seymour Cray, construida
La inmensa mayoría de las CPUs
en 1965, es la primera arquitectura
superescalar, siendo llevado1998
desarrolladas desde son
el concepto a
superescalares.
las microcomputadoras en las CPUs RISC.
3. El procesamiento superescalar es la
última de una serie de innovaciones
tendientes a producir procesadores
cada vez más rápidos. Explotando el
paralelismo a nivel de instrucción.
Los procesadores superescalares son
capaces de ejecutar más de una
instrucción por ciclo de reloj .
4. Lo esencial del enfoque superescalar
es su habilidad para ejecutar
instrucciones en diferentes cauces de
manera independiente y
concurrente. El concepto puede
llevarse más lejos permitiendo que
las instrucciones se ejecuten en un
orden diferente al del programa.
5. Banco de Registros de Banco de Registros de
Enteros Coma Flotante
Unidades
Funcionales
Segmentadas
Memoria
Hay múltiples unidades funcionales, cada una de las cuales está
implementada como un cauce segmentado, que admiten la ejecución
en paralelo de varias instrucciones. En el ejemplo, dos operaciones
enteras, dos de coma flotante y una de memoria (carga o
almacenamiento) pueden estar ejecutándose en el mismo instante.
6. Dependencia de Datos
Verdadera
La aproximación superescalar depende Dependencia Relativa al
de la habilidad para ejecutar múltiples Procedimiento
instrucciones en paralelo.
Para maximizar el paralelismo en las Conflicto en los Recursos
instrucciones, se puede usar una
combinación de optimizaciones
realizadas por el compilador y de
técnicas de hardware. Dependencia de Salida
Antidependencia
7. Consideremos la siguiente secuencia:
add r1, r2 ; Cargar el registro r1 con el contenido de r2
más el contenido de r1.
move r3, r1 ; Cargar el registro r3 con el contenido de r1.
La segunda instrucción se puede captar y decodificar, pero no se puede
ejecutar hasta que finalice la ejecución de la primera instrucción. El motivo es
que la segunda instrucción necesita un dato producido por la primera
instrucción. Esta situación es conocida como “dependencia de datos
verdadera” (también llamada dependencia de flujo o dependencia escritura -
lectura).
8. Clave: Ejec.
Capt. Decod. Escr.
i0
i1 Sin dependencia
Dependencia de datos(i1 usa
i0 datos calculados por 10)
i1
i0 Dependencia relativa al
procedimiento
i1/salto
i2
i3
i4
i5
i0
Conflicto en los recursos (i0 e i1 usan
i1 la misma unidad funcional)
0 1 2 3 4 5 6 7 8 9
Tiempo en ciclos base.
9. Consideraremos la siguiente secuencia, en la cual una de las
cargas se hace desde la memoria y no desde un registro:
load r1, ef ; cargar el registro r1 con el contenido de la
dirección de memoria efectiva ef.
move r3, r1 ; carga el registro r3 con el contenido de r1.
Este esquema es menos efectivo en el caso de un cauce superescalar: las
instrucciones independientes que se ejecutan durante la carga lo hacen
probablemente en el primer ciclo de esta, dejan al procesador sin nada que
hacer hasta que concluya la carga.
10. Clave: Ejec.
Capt. Decod. Escr.
i0
i1 Sin dependencia
Dependencia de datos(i1
i0 usa datos calculados por
La figura anterior
i1 10)
i0 Dependencia relativa al
i1/salto procedimiento
i2
La presencia de saltos en una secuencia
i3
i4
de instrucciones complica el
i5
funcionamiento del cauce. Las
instrucciones que siguen a una
i0 Conflicto en los recursos (i0 e i1
i1
bifurcación (en la que se puede saltar o usan la misma unidad funcional)
no) tienen una dependencia relativa al
0 1 2 3 4 5 6 7 8 9
procedimiento en esa bifurcación y no
pueden ejecutarse hasta que se ejecute el Tiempo en ciclos base.
salto.
Ilustra el efecto de un salto en un cauce superescalar de grado 2.
Si se usan instrucciones de longitud variable, surge otro tipo de
dependencia relativa al procedimiento.
11. Clave: Ejec.
Capt. Decod. Escr.
Un conflicto en un recurso es una pugna de dos o más
i0
i1 Sin dependencia
instrucciones por el mismo recurso al mismo tiempo.
Desde el punto de vista del cauce segmentado,datos(i1conflicto en
i0
Dependencia de
un
usa datos calculados por
los recursos presenta el mismo comportamiento que una
i1 10)
dependencia de datos (figura anterior). No obstante, hay
i0 Dependencia relativa al
algunas diferencias.
i1/salto procedimiento
i2
i3
i4
i5
i0 Conflicto en los recursos (i0 e i1
i1
usan la misma unidad funcional)
0 1 2 3 4 5 6 7 8 9
Tiempo en ciclos base.
12. Una instrucción S2 presenta una
dependencia de salida respecto de S1 si y
solo si S1 y S2 modifican el mismo recurso
y S1 precede a S2 en el orden de
ejecución.
El siguiente ejemplo muestra una dependencia de salida:
S1 x := 10
S2 x := 20
13. Una instrucción S2 es antidependiente de
S1 si y solo si S2 modifica un recurso que
S1 lee y S1 precede a S2 en el orden de
ejecución.
El siguiente ejemplo muestra una antidependencia:
S1 x := y + c
S2 y := 10
14. Una solución alternativa para alcanzar
mayores prestaciones es la llamada
supersegmentación, un término acuñado
Una solución alternativa para
en 1988. La supersegmentación aprovecha
alcanzar mayores prestaciones
el hecho de que muchas etapas del cauce
es la llamada
realizan tareas que requieren menos de
supersegmentación, un término
medio ciclo de reloj. De este modo,
acuñado en 1988.
doblando la velocidad de reloj interna se
permite la realización de dos tareas en un
ciclo de reloj externo.
15. Clave: Ejec.
Capt. Decod. Escr.
Cauce sencillo de 4
Instrucciones Sucesivas etapas
Supersegmentada
Superescalar
0 1 2 3 4 5 6 7 8 9
Tiempo en ciclos base.
16. Las dos realizaciones, supersegmentada y
superescalar, ejecutan el mismo número de
instrucciones en el mismo tiempo cuando
funcionan de forma interrumpida. El procesador
supersegmentado se queda atrás con respecto al
procesador superescalar al comienzo del
programa y en cada destino de un salto.
17. Existe paralelismo en las instrucciones cuando las
instrucciones de una secuencia son independientes
y por tanto pueden ejecutarse en paralelo
solapándose.
18. Como ejemplo del concepto de paralelismo en las instrucciones,
consideremos los dos siguientes fragmentos de código:
Load R1 R2 Add R3 R3, “1”
Add R3 R3, “1” Add R4 R3, R2
Add R4 R4, R2 Store [R4] R0
Las tres instrucciones de la izquierda son independientes, y en
teoría las tres podrían ejecutarse en paralelo. Por el contrario, las
tres instrucciones de la derecha no pueden ejecutarse en paralelo
porque la segunda instrucción usa el resultado de la primera, y la
tercera instrucción usa el resultado de la segunda.
19. El paralelismo en las instrucciones depende
de la frecuencia de dependencias de datos
verdaderas y dependencias relativas al
procedimiento que haya en el código. Estos
factores dependen a su vez de la
arquitectura del repertorio de instrucciones
y de la aplicación.
20. El paralelismo de la máquina es una medida de la capacidad del
procesador para sacar partido al paralelismo en las instrucciones.
El paralelismo de la máquina depende del número de
instrucciones que pueden captarse y ejecutarse al mismo tiempo
(número de cauces paralelos) y de la velocidad y sofisticación de
los mecanismos que usa el procesador para localizar
instrucciones independientes.
21. El procesador además tiene que ser capaz de identificar el
paralelismo en las instrucciones y organizar la captación,
decodificación y ejecución de las instrucciones en paralelo.
En general, se puede decir que la emisión de una instrucción
tiene lugar cuando ésta pasa de la etapa de decodificación del
cauce a la primera etapa de ejecución.
22. Esencialmente, el procesador intenta localizar instrucciones más allá del
punto de ejecución en curso que puedan introducirse en el cauce y
ejecutarse. Con respecto a esto, hay tres ordenaciones importantes:
El orden en que se captan las instrucciones.
El orden en que se ejecutan las instrucciones.
El orden en que las instrucciones actualizan los contenidos de
los registros y de las posiciones de memoria.
23. Emisión en orden y Finalización
Para optimizar la utilización de los en orden.
diversos elementos del cauce, el
procesador tendrá que alterar uno o más
de estos órdenes con respecto al orden
que se encontraría en una ejecución Emisión en orden y Finalización
secuencial estricta. desordenada.
En términos generales, podemos agrupar
las políticas de emisión de instrucciones
de los procesadores superescalares en
las siguientes categorías:
Emisión desordenada y
Finalización desordenada.
24. La política de emisión de instrucciones más
sencilla es emitir instrucciones en el orden exacto
en que lo haría una ejecución secuencial (emisión
en orden) y escribir los resultados en ese mismo
orden (finalización en orden). Ni siquiera los
cauces escalares siguen una política ingenua. No
obstante, es útil considerar esta política como
base con la cual comparar otras aproximaciones
más sofisticadas.
25. Suponemos un cauce superescalar capaz de captar y decodificar dos
instrucciones a la vez, con tres unidades funcionales independientes, y con
dos copias de la etapa de escritura del cauce. El ejemplo supone las
siguientes restricciones para un fragmento de código de seis instrucciones:
• I1 necesita dos ciclos para ejecutarse.
• I3 e I4 compiten por la misma unidad funcional.
• I5 depende de un valor producido por I4.
• I5 e I6 compiten por una unidad funcional.
26. La finalización desordenada se usa en los
procesadores RISC escalares para mejorar la
velocidad de las instrucciones que necesitan
ciclos.
Con la finalización desordenada, puede haber
cualquier número de instrucciones en la
etapa de ejecución en un momento dado,
hasta alcanzar el máximo grado de
paralelismo de la máquina ocupando todas
las unidades funcionales. La emisión de
instrucciones se para cuando hay una pugna
por un recurso, una dependencia de datos o
una dependencia relativa al procedimiento.
27. Aparte de las limitaciones anteriores, surge una nueva dependencia, a la
cual nos referimos anteriormente como dependencia de salida. El
siguiente fragmento de código ilustra esta dependencia (op representa
cualquier operación):
I1: R3 R3 op R5
I2: R4 R3 + 1
I3: R3 R5 + 1
I4: R7 R3 op R4
28. La finalización desordenada necesita una lógica de emisión de
instrucciones más compleja que la finalización en orden.
Además, es más difícil ocuparse de las interrupciones y
excepciones. Cuando ocurre una interrupción, la ejecución de
instrucciones se suspende en el punto actual, para reanudarse
posteriormente. El procesador debe asegurar que la reanudación
tiene en cuenta que, en el momento de la interrupción, algunas
interrupciones posteriores a la instrucción que provocó dicha
interrupción pueden haber finalizado ya.
29. Para permitir la emisión desordenada, es necesario desacoplar las
etapas del cauce de decodificación y ejecución. Esto se hace mediante
un buffer llamado ventana de instrucciones. Con esta organización,
cuando un procesador termina de decodificar una instrucción, la coloca
en la ventana de instrucciones. Mientras el buffer no se llene, el
procesador puede continuar captando y decodificando nuevas
instrucciones. Cuando una unidad funcional de la etapa de ejecución
queda disponible, se puede emitir una instrucción desde la ventana de
instrucciones a la etapa de ejecución.
Necesite la unidad funcional
particular que está disponible.
Ningún conflicto ni
dependencia la bloqueen.
30. La política de emisión desordenada y finalización desordenada está sujeta a las
mismas restricciones descritas anteriormente. Una instrucción no puede
emitirse si viola una dependencia o tiene un conflicto. La diferencia es que
ahora hay más instrucciones dispuestas a ser emitidas, reduciendo la
probabilidad de que una etapa del cauce tenga que pararse. Además surge una
nueva dependencia, a la que nos referimos antes como antidependencia. El
fragmento de código considerado antes, ilustra esta dependencia:
I1: R3 R3 op R5
I2: R4 R3 + 1
I3: R3 R5 + 1
I4: R7 R3 op R4
31. Un método para hacer frente a este tipo de
conflictos de almacenamiento se basa en una
solución tradicional para los conflictos en los
recursos: la duplicación de recursos
Básicamente, el hardware del procesador
asigna dinámicamente los registros que están
asociados con los valores que necesitan las
instrucciones en diversos instantes de tiempo.
32. Esto indica que si la ventana de instrucciones es
demasiado pequeña, las dependencias de datos
impiden la utilización efectiva de las unidades
funcionales adicionales; es importante que el
procesador pueda mirar hacia delante bastante
lejos en busca de instrucciones independientes que
permitan aprovechar más el hardware
33. PREDICCIÓN DE SALTOS
Con el desarrollo de las máquinas superescalares, la estrategia de
salto retardado ha perdido interés. El motivo es que hay que
ejecutar múltiples instrucciones en el ciclo de retardo, lo que
plantea varios problemas relacionados con las dependencia entre
instrucciones.
Por ello, las máquinas superescalares han regresado a las
técnicas de predicción de saltos anteriores a las de los RISC.
Algunas, como el PowerPC 601, usan una técnica sencilla de
predicción de saltos estática. Los procesadores más sofisticados,
como el PowerPC 620 y el Pentium 4, usan predicción dinámica
de saltos basada en el análisis de la historia de los saltos
34. EJECUCIÓN SUPERESCALAR
Encolamiento de Emisión de
instrucciones instrucciones
Captación de Ejecución de
Programa instrucciones y instrucciones
Estático predicción de Reordenación y
datos entrega de
instrucciones
35. IMPLEMENTACIÓN SUPERESCALAR
Estrategias de captación de instrucciones que capten
simultáneamente múltiples instrucciones, a menudo
prediciendo los resultados de las instrucciones de
salto condicional y captando más allá de ellas. Estas
funciones requieren la utilización de múltiples etapas
de captación y decodificación, y lógica de predicción
de saltos.
Lógica para determinar dependencias
verdaderas entre valores de registros, y
mecanismos para comunicas esos valores a
donde sean necesarios durante la ejecución
36. Mecanismos para iniciar o emitir múltiples
instrucciones en paralelo.
Recursos para la ejecución en paralelo de múltiples
instrucciones, que incluyan múltiples unidades
funcionales segmentadas y jerarquías de memoria
capaces de atender múltiples referencias a
memoria.
Mecanismos para entregar el estado del
procesador en el orden correcto.
37. PowerPC 604:
6 unidades de ejecución independientes (1 unidad
de procesamiento de saltos, 1 unidad de carga
almacenamiento, 3 unidades de enteros, 1 unidad
de punto flotante), emisión en orden.
Renombrado de registros.
Ejemplos
Superescalares PowerPC620:
Idem con emisión desordenada.
Pentium:
Emisión en orden y 3 unidades de ejecución
independientes (2 unidades de enteros, 1 unidad
de punto flotante).
39. Conclusiones.
Un procesador superescalar es aquél que usa múltiples
cauces de instrucciones independientes. Cada cauce
consta de múltiples etapas, de modo que puede tratar
varias instrucciones a la vez. El hecho de que haya varios
cauces introduce un nuevo nivel de paralelismo,
permitiendo que varios flujos de instrucciones se procesen
simultáneamente.
Un procesador superescalar saca provecho de lo que se
conoce como paralelismo en las instrucciones, que hace
referencia al grado en que las instrucciones de un
programa pueden ejecutarse en paralelo.