DEPENDENCIAS Y BLOQUEOS DE CONTROL (Apartado 2.8) 1. Introducción. 2. Dependencias, riesgos y bloqueos de control. 3. Consideraciones de implementación. 4. Comportamiento de los saltos condicionales. 5. Implementaciones alternativas de saltos. 6. Visión de conjunto. 1. 1. INTRODUCCIÓN INTRODUCCIÓN Proc. Encadenados: Paralelismo de instrucciones (ILP) CPI=CPIideal=1 Inst 1 Inst 2 Inst 3 Inst 4 Inst 5 Instrucc. A= Tj t ProcSec =N t ProcEnc Ciclos Pero depend. entre instrucciones (ILP) ⇒ Bloqueos CPI = CPIideal + CPIestruct + CPIdatos + CPIcontrol + CPImem 2 1 ¿Por qué instrucciones de control? VISIÓN JERÁRQUICA. Lenguaje alto nivel (iterativo) • Control del flujo de instrucciones (modifican el PC) • Estruct. condic.: if-then ó if (cond) { ... } ⇒ Salto Cond. if-then-else ó if (cond) { ... } else { ... } EJERC. ⇒ Salto Cond. + Salto incond. • Ej. if (cond) { … } ⇒ ; instrucciones que evalúan la condición ; (aquí es la contraria) BEQZ ó BNEZ Rcond, etiq ; cuerpo del ‘if ’ etiq: ; instr. tras el cuerpo 3 • Estruct. iterat.: for (… ; cond ;… ) { ... } while (cond) { ... } do { ... } while (cond); EJERC. ⇒Salto cond+Salto incon. ó Salto cond • Saltos incond. dir. dest. fija: goto etiq ⇒Salto incond ‘CALL’ ó función (…)⇒ ⇒Salto incond (Guardar dir. retorno) En el DLX: JAL etiq ; R31←PC+4; • Saltos incond. dir. dest. var.: return ( … ) ⇒Salto incond (extraer dir. retorno) DLX: JR R31 switch (var) { case: … } ⇒Salto incond (calcular dir. dest) 4 2 Ejemplo: Sentencia do {...} while( ) n=0; ADD R8, R0, R0 do { Etiq: ... ... n++; ADDI R8, R8, 1 } while ( n<100 ) ; SLTI R9, R8, 100 BNEZ R9, Etiq NOTA: el bucle for( ) o while( ) análogo (nº fijo de iter.) se puede traducir por el mismo código ensamblador. Bucles: saltos condicionales hacia atrás muy frecuentes 5 Tipos de instrucciones de control ♦ Saltos RISC: sencillos, CISC: complejos Frec. INT Frec. FP SALTO Formato Rango (DLX) (DLX) 16 bits BEQZ/BNEZ I 16% 8% con signo 26 bits J, JAL J 1%, 1% 0.5%, 1% con signo JR, JALR I Registro 1% 1% Muy frecuentes (1 de cada 4 a 7 instr.) Usaremos: Fsaltos(INT) = 0.2 Fsaltos(FP) = 0.1 6 3 Definiciones y Nomenclatura V Cond F PC+4 Instr. sig. PCdest Instr. dest PCdest Instr. dest • • • • SALTOS CONDICIONALES Tomado/No Tomado (T/NT) Rama Tomada/Rama No Tomada Instr. de destino/Instr. siguientes Tras resolver ⇒ Instr. Válidas • Resolver salto: 1. Calcular PCdest 2. Evaluar la condición 3. Actualizar el PC (IF buscará instr. válidas) SALTOS INCONDICIONALES 7 Ejemplo de ejecución de instr. salto • Resolver salto: 1. PCdest =NPC +Desplaz (SUMADOR) ADD R8, R0, R0 Etiq: ... ; Instr. de destino ... ADDI R8, R8, 1 SLTI R9, R8, 100 BNEZ R9, Etiq ... ; Instr. Siguientes Rama Tomada Compilador: Desplaz = dir(salto)- dir(Etiq)- 4 Salto hacia atrás: Desplaz<0 Salto hacia delante: Desplaz>=0 2. Condición : R9≠ ≠0 (Rf=0 ?) 3. Actualizar el PC: (MUX) if (Cond) PC=PC+4 ; else PC= PCdest ; Rama No ⇒ Siguiente fase IF buscará instr válidas. Tomada 8 4 Esquema del DLX FASE MEM PCdest Cond PCdest 9 INDICE INDICE 1. Introducción. 2. Dependencias, riesgos y bloqueos de control. 3. Consideraciones de implementación. 4. Comportamiento de los saltos condicionales. 5. Implementaciones alternativas de saltos. 6. Visión de conjunto. 10 5 Dependencias de control Recordemos: Dependencia instr. 1 Ejec. Secuencial Ejec. Encaden. ¿Qué es una dependencia de control? : Uso del PC Cond F Instr. sig. V instr. 2 instr. 3 “Ve” todos los recursos ⇒ No depend. Inst 1 Inst 2 Inst 3 Inst 4 Inst 5 Fichero.exe Salto Inst sig1 Inst sig2 Instr. Inst sig3 dest Inst sig4 Riesgo ⇒ Bloqueo de Control Resuelve el salto: Actualiza el PC DLX Salto Inst sig1 Inst sig2 Inst sig3 IF ID IF EX MEM WB ID EX IF ID IF Inst válida IF ID EX MEM WB Abortar tres instr. siguientes ⇒ 3 ciclos de bloqueo: TÉCNICA “CONGELAR” O “VACIAR” la cadena 12 6 ¿Se pueden abortar? : NO todas ¿Es grave el riesgo? Decodifica: detecta que es salto Salto Inst sig1 Inst sig2 Inst sig3 IF ID IF EX MEM WB Instr Válida IF ID EX MEM WB No se puede abortar • Riesgo inevitable de ejecutar IF de Inst sig1: • Acceso al caché de instr. (no debería haberse producido). • Por lo demás, sólo se modifican registros temporales. ¿Puede aumentar la razón de fallos de caché? ¿Cuándo? EJERC. 13 ¿Cómo afecta al rendimiento ? Resuelve el salto Saltos son muy comunes Salto Inst sig1 Inst sig2 Inst sig3 IF ID IF EX MEM WB ID EX IF ID IF IF Inst válida CPI control = ID EX MEM WB N º c.bq.(control ) N º c.bq.(control ) N º saltos = × = Psaltos Fsaltos N º instr. N º saltos N º instr. PROGRAMAS INT: CPIcontrol = 0.2 * 3 cic = 0.6 c.bq./instr A= t ejec real t ejec ideal = 1 + 0.6 1 ⇒ 60% más lenta ⇒ INTENTAR MEJORAR 14 7 SOLUCIÓN: Adelantar Resolución IDEAL Resuelve el salto No hacen nada Salto Inst válida1 Inst válida2 IF ID IF EX MEM WB ID EX MEM IF ID EX 0 c.bq. ∀salto (intentar acercanos a lo anterior) • Adelantar la resolución para evitar bloqueos. • El coste adicional no debe ser alto. 15 INDICE INDICE 1. Introducción. 2. Dependencias, riesgos y bloqueos de control. 3. Consideraciones de implementación. 4. Comportamiento de los saltos condicionales. 5. Implementaciones alternativas de saltos. 6. Visión de conjunto. 16 8 Esquema del DLX TRASLADAR PCdest Cond + RE PLI CAR PCdest 17 DLX con saltos adelantados PCdest Se alarga la fase ID Selecc 18 9 Consideraciones de la nueva implementación EX • ¿Incompatible? con lectura de registros en el ID 2º semiciclo (WB, escritura en el 1º). IF • Mayor complejidad ⇒ Nuevo sumador, Nuevos caminos de desvío (Operando Rcond leído en fase ID). • Nuevos bloqueos ⇒ estudiar nuevos bloqueos de datos que han de introducirse. EJERC. Sol: ALU R1,… ⇒ 1 c.bq. Prob1, B. 3 BEQZ R1, etiq MEM WB EX MEM ID EX IF ID EX IF ID ⇒ 2 c.bq. Load R1, [dir] BNEZ R1, etiq Load R1, [dir] ⇒ 1 c.bq. instr sin dependencias BEQZ R1, etiq 19 CPIcontrol tras el adelantamiento TÉCNICA “CONGELAR” O “VACIAR” la cadena No hacen nada Salto Inst sig1 Inst válida IF ID IF EX MEM WB IF ID ABORT 1 c.bq. EX CPIcontrol = Fsaltos * Psaltos= 0.2 * (1) = 0.20 ⇒ A= t ejec real t ejec ideal = 1 + 0.2 1 ⇒ 20% más lenta 20 10 Mejorar aún más el rendimiento • Los saltos son instr. muy comunes (“Acelerar el caso común”). • Muchas máquinas reales tienen muchas más fases que el DLX: Resuelven el salto en la 3ª, 4ª o más. • MIPS R4000 (1992, 8 fases), en la 4ª fase (EX). • Pentium (1992, 5 fases), en la 4ª fase (EX). • UltraSPARC III (1999, 12 fases), en la 8ª fase (EX), etc. • (hoy, tendencia hacia la supersegmentación...) 21 Ejemplo: intentar aumentar el rendimiento por supersegmentación EJERC. P3 B.3 DLX2: TDLX2 → TDLX/2 (por similitud resolvería los CPIcontrol = 0.2 * 3= 0.6 saltos al final de ID2) No hacen nada Salto T IF1 IF2 ID1 ID2 EX1 EX2 M1 M2 WB1 WB2 IF1 IF2 ID1 3 c.bq. Inst sig1 IF1 IF2 Inst sig2 IF1 Inst sig3 IF1 IF2 ID1 ID2 EX1 EX2 M1 M2 WB1 WB2 Inst válida A= t ejec DLX t ejec DLX2 = N instr TDLX CPI DLX 2 × (1 + 0.2) 2.4 = = = 1.5 N instr TDLX2 CPI DLX2 (1 + 0.6) (1.6) ¡La supersegmentación no tiene por qué ser la clave! CPIcontrol mucho mayor. Cuantificar otros bloqueos y reducción de TDLX2 11 Principales soluciones para mejorar aún más el rendimiento • Muchos mecanismos de reducir más el CPIcontrol: • Sofisticar saltos (tras estudiar su comportamiento, desde el punto de vista estático y dinámico). • Eliminándolos (se conoce con exactitud su comportamiento, ej. bucles , se verá más adelante). Estática y dinámicamente • Técnicas dinámicas más avanzadas. IDEA: Si se supiera el comportamiento de un salto (“predecir”) ⇒ intentar ejecutar instrucciones de la rama válida. 23 INDICE INDICE 1. Introducción. 2. Dependencias, riesgos y bloqueos de control. 3. Consideraciones de implementación. 4. Comportamiento de los saltos condicionales. 5. Implementaciones alternativas de saltos. • Saltos que apuestan. • Saltos retrasados. • Saltos retrasados con anulación. 6. Visión de conjunto. 24 12 Comportamiento medio de los saltos condicionales •Programas INT: Saltos Cond: %T = 60%-70% ; %NT= 40%-30% ⇒ T son el doble de frecuentes ⇒ CASO COMÚN •Programas FP: Saltos Cond: %T = 65%-75% PCdest : Saltos Hacia atrás (PCdest <= PCsalto) %T = 85% Saltos Hacia adelante (PCdest >PCsalto) %T = 60% ⇒ Saltos hacia atrás casi siempre se Toman (bucles). Estas estadísticas no varían mucho con las entradas de un prog. ÚNICA CONCLUSIÓN GENERAL (∀ ∀ salto): TOMADO ES EL CASO COMÚN 25 Comportamiento individualizado de los saltos (“profiling”) Estadísticas de ejecuciones previas ⇒ Cada salto está muy “polarizado” (bucles, condiciones de salida, etc.). • Si se asocia un comportamiento individual a cada salto: % error en la predicción (DLX) prog. INT: 15% ; prog. FP: 9% En la media: (INT) 46 instr sin errar ; (FP) 173 instr sin errar. • Estas estadísticas no varían mucho con las entradas. • El compilador indicaría la predicción en un bit del opcode. (Ej. Intel i960CA). • IDEA BUENA, pero … PROBLEMAS: • Realizar ejecuciones temporales en medio de la compilación • Habría doble número de tipos de saltos. ⇒ Hoy se implementa esto con técnicas dinámicas 26 13 INDICE INDICE 1. Introducción. 2. Dependencias, riesgos y bloqueos de control. 3. Consideraciones de implementación. 4. Comportamiento de los saltos condicionales. 5. Implementaciones alternativas de saltos. • Saltos que apuestan. • Saltos retrasados (“Delayed”). • Saltos retrasados con anulación (“Cancelling”) 6. Visión de conjunto. 27 Saltos que apuestan 1 TÉCNICA “CONGELAR” O “VACIAR” LA CADENA (Siempre se abortan las instr. siguientes). c.bq. NT 1 T 1 CPIcontrol = 0.2 * (1) = 0.2 Si se sabe que va a hacer ser un salto (predecir), se puede “apostar” (implementación) empezando a ejecutar la rama predicha: • 2. APOSTAR POR NO TOMADO • 3. APOSTAR POR TOMADO 28 14 2.TÉCNICA “APOSTAR” POR SALTO NT Salto NT IF ID EX MEM WB IF ID EX MEM Inst sig1 IF ID EX Inst válida (sig2) IF ID EX MEM WB Salto T IF Inst sig1 IF ID EX Inst válida (dest) 0 c.bq. ABORT 1 c.bq. TÉCNICA “APOSTAR” POR SALTO NT (No abortar instr. siguientes). NOTA: Implem normal del DLX es Ap.NT 2 CPIcontrol = Fsaltos * Psaltos= Fsaltos * (%NT * PsaltosNT+ %T * PsaltosT) c.bq. NT 0 T 1 CPIcontrol = 0.2 * (0.3*0 + 0.7*1) = 0.14 (no se mejora mucho, pues favorece el caso menos común NT) 29 3. TÉCNICA “APOSTAR” POR SALTO T Salto NT IF ID IF Inst dest1 Inst válida (sig1) EX MEM WB ABORT IF ID EX MEM 1 c.bq. IF ID EX MEM WB Salto T IF ID EX MEM Inst dest1 0 c.bq. Inst válida (dest2) IF ID EX TÉCNICA “APOSTAR” POR SALTO T (Buscar instr de destino). 3 CPIcontrol = Fsaltos * Psaltos= Fsaltos * (%NT * PsaltosNT+ %T * PsaltosT) c.bq. NT 1 T 0 CPIcontrol = 0.2 * (0.3*1 + 0.7*0) = 0.06 (se mejoraría bastante, favorecería caso común) 30 15 “APOSTAR” POR SALTO T NO SE PUEDE IMPLEMENTAR EN DLX Buscar instr. de destino no se puede realizar hasta que no se conozca el PCdest (en fase ID). Flecha celeste: búsqueda IMPOSIBLE. Siempre se cargará la inst. sig1 en el ciclo sig. (PC←PC+4) Cond PCdest No hacen nada Salto Inst sig1 Inst dest1 IF ID IF EX MEM WB IF ABORT 1 c.bq. ID Inst válida • Como PCdest y Cond se conocen en la misma fase, no tiene sentido en DLX (en el ciclo en que se podrían buscar las instr de destino, ya se conocen las válidas). Pero sí con técnicas dinámicas. • En DLX sería equivalente en prestaciones a “congelar” la cadena. EJERC. Máquina que resuelva Cond y PCdest en fases difer. 31 INDICE INDICE 1. Introducción. 2. Dependencias, riesgos y bloqueos de control. 3. Consideraciones de implementación. 4. Comportamiento de los saltos condicionales. 5. Implementaciones alternativas de saltos. • Saltos que apuestan. • Saltos retrasados. • Saltos retrasados con anulación. 6. Visión de conjunto. 32 16 4. SALTO RETRASADO Instr ant1 Instr ant2 Instr ant3 Salto IF ID Inst sig1 IF Instr ant2 Inst válida EX MEM WB ID EX MEM WB IF ID IF IF HUECO DEL SALTO (‘delay slot’) •En DLX hay una instrucción dependiente del salto (HUECO). •El compilador podría introducir una instrucción, p.ej. anterior al salto en este “hueco” (planificación estática). •Implementar un nuevo salto DBEQZ, DBNEZ que siempre ejecuta la instrucción del hueco. (D=‘Delayed’) 33 4 TÉCNICA “SALTO RETRASADO” (Ayuda del compilador). DBNEZ Inst ant Inst válida IF ID IF EX MEM WB ID EX MEM WB IF ID EX IF ID Pero: el número de instrucciones anteriores para rellenar es pequeño. La instr del hueco SIEMPRE se ejecuta 0 c.bq. ∀ salto. CPIcontrol =0 Nº instr Efectividad(Efant) 1 40% 2 10% (≈ ≈ 0%) Existen muchas dependencias reales y el bloque básico contiene muy pocas instrucciones (en prog INT, un salto cada 4-7 inst). Ejemplo: ADDI R1, R1, 4 Si la máq sólo DBEQZ. Si no hay inst ant: SGT R3, R1, R5 ⇒ - Rellenar con NOP (bloqueo software). BEQZ R3, etiq - Rellenar con instr de la “rama predicha” ¡Cuidado! El hueco se ejecuta siempre. 34 17 Otra opción: rellenar el hueco con instrucciones de destino (caso común) Instr. con depend. Ej. ADDI R1, R1, 4 SGT R3, R1, R5 BEQZ R3, etiq instr siguiente ... etiq: instr dest1 instr dest2 ADDI R1, R1, 4 SGT R3, R1, R5 DBEQZ R3, (etiq+4) INSTR. DEL instr dest1 HUECO instr instr siguiente dest1 es ... “Inofensiva” etiq: instr dest1 para la rama NT instr dest2 • Aumenta el tamaño del código. • Si el salto no se toma, la ejecución de la instrucción del hueco no es útil (como si fuera un bloqueo software). • Recuerda a “Apostar por tomado”, pero estática (compilador) • La efectividad es alta (Eframa 1 instr ≈ 75%) (ramas independ) 35 Ejemplos de CPIcontrol con saltos retrasados Ej. c.bq. Si sólo existen DBEQZ y todo hueco se rellena con instr. destino (todas inofensivas) NT 1 T 0 CPIcontrol = 0.2 * (0.3*1 + 0.7*0) = 0.06 EJERC. Más realista: Si sólo existen DBEQZ que se rellena con instr anteriores, y si no, con instr de destino, y si no, con NOP: CPIcontrol = Fsaltos * (%no_rell_Ant* Pcaso_no + %rellenar _Ant * 0) = = Fsaltos* %no_rell_Ant* ( (1-Efdest)* 1+ Efdest * (%NT*1+%T*0) ) = 0.2 * 0.6 * ( (1-0.75) * 1 + 0.75 * ( 0.3 * 1 + 0.7*0) ) = = 0.12 * (0.25+0.225)=0.057 relleno con NOP. Inst destino ejec. inútilm. Efdest =Efectividad de rellenar con instrucciones del destino=75% CPIcontrol aún no muy bajo ⇒ otras alternativas para “aprovechar” hueco 36 18 INDICE INDICE 1. Introducción. 2. Dependencias, riesgos y bloqueos de control. 3. Consideraciones de implementación. 4. Comportamiento de los saltos condicionales. 5. Implementaciones alternativas de saltos. • Saltos que apuestan. • Saltos retrasados. • Saltos retrasados con anulación. 6. Visión de conjunto. 37 Salto retrasado con anulación • Difícil rellenar el hueco (instr indep son pocas). • Si el salto es capaz de anular o cancelar las instrucciones del hueco ⇒ No tantos problemas para rellenarlo con instr. de una u otra rama (Efectividad ≈ 90%) • CBEQZ o CBNEZ (C de ‘cancelling’) • Más complejo de implementar, pero más prestaciones. • Aprovecha que los saltos están muy “polarizados”. • Compilador introduce la instrucción de la rama predicha ⇒ CBNEZ.pt y CBNEZ.pnt • Siguen valiendo los ejemplos de reordenación de instr. (de destino o anteriores) 38 19 Cronogramas para saltos retrasados con anulación CBEQZ.pt (T) IF Inst dest1 (hueco) Inst válida ID IF EX MEM WB ID EX MEM IF ID EX CBEQZ.pt (NT) IF Inst dest1 (hueco) Inst válida ID IF EX MEM WB IF ID ID IF EX MEM WB ID EX MEM IF ID EX CBEQZ.pnt (T) IF Inst sig1 Inst válida(sig2) ID IF EX MEM WB ID 1 c.bq. CANCEL EX CBEQZ.pnt (NT) IF Inst sig1 Inst válida (sig2) IF 0 c.bq. 0 c.bq. 1 c.bq. CANCEL EX 39 Penalidad saltos retrasados con anulación NOTA: CBEQZ.pnt ≡ BEQZ Apostar por NT (TÉCNICA 2) CBEQZ.pnt CBEQZ.pt Ej. NT 0 1 T 1 0 CBEQZ Ac. 0 Fall 1 Calcular CPIcontrol medio para programas FP e INT. Suponer la predicción se hace por ejecuciones previas (profiling) y 100% de efectividad. INT: CPIcontrol = Fsaltos * (%Ac * 0 + %Fall * 1) = = 0.2*(0.15 * 1) = 0.03 c.bq./instr FP: CPIcontrol = Fsaltos * (%Ac * 0 + %Fall * 1) = = 0.1*(0.09 * 1) = 0.009 c.bq./instr 40 20 Otros casos con más instr. en el hueco Hoy es más realista: por ejemplo DLX que resuelve saltos en la cuarta fase (MEM). PCdest Cond D3BNEZ Inst ant1 Inst ant2 Inst ant3 IF ID IF EX MEM WB ID EX MEM WB IF ID EX MEM WB IF ID EX MEM WB Inst válida IF SIEMPRE SE EJECUTAN • Encontrar tres instr anteriores es muy difícil 0 c.bq. Si fuera ∀ salto, entonces: CPIcontrol =0 • Técnica estática, prob. de compatibilidad futura 41 Problemas de los saltos retrasados • Problemas de herencia. Nuevos procesadores llevan ya otros mecanismos ⇒ hardware tendrá que implementar tales saltos para que el software antiguo sea compatible. • Excepción retomable en instrucción del hueco (salto T): Salto T IF Inst hueco Inst válidas (de dest) ID IF EX MEM WB ID EX MEM IF ID EX IF ID EX Excepción (fallo de pág) Guardar: PC1 o información. PC2 •“Técnicas dinámicas son trasparentes al usuario (ventaja)”. Hoy se sigue una técnica similar a CBEQZ pero dinámicamente (caché de predicción). Muy efectiva. 42 21 INDICE INDICE 1. Introducción. 2. Dependencias, riesgos y bloqueos de control. 3. Consideraciones de implementación. 4. Comportamiento de los saltos condicionales. 5. Implementaciones alternativas de saltos. 6. Visión de conjunto (máquinas reales). 43 Visión de conjunto • Todas estas técnicas son la base para comprender técnicas dinámicas más avanzadas (se verán en sig. apartado). • Casi ningún procesador tiene tres tipos de saltos. • HOY: los saltos retrasados sólo existen en máquinas que los heredan (compatibilidad). • Motorola 88000: DBEQZ + BEQZ (Apostar NT) • Intel i860: CBEQZ.pt + BEQZ (Apostar NT) • SPARC (existe) : DBEQZ + CBEQZ.pt (Apostar NT) • La deceleración debida al CPIcontrol se dispara cuanto menor es CPI (en superescalares) ⇒ más énfasis. 44 22 NOTA: Concepto de “especulación” de instrucciones y riesgos adicionales • Ej: 2. TÉCNICA “APOSTAR” por salto NT en DLX que resuelve saltos en fase MEM Salto IF ID EX MEM WB Inst sig1 IF ID EX “ESPECULACIÓN” IF ID Inst sig2 IF Inst sig3 Inst válida IF • Se está especulando con algunas fases (ASP2: ampliación). • Riesgos de acceder a instrucciones (caché), las cuales, si el salto es T, nunca se debieron leer. • Fases lanzadas: posibilidad de que se produzca excepción (ej DIV por 0), que si es salto T nunca se debió producir. • Si resolución aún más tardía ⇒ Más riesgos (se modifica el estado del procesador en las fases MEM o WB de inst sig1,2,3...) CONCLUSIONES • SALTOS SON MUY COMUNES ⇒ CPICONTROL ALTO (se nota más en superescalares). • IMPORTANTE ADELANTAR LA RESOLUCIÓN (PCdest y Cond) • IMPORTANTE: CONOCIMIENTO DE SALTOS. • SALTOS CON AYUDA DEL COMPILADOR : PROBLEMAS (herencia, etc.) • VEREMOS LA EXTENSIÓN DE ESTAS TÉCNICAS DE FORMA DINÁMICA. 46 23