1 / 78

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

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.

yetta
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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. 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 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 • http://www.research.compaq.com/wrl/admin/publications.html • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Segmentación II Planificación dinámica • Marcadores (‘Scoreboarding’) • (CDC 6600, 1964)

  18. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Segmentación II Planificación dinámica Estructura de la unidad de coma flotante del IBM 360/91

  32. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Segmentación II Predicción dinámica de saltos Rendimientos: TC con 4096 entradas

More Related