La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Tema 4: Segmentación II. Introducción a los Superescalares.

Presentaciones similares


Presentación del tema: "Tema 4: Segmentación II. Introducción a los Superescalares."— Transcripción de la presentación:

1 Tema 4: Segmentación II. Introducción a los Superescalares.
Objetivos Referencias Aprovechamiento de una arquitectura segmentada Planificación dinámica Predicción dinámica de saltos Renombrado de registros Predicación Procesadores Superescalares Ejemplo: el Pentium Pro

2 Objetivos: Conocer las técnicas de compilación que permiten sacar más
Segmentación II Objetivos Objetivos: Conocer las técnicas de compilación que permiten sacar más rendimiento a una máquina segmentada Conocer los elementos y técnicas que se pueden añadir a un procesador para hacer más efectiva la segmentación Comprender el concepto de procesador superescalar, como una extensión natural del de procesador segmentado

3 Segmentación de instrucciones Referencias
Este tema está sacado de forma prácticamente íntegra (otra vez) del Hennessy-Patterson (la 2ª edición) Para algunas transparencias se han usado como modelo las de Al Davis Como complemento se puede mirar el Kai Hwang (todo como el tema anterior, porque es la continuación) Para ver más sobre predictores de saltos: ‘Combining Branch Predictors’. Scott McFarling. WRL Techical Note TN-36, junio 93 La descripción del Pentium Pro se puede mirar en los manuales de Intel (en cuanto a diseño, es prácticamente igual que el Pentium III) o en el libro: ‘Pentium Pro Processor System Architecture’. Tom Shanley. Addison-Wesley,1997. Mirar también en la página de Intel.

4 Reordenación (planificación) del código
Segmentación II Aprovechamiento de la segmentación Reordenación (planificación) del código Consiste en reordenar las instrucciones para eliminar parones Hay que tener cuidado con las dependencias Ejemplo: a partir del bucle siguiente, que suma a un vector de 1000 componentes en coma flotante un valor escalar: for(i=1;i<1000;i=i+1) x[i] = x[i] + s;

5 El código en ensamblador correspondiente al bucle es:
Segmentación II Aprovechamiento de la segmentación El código en ensamblador correspondiente al bucle es: Bucle:ld f0,0(r1) add f4,f0,f2 sd 0(r1),f4 subi r1,r1,8 bnez r1,bucle Suponiendo latencias: Productor Consumidor Latencia FP ALU FP ALU 3 ciclos FP ALU Store 2 ciclos Load FP ALU 1 ciclo Load Store 0 ciclos enteros: Load - ALU, 1 ciclo; resto 0 ciclos

6 Con las latencias vistas, la ejecución del bucle es: instrucción ciclo
Segmentación II Aprovechamiento de la segmentación Con las latencias vistas, la ejecución del bucle es: instrucción ciclo Bucle: ld f0,0(r1) 1 parón 2 addd f4,f0,f2 3 parón 4 parón 5 sd 0(r1),f4 6 subi r1,r1,8 7 bnez r1,Bucle 8 parón 9 Tiempo de ejecución: 9 ciclos por iteración, 4 parones (44%)

7 Se puede reordenar el código, para eliminar parones:
Segmentación II Aprovechamiento de la segmentación Se puede reordenar el código, para eliminar parones: Bucle: ld f0,0(r1) parón addd f4,f0,f2 subi r1,r1,8 bnez r1,Bucle sd 8(r1),f4 Tiempo de ejecución: 6 ciclos (reducción del 33%), 1 parón (17%)

8 A pesar de la reorganización:
Segmentación II Aprovechamiento de la segmentación A pesar de la reorganización: el “cuerpo” de la iteración, lo que hace es: cargar una componente del vector sumarle el escalar almacenar el resultado el resto de ciclos (3, el 50%) es sólo recargo Para reducir el porcentaje de recargo, “desenrollamos” el bucle: se copia el cuerpo del bucle varias veces para trabajar sobre varias componentes del vector en cada iteración

9 Desenrollado de bucles (“loop unrolling”)
Segmentación II Aprovechamiento de la segmentación Desenrollado de bucles (“loop unrolling”) Consiste en solapar distintas iteraciones del mismo bucle Hay que tener cuidado con las dependencias Partimos del mismo bucle: Bucle:ld f0,0(r1) add f4,f0,f2 sd 0(r1),f4 subi r1,r1,8 bnez r1,bucle

10 Nueva versión del bucle:
Segmentación II Aprovechamiento de la segmentación Nueva versión del bucle: Bucle: ld f0,0(r1) ;componente 1 add f4,f0,f2 sd 0(r1),f4 ld f6,-8(r1) ;componente 2 add f8,f6,f2 sd -8(r1),f8 ld f10,-16(r1) ;componente 3 add f12,f10,f2 sd -16(r1),f12 ld f14,-24(r1) ;componente 4 add f16,f14,f2 sd -24(r1),f16 subi r1,r1,32 ;control del bucle bnez r1,Bucle

11 En resumen: se elimina el recargo en 3 de las 4 iteraciones
Segmentación II Aprovechamiento de la segmentación Sin desenrollar (ni reordenar): 4 iteraciones supondrían 4 * 9 = 36 ciclos Desenrollando: 1 iteración (lo equivalente) supone 27 ciclos (25% menos) La ganancia procede de: eliminar las instrucciones de control del bucle en 3 de las 4 iteraciones desenrolladas eliminar el parón que hay después de la instrucción de salto en 3 de las 4 iteraciones En resumen: se elimina el recargo en 3 de las 4 iteraciones

12 Ahora se reordena el código del bucle desenrollado:
Segmentación II Aprovechamiento de la segmentación Ahora se reordena el código del bucle desenrollado: Bucle: ld f0,0(r1) ;componente 1 ld f6,-8(r1) ;componente 2 ld f10,-16(r1) ;componente 3 ld f14,-24(r1) ;componente 4 add f4,f0,f2 ;sumas add f8,f6,f2 add f12,f10,f2 add f16,f14,f2 sd 0(r1),f4 ;almacenamientos sd -8(r1),f8 sd -16(r1),f12 subi r1,r1,32 ;control del bucle bnez r1,Bucle sd 8(r1),f16 ;8-32=-24

13 Reordenando, se han rellenado los parones por dependencias
Segmentación II Aprovechamiento de la segmentación Reordenando, se han rellenado los parones por dependencias con trabajo útil. Cada iteración se ejecuta ahora en 14 ciclos, 42% menos que en la versión reordenada pero no desenrollada Dificultad: podemos desenrollar el bucle así, si se ejecuta un número de veces múltiplo de 4 (el número de iteraciones antiguas a las que equivale la nueva). Solución: si el número de iteraciones no es múltiplo de 4, sustituimos el bucle original por dos consecutivos: el primero, con cuerpo igual al original, se ejecuta n mod 4 veces el segundo, con cuerpo desenrollado 4 veces, se ejecuta n/4 veces

14 Planificación dinámica
Segmentación II Planificación dinámica Planificación dinámica Objetivo: eliminar parones innecesarios (como la estática, pero más flexible) Ej.: en el siguiente código: divd f0,f2,f4 addd f10,f0,f8 subd f8,f8,f14 La segunda instrucción no se puede ejecutar hasta que la primera genere f0 Esto impide que se ejecute la tercera, aunque tenga todos sus datos preparados => parón innecesario Dos soluciones: marcadores (‘scoreboarding’) y el algoritmo de Tomasulo

15 Tanto con marcadores como con el algoritmo de Tomasulo:
Segmentación II Planificación dinámica Tanto con marcadores como con el algoritmo de Tomasulo: se pretende que una instrucción con sus operandos disponibles no se quede paralizada si tiene posibilidad de ejecutarse (porque otra anterior esté bloqueada) para ello se divide la fase ID en dos: lanzamiento: decodificación y comprobación de dependencias estructurales lectura de operandos: espera por operandos; cuando están listos, se leen y se pasa a ejecutar (no necesariamente respetando el orden del programa) de esta forma, una instrucción puede adelantar a otra que esté bloqueada por dependencias La idea es que el código se “reordena” solo, de forma dinámica, y según la situación del cauce

16 no sólo trabaja sobre dependencias estáticas, sino también
Segmentación II Planificación dinámica Ventajas: no sólo trabaja sobre dependencias estáticas, sino también sobre dinámicas el compilador es más sencillo además, la reordenación en tiempo de compilación sólo valía para el cauce concreto con el que se trabaja: ahora es más general Inconvenientes: el hardware es bastante más complejo (lo de siempre) ahora ya sí se pueden dar las dependencias EDL hay que tener cuidado con las excepciones (interrupciones)

17 Marcadores (‘Scoreboarding’)
Segmentación II Planificación dinámica Marcadores (‘Scoreboarding’) (CDC 6600, 1964)

18 Es necesario modificar las etapas del cauce. El flujo ahora es:
Segmentación II Planificación dinámica Es necesario modificar las etapas del cauce. El flujo ahora es: Búsqueda: como antes Lanzamiento: si su UF está libre, y no hay dependencias EDE con otra instrucción, la instrucción se envía a la UF; en caso contrario, el lanzamiento se bloquea Lectura de operandos: si los datos están listos, el marcador indica a la UF correspondiente que los lea. Esto permite la ejecución fuera de orden, garantizando que se respetan las dependencias LDE Ejecución: puede durar varios ciclos. Cuando termina, la UF avisa al marcador. Almacenamiento: el marcador comprueba que no hay dependencias EDL, y si no los hay, indica a la UF que actualice el banco de registros

19 Componentes del marcador:
Segmentación II Planificación dinámica Componentes del marcador: Estado de las instrucciones: indica en qué fase se encuentran las instrucciones Estado de las UFs: ocupada/no ocupada operación que tiene que realizar operandos fuente para la operación (qué registros)(fj,fk) operando destino (qué registro) (fi) UF que genera cada operando fuente (qj,qk) Estado de los operandos fuente (listo/no listo) (rj,rk) Estado de los registros: UF que va a generar el siguiente valor del reg (en blanco si no usado)

20 Ejemplo de ejecución: Vamos a ejecutar el código: ld f6,34(r2)
Segmentación II Planificación dinámica Ejemplo de ejecución: Vamos a ejecutar el código: ld f6,34(r2) ld f2,45(r3) multd f0,f2,f4 subd f8,f6,f2 divd f10,f0,f6 addd f6,f8,f2 El cauce tiene una unidad de enteros y operaciones comunes, dos multiplicadores, un sumador y un divisor

21 Suponemos que la ejecución se encuentra en el siguiente estado:
Segmentación II Planificación dinámica Suponemos que la ejecución se encuentra en el siguiente estado: Inst lanz. lect. ejec. almac. ld f6,34(r2) sí sí sí sí ld f2,45(r3) sí sí sí multd f0,f2,f4 sí subd f8,f6,f2 sí divd f10,f0,f6 sí addd f6,f8,f2

22 Estado de las unidades funcionales:
Segmentación II Planificación dinámica Estado de las unidades funcionales: UF ocup op fi fj fk qj qk rj rk int sí load f2 r3 no(*) mult1 sí mult f0 f2 f4 int no sí mult2 no add sí sub f8 f6 f2 int sí no div sí div f10 f0 f6 mult1 no sí Estado de los registros: f0 f2 f4 f6 f8 f10 f12 … f30 mult1 int add div (*) cuando una instrucción se ejecuta, sus operandos se ponen a ‘no’

23 Estado cuando multd está lista para escribir
Segmentación II Planificación dinámica Estado cuando multd está lista para escribir Inst lanz. lect. ejec. almac. ld f6,34(r2) sí sí sí sí ld f2,45(r3) sí sí sí sí multd f0,f2,f4 sí sí sí subd f8,f6,f2 sí sí sí sí divd f10,f0,f6 sí addd f6,f8,f2 sí sí sí (Hemos supuesto add: 2ciclos, mult: 10 ciclos y div: 40 ciclos)

24 Estado de las unidades funcionales:
Segmentación II Planificación dinámica Estado de las unidades funcionales: UF ocup op fi fj fk qj qk rj rk int no mult1 sí mult f0 f2 f4 no no mult2 no add sí add f6 f8 f2 no no div sí div f10 f0 f6 mult1 no sí Estado de los registros: f0 f2 f4 f6 f8 f10 f12 … f30 mult1 add div

25 Estado cuando divd está lista para escribir
Segmentación II Planificación dinámica Estado cuando divd está lista para escribir Inst lanz. lect. ejec. almac. ld f6,34(r2) sí sí sí sí ld f2,45(r3) sí sí sí sí multd f0,f2,f4 sí sí sí sí subd f8,f6,f2 sí sí sí sí divd f10,f0,f6 sí sí sí addd f6,f8,f2 sí sí sí sí

26 Estado de las unidades funcionales:
Segmentación II Planificación dinámica Estado de las unidades funcionales: UF ocup op fi fj fk qj qk rj rk int no mult1 no mult2 no add no div sí div f10 f0 f6 no no Estado de los registros: f0 f2 f4 f6 f8 f10 f12 … f30 div

27 Ventajas del esquema de marcadores en el CDC 6600:
Segmentación II Planificación dinámica Ventajas del esquema de marcadores en el CDC 6600: 70% de mejora en programas en FORTRAN 150% de mejora en programas codificados a mano el coste total del marcador era aprox. el de una UF (es decir, muy bajo; el grueso del coste estaba en los buses) Todo esto, a pesar de que: no había cachés no había memorias de semiconductores los compiladores eran muy “tontos” (comparados con los de hoy)

28 Factores que limitan la capacidad del marcador para eliminar parones
Segmentación II Planificación dinámica Factores que limitan la capacidad del marcador para eliminar parones El paralelismo existente en la aplicación si no hay instrucciones independientes, no se pueden eliminar los parones El número de entradas en el marcador es decir, con cuántas instrucciones se puede trabajar a la vez (en el ejemplo, hasta el siguiente salto) El número y tipo de UFs influye sobre la cantidad de parones estructurales La existencia de antidependencias (edl) y dependencias de salida (ede)

29 Algoritmo de Tomasulo IBM 360/91 (1967)
Segmentación II Planificación dinámica Algoritmo de Tomasulo IBM 360/91 (1967) Basado en el esquema de marcadores Incorpora el concepto de renombrado de registros (que elimina las dependencias EDL y EDE) Características “malas” del IBM 360: pocos registros de coma flotante en d.p. (4) accesos a memoria lentos grandes retardos en coma flotante El algoritmo de Tomasulo se diseño para contrarrestar estas características “malas”

30 La unidad de coma flotante del IBM 360 / 91 podía trabajar
Segmentación II Planificación dinámica La unidad de coma flotante del IBM 360 / 91 podía trabajar de forma simultánea con: tres operaciones para el sumador dos operaciones para el multiplicador 6 loads 3 stores Usa estaciones de reserva, que almacenan las instrucciones que están pendientes de entrar a una UF (cada UF tiene la suya) Diferencias con el marcador: cada ER controla cuándo pueden ejecutarse sus instrucciones los resultados van directamente de las ER a las UF, sin pasar por los registros

31 Estructura de la unidad de coma flotante del IBM 360/91
Segmentación II Planificación dinámica Estructura de la unidad de coma flotante del IBM 360/91

32 Con la estructura de la máquina, las fases del cauce son:
Segmentación II Planificación dinámica Con la estructura de la máquina, las fases del cauce son: Lanzamiento: se toma una instrucción de la cola si hay espacio en su ER, se coloca ahí si los operandos están en el banco de registros, se envían a la ER si no hay espacio en la ER, hay un parón estructural Ejecución: si falta algún operando, se vigila el CDB cuando están listos los dos, se ejecuta la operación Almacenamiento: cuando termina la ejecución, los resultados se ponen en el CDB. De ahí van a los registros y a las UF que los esperen.

33 Diferencias con el marcador:
Segmentación II Planificación dinámica Diferencias con el marcador: no se comprueban las dependencias EDE y EDL: se eliminan al renombrar en la fase de lanzamiento no se espera a que los datos lleguen a los registros: el CDB los lleva a las UF que los necesitan los ‘loads’ y ‘stores’ se tratan como unidades funcionales básicas Implementación del renombrado del registros: hay 11 fuentes de datos: 6 entradas del buffer de loads, 3 entradas en la ER de suma y 2 en la de multiplicación a cada operando en la fase de lanzamiento se le da un identificador de 4 bits, que indica qué fuente proporciona el dato (0 si listo) de esta manera, se extiende el nº de registros de 4 a 11

34 Información que se almacena en la estación de reserva:
Segmentación II Planificación dinámica Información que se almacena en la estación de reserva: Op: operación que se tiene que ejecutar Qj,Qk: ER que producen los operandos (0 si listo o no necesario) Vj,Vk: valor de los operandos Ocupado: si la entrada está ocupada Sólo es válida la información de Q o V (no ambas a la vez) Información que se almacena en cada registro y en los buffers de stores: Qi: ER que genera el valor que hay que enviar a memoria V: valor que hay que enviar a memoria

35 Ejemplo de ejecución: De nuevo vamos a ejecutar el código:
Segmentación II Planificación dinámica Ejemplo de ejecución: De nuevo vamos a ejecutar el código: ld f6,34(r2) ld f2,45(r3) multd f0,f2,f4 subd f8,f6,f2 divd f10,f0,f6 addd f6,f8,f2

36 Punto de partida: el código se encuentra en esta situación:
Segmentación II Planificación dinámica Punto de partida: el código se encuentra en esta situación: Inst lanz. ejec. almac. ld f6,34(r2) sí sí sí ld f2,45(r3) sí sí multd f0,f2,f4 sí subd f8,f6,f2 sí divd f10,f0,f6 sí addd f6,f8,f2 sí OJO!: en este caso, esta información no se encuentra físicamente en ninguna tabla. Se muestra para facilitar la comprensión (En negrita las variaciones frente al modelo de marcador)

37 Estaciones de reserva:
Segmentación II Planificación dinámica Estaciones de reserva: UF ocup op Vj Vk Qj Qk add1 sí sub M(34+R(r2)) load2 add2 sí add add1 load2 add3 no mult1 sí mult R(f4) load2 mult2 sí div m(34+R(r2)) mult1 Estado de los registros: f0 f2 f4 f6 f8 f10 f12 … f30 mult1 load2 add2 add1 mult2

38 Estado cuando multd está lista para escribir
Segmentación II Planificación dinámica Estado cuando multd está lista para escribir Inst lanz. ejec. almac. ld f6,34(r2) sí sí sí ld f2,45(r3) sí sí sí multd f0,f2,f4 sí sí subd f8,f6,f2 sí sí sí divd f10,f0,f6 sí addd f6,f8,f2 sí sí sí La instrucción de suma ha podido terminar, porque el renombrado elimina la dependencia EDL con la división y la resta

39 Estaciones de reserva:
Segmentación II Planificación dinámica Estaciones de reserva: UF ocup op Vj Vk Qj Qk add1 no add2 no add3 no mult1 sí mult m(45+R(r3)) R(f4) mult2 sí div m(34+R(r2)) mult1 Estado de los registros: f0 f2 f4 f6 f8 f10 f12 … f30 mult1 mult2

40 Predicción dinámica de saltos
Segmentación II Predicción dinámica de saltos Predicción dinámica de saltos En el tema anterior vimos 4 posibilidades al encontrar un salto: parar el cauce suponer que se toma suponer que no se toma ejecución retardada Vimos que: parar significa perder rendimiento suponer que se toma o no significa una gran penalización en caso de equivocarnos (una fracción considerable de las veces) la ejecución retardada tiene una efectividad limitada

41 Suponer que el salto va a ir en un determinado sentido:
Segmentación II Predicción dinámica de saltos Suponer que el salto va a ir en un determinado sentido: tiene una fracción de fallo importante si se supone tomado, se tarda en calcular el destino PERO! es transparente al programador si se acierta en el sentido, la penalización es la menor por lo tanto: hay que estudiar mejor esta solución

42 adivinar en qué sentido va a ir cada salto
Segmentación II Predicción dinámica de saltos Objetivo adivinar en qué sentido va a ir cada salto El problema de los esquemas utilizados es que eran estáticos: siempre hacen la misma predicción (porque es estática, se hace a priori y no hay otra posibilidad) Pero los saltos no se comportan así no todos saltan en el mismo sentido bastantes saltos (analizados de forma individual) no saltan siempre en el mismo sentido Información sobre la que se trabaja: el comportamiento anterior del salto (del salto concreto, o de todos los saltos, según el esquema)

43 Esquema inicial: la Tabla de Bits
Segmentación II Predicción dinámica de saltos Esquema inicial: la Tabla de Bits Consiste en una tabla de bits a la que se accede con la dirección del salto Ejemplo: si hay 1024 bits, se accede con los 10 bits inferiores de la dirección del salto El bit está a 1 si la última vez el salto se tomó, a 0 si no La predicción es que el salto se comporta como la última vez Si se predice mal, se corrige la predicción Presenta el problema de que a varios saltos les corresponde la misma entrada en la tabla (aliasing)

44 Revisión: la Tabla de Contadores (TC)
Segmentación II Predicción dinámica de saltos Revisión: la Tabla de Contadores (TC) En lugar de un bit, las entradas de la tabla son contadores de 2 bits con saturación: cuando un salto se toma, se incrementa (sin pasar de 3) cuando no se toma, se decrementa (sin pasar de 0) El acceso a la tabla se hace igual: con los bits inferiores de la dirección del salto La predicción se hace de la siguiente manera: si el contador vale 2 ó 3, el salto se predice tomado si vale 0 ó 1, se predice no tomado Cuando el salto se ejecuta, el valor del contador se actualiza según el algoritmo visto

45 Se plantea un problema:
Segmentación II Predicción dinámica de saltos Se plantea un problema: hasta el fin de la fase de decodificación no se sabe si es un salto para entonces, ya podemos saber si se toma en muchos casos Por lo tanto: necesitamos identificar los saltos antes Para ello utilizamos otra tabla: el buffer de destinos de saltos (‘branch-target buffer’) Esta tabla se va a acceder en la fase de búsqueda con el CP (de forma simultánea a la búsqueda de la instrucción) El acceso nos dirá si la instrucción que buscamos es un salto, (y si lo es, la dirección a la que salta (si se toma))

46 El Branch-Target Buffer (TDS, BTB)
Segmentación II Predicción dinámica de saltos El Branch-Target Buffer (TDS, BTB) Se trata de una tabla de dos columnas: en la primera (de memoria asociativa) se almacenan direcciones de saltos en la segunda, los sitios a los que se salta en esos saltos si se toman Si encuentra el valor que se le pide: la instrucción que estamos buscando (recordad: estamos en la fase de fetch) es un salto la entrada correspondiente de la segunda columna es el destino del salto Si no lo encuentra: no es un salto (o lo es pero no se ha ejecutado aún ninguna vez) Cuando se sabe que una instrucción es un salto, se almacenan su dirección y la de su destino en la tabla

47 Segmentación II Predicción dinámica de saltos
El BDS (BTB)

48 Resumiendo el mecanismo de predicción:
Segmentación II Predicción dinámica de saltos Resumiendo el mecanismo de predicción: Tenemos el búffer de destinos de saltos (BDS), que nos dice si una instrucción (identificada por su dirección) es un salto, y adónde salta Tenemos la tabla de contadores (TC), que nos dice si el salto se va a tomar o no En la fase de búsqueda hacemos tres accesos simultáneos: a la memoria, por la instrucción al BDS (BTB), para ver si es un salto, y cuál es el destino a la TC, para ver si se toma el salto o no.

49 Mecanismo de predicción (cont):
Segmentación II Predicción dinámica de saltos Mecanismo de predicción (cont): Si el BDS dice que no es un salto, se sigue la búsqueda secuencial Si el BDS dice que es un salto, y la TC que no se toma, lo mismo Si el BDS dice que es un salto, y la TC que se toma, se sigue la búsqueda por el destino del salto Cuando se ha ejecutado el salto, hay que actualizar la información de las tablas si era un salto y el BDS no nos avisó, se habilita una entrada para este nuevo salto si el salto se toma, se incrementa la entrada correspondiente de la TC si no, se decrementa OJO: incrementos y decrementos con saturación

50 Rendimientos: TC con 4096 entradas
Segmentación II Predicción dinámica de saltos Rendimientos: TC con 4096 entradas

51 Rendimientos: comparación entre TC con 4096
Segmentación II Predicción dinámica de saltos Rendimientos: comparación entre TC con 4096 entradas TC con entradas ilimitadas

52 Mejora en la predicción: la historia global
Segmentación II Predicción dinámica de saltos Mejora en la predicción: la historia global Acceder a la TC con la dirección del salto=>para realizar la predicción sólo se utiliza el comportamiento del salto concreto PERO: a veces, el comportamiento de saltos próximos al que estudiamos nos da información útil: if(aa==2) aa=0; if(bb==2) bb=0; if(aa!=bb) { ...

53 Si los saltos 1 y 2 no se toman, el salto 3 se tomará
Segmentación II Predicción dinámica de saltos En DLX: subi r3,r1,#2 bnez r3,l1 add r1,r0,r0 l1: subi r3,r2,#2 bnez r3,l2 add r2,r0,r0 l2: sub r3,r1,r2 beqz r3,l3 Si los saltos 1 y 2 no se toman, el salto 3 se tomará (r1 y r2 son iguales)

54 Utilización de la historia global
Segmentación II Predicción dinámica de saltos Utilización de la historia global

55 Comparación de rendimientos
Segmentación II Predicción dinámica de saltos Comparación de rendimientos

56 Variantes del predictor basado en historia
Segmentación II Predicción dinámica de saltos Variantes del predictor basado en historia El esquema visto equivale a concatenar la historia con la dirección del salto PROBLEMA: las tablas se hacen grandes enseguida: 10 bits de dirección + 6 de historia =>64K entradas En lugar de concatenar, hacer la XOR dirección  historia = índice de esta forma, el tamaño de las tablas no se dispara También se puede utilizar una historia particular para el salto Para el mismo coste, el que mejor rendimiento da es el segundo

57 Comparación de predictores (I)
Segmentación II Predicción dinámica de saltos Comparación de predictores (I) Gráfica tomada de: Combining Branch Predictors. Scott McFarling. Compaq WRL.

58 Comparación de predictores (II)
Segmentación II Predicción dinámica de saltos Comparación de predictores (II) Gráfica tomada de: Combining Branch Predictors. Scott McFarling. Compaq WRL.

59 ¿Qué hacemos con los saltos indirectos?
Segmentación II Predicción dinámica de saltos ¿Qué hacemos con los saltos indirectos? La dirección de destino no está en el código de la instrucción Por lo tanto, hay que hacer un acceso a memoria o a un registro PEOR AÚN: el destino no es siempre el mismo Ejemplos: retorno de subrutina, sentencias ‘switch’ El 85% de los saltos indirectos en los SPEC son retornos: resulta apropiado centrarse en ellos

60 Pila de direcciones de retorno
Segmentación II Predicción dinámica de saltos Pila de direcciones de retorno Es una estructura LIFO en la CPU Almacena las direcciones de retorno: se introduce una nueva cuando se ejecuta una instrucción CALL se retira con el retorno

61 Porcentajes de acierto de la pila de retornos
Segmentación II Predicción dinámica de saltos Porcentajes de acierto de la pila de retornos

62 Renombrado de registros
Segmentación II Renombrado de registros Renombrado de registros Se trata de una técnica para eliminar dependencias “falsas” Es algo parecido a lo que se hacía con el algoritmo de Tomasulo (allí se hacía de forma implícita; ahora es explícito) Básicamente consiste en implementar más registros de los que ve el programador. Los nombres que usa el el programador son lógicos; los que usa la máquina, físicos. El Hw. establece una correspondencia entre ellos

63 Ejemplo de funcionamiento del renombrado
Segmentación II Renombrado de registros Ejemplo de funcionamiento del renombrado or r5,r0,Dir ld r6,0(r5) ld r8,8(r5) ld r9,16(r5) ld r7,24(r5) add r1,r8,r9 add r8,r9,r7 st r1,0(r8) ld r8,0(r6) or f1,r0,Dir ld f2,0(f1) ld f3,8(f1) ld f4,16(f1) ld f5,24(f1) add f6,f3,f4 add f7,f4,f5 st f6,0(f7) ld f8,0(f2)

64 La tabla de equivalencias al final del código es:
Segmentación II Renombrado de registros La tabla de equivalencias al final del código es: r5 r6 -- r9 r7 r1 r8 f1 f2 f3 f4 f5 f6 f7 f8 f9

65 Predicación Objetivo: eliminar la presencia de algunos saltos
Segmentación II Predicación Predicación Objetivo: eliminar la presencia de algunos saltos Ejemplo: la función valor absoluto: a=abs(b); si b es positivo, a=b; si es negativo, a=-b; if(b<0) a=-b; else a=b;

66 El código, en ensamblador:
Segmentación II Predicación El código, en ensamblador: cmpl r1,r3,r0 beqz r1,L1 ;saltar si r3 (b) es positivo sub r2,r0,r3 ;r2 (a)  -r3 br L2 L1: sub r2,r3,r0 ;r2  r3 L2: ...

67 Introducimos en el repertorio una instrucción de transferencia
Segmentación II Predicación Introducimos en el repertorio una instrucción de transferencia condicional: cmovz transfiere el contenido de un operando al destino, si el segundo operando es cero. Su uso para este ejemplo: cmpl r1,r3,r0; r2:a; r3:b; sub r2,r0,r3; a  -b cmovz r2,r3,r1; si r1==0 (b>0), a  b En el caso peor se eliminan 2 saltos, en el mejor 1

68 En general, la predicación consiste en instrucciones que se
Segmentación II Predicación En general, la predicación consiste en instrucciones que se ejecutan o no, dependiendo del valor de uno de sus operandos Se pueden incluir unas cuantas, de los tipos más usados (transferencia, suma) O se puede ampliar a todo el repertorio, haciendo que sean condicionales implícitamente, según un valor preestablecido (un registro), varios (un conjunto de registros), o una etiqueta del dato Importante: la instrucción no debe causar excepciones (en general, dejar rastros de su existencia) si la condición no se cumple

69 elimina saltos, que implican parones no tiene prácticamente coste Hw.
Segmentación II Predicación Ventajas: elimina saltos, que implican parones no tiene prácticamente coste Hw. Inconvenientes: no es transparente al compilador / programador sólo es útil para saltos cortos, del tipo if (else), con cuerpos pequeños si la condición no se cumple, se ha desaprovechado un ciclo

70 Procesadores superescalares
Segmentación II Procesadores Superescalares Procesadores superescalares Aumentan las prestaciones lanzando varias instrucciones en cada ciclo La lógica de control se vuelve muy compleja Las instrucciones deben cumplir una serie de restricciones para poderse lanzar a la vez no deben existir dependencias entre ellas (de datos, de control, estructurales) algunas máquinas no permiten lanzar un load hasta que se comprueba que no hay ningún store previo a la misma dirección

71 lanza hasta 2 instrucciones por ciclo, pero:
Segmentación II Procesadores Superescalares El Pentium: lanza hasta 2 instrucciones por ciclo, pero: el segundo cauce es más simple =>dependencias estructurales no permite lanzar instrucciones con dependencias de datos realiza especulación en el primer salto que se encuentra (con una tabla de contadores sencilla) El Alpha 21164: lanza hasta 4 instrucciones por ciclo, pero: máx. 2 de enteros máx. 2 de coma flotante no permite el paso a loads hasta comprobar los stores especula el primer salto

72 Procesadores VLIW (Very Long Instruction Word)
Segmentación II Procesadores Superescalares Procesadores VLIW (Very Long Instruction Word) Agrupan varias instrucciones en una palabra muy larga Trasladan la planificación al compilador (es el que agrupa las instrucciones) Ventajas: la lógica es más simple que para un superescalar Inconvenientes: la rigidez de la planificación (es estática) impide aprovechar todo el paralelismo de la aplicación en muchos casos

73 Procesadores Superescalares Avanzados
Segmentación II Procesadores Superescalares Procesadores Superescalares Avanzados Utilizan planificación dinámica y ejecución fuera de orden Fases (visión general) búsqueda: acceden a caché, y obtienen varias instrucciones de una vez; las depositan en la cola de prebúsqueda decodificación: se toman instrucciones de la cola de prebúsqueda, se decodifican, y se identifican sus operandos renombramiento: real (no como el alg. de Tomasulo). Las instrucciones se almacenan en el búffer de reordenamiento (Reorder Buffer)

74 lanzamiento:cuando sus operandos estén listos, y haya hueco
Segmentación II Procesadores Superescalares Fases (cont) lanzamiento:cuando sus operandos estén listos, y haya hueco en la UF que les corresponde, se ejecutan retirada (commit): las instrucciones se ejecutan fuera de orden, en cuanto están listos los operandos, pero no se eliminan del búffer de reordenamiento. Se retiran de él en el orden del programa. Con esto se consigue: acortar las cadenas de dependencias mantener la ilusión de ejecución secuencial Ejemplos: el Pentium Pro (PII, PIII), el Alpha 21264, el MIPS R

75 Ejemplo de superescalar: el Pentium Pro
Segmentación II Ejemplo: el Pentium Pro Ejemplo de superescalar: el Pentium Pro Características: lanzado en 1995 frecuencia de 150 MHz arquitectura de 32 bits repertorio de instrucciones CISC juego de 40 registros (la arquitectura tiene 8) planificación dinámica, ejecución fuera de orden decodifica hasta 3 instrucciones por ciclo retira hasta 3 instrucciones ejecutadas por ciclo cauce de 11 etapas

76 Diagrama de bloques del Pentium Pro
Segmentación II Ejemplo: el Pentium Pro Diagrama de bloques del Pentium Pro

77 Descripción del cauce:
Segmentación II Ejemplo: el Pentium Pro Descripción del cauce: Búsqueda: descompuesta en 3 sub-etapas: 1. cargar una línea de caché (32B) 2. identificar instrucciones, comprobar saltos, realizar predicción (si hay) 3. alinear instrucciones Decodificación: descompuesta en 2 sub-etapas: 1. traducir a micro-operaciones (RISCificar) 2. copiar a la cola de instrucciones decodificadas (hasta 6 micro-operaciones) Traducción de operandos: se determina la situación de los operandos fuente (en registros físicos o lógicos)

78 Descripción del cauce (cont.):
Segmentación II Ejemplo: el Pentium Pro Descripción del cauce (cont.): ROB: se busca una entrada en el ROB (búffer de reordenamiento) a la instrucción (máx. 3 por ciclo). Si los datos están listos, se copia la instrucción a la estación de reserva Lanzamiento: cuando una instrucción de la ER tiene sus datos listos, y hay sitio en su UF, se envía (no necesariamente en orden) Ejecución: el número de ciclos depende de la operación Retirada: descompuesta en 3 sub-etapas: 1. si una instrucción se ha ejecutado, y todos los saltos anteriores han sido bien predichos, y se comprueba que la instrucción debía ser ejecutada, se marca para retirar 2. la instrucción se elimina del ROB, se actualizan los registros físicos implicados (máx. 3 por ciclo). Esto se hace en orden


Descargar ppt "Tema 4: Segmentación II. Introducción a los Superescalares."

Presentaciones similares


Anuncios Google