670 likes | 844 Views
Arquitecturas Paralelas Curso 13/14. Horas 6 6 8 6 3. INTRODUCCIÓN CONECTIVIDAD MÁQUINAS MIMD MÁQUINAS SIMD y SIMT SUPERESCALARES. arqPar Temario Super- 2. SUPERESCALARES Límites de las arquitecturas escalares “Pipeline” Visión global de una arquitectura Superescalar
E N D
Arquitecturas Paralelas Curso 13/14 Horas 6 6 8 6 3 • INTRODUCCIÓN • CONECTIVIDAD • MÁQUINAS MIMD • MÁQUINAS SIMD y SIMT • SUPERESCALARES
arqPar Temario Super-2 • SUPERESCALARES • Límites de las arquitecturas escalares “Pipeline” • Visión global de una arquitectura Superescalar • Flujo de instrucciones • Flujo de datos en registros • Flujo de datos en memoria • Microarquitectura del Pentium II, III y 4 • Microarquitectura del Core 2 • Bibliografía: • “Modern Processor Design. Fundamentals of Superscalar Processors” • J. P. Shen y M. H. Lipasti McGraw-Hill-2004 [Caps. 4 y 5] • “Processor Microarchitecture: An Implementation Perspective” • A. González, F. Latorre y G. Magklis - 2011
arqPar Límites de las arquitecturas escalares “Pipeline” Super-3 ¡ Demasiado rígido ! ¿Alcanzable? • Aplicable a: • Instrucciones • Aritmética • Acceso a • memoria d ¡ Todas las instrucciones siguen mismo camino a la misma marcha, salvo parones ! • Límite superior IPC=1=CPI • Unificación ineficiente en un único pipeline • Pérdida de eficiencia por ejecución tan “en orden”
arqPar Límite superior IPC=1=CPI ¿Realidad? Super-4 ketapas dn, dn-1,..., d2, d1 d’n, d’n-1,..., d’2, d’1 Sin Pipeline k T1 Tk n k k+n–1 n k (k+n–1) = = Lim Sk = k n ¿ Es ésto tan bueno ? • 1987 – Agerwala y Cocke => CPI ≈ 1,77 .. 1,15 ¿ Qué rendimiento se espera ? Sk = • Límites tecnológicos: • k (2..15..); < 10 • k => n
arqPar Límite superior IPC=1=CPI ¿Realidad? Super-5 Aceleración como función de ‘k’ y ‘n’ SK Sk = n k k+n–1 n Necesario n45 para eficiencia 90% Necesario n89 para eficiencia 90% ¿Puedo alimentar el pipe con tantas instrucciones seguidas? ¡ Saltos ! 1 cada 5/6 Inst. Predicción OK => 90% ¿Conclusión?
arqPar Unificación ineficiente en un único pipeline Super-6 Operaciones: ALU F D I E W F F D D I I E E M E W W M W F D I E E Unificación imposible o muy ineficiente + Load/Store Operaciones:Coma flotante, Coma fija (mul,div) => Multiciclos
arqPar Ejecución “en orden” ineficiente Super-7 I8 I7 I6 I5 I4 I3 I2 F D I E E E W Prog. ejemplo 16 11 1 6 21 2 17 22 7 12 13 23 8 3 18 19 4 14 9 24 20 10 25 15 5 r1 = M[Y] F F D D I I E E E E E E W W r2 = M[Z] r3 = r1+r2 F D — — — — — — — — — — — — — — — — — — — — — I E E E W I1 I2 I3 I4 I5 I6 I7 I8 M[X] = r3 26 F ? D ? I E E E W r4 = M[B] RAW r5 = M[C] r6 = r4*r5 F D M[A] = r6 F D F D I I F I I E E E E D E E E E E E E E W W W W ¿Es necesario retener a I5, I6, … ? ¡ Permitir ejecución fuera de orden !
arqPar Ejecución “en orden” ineficiente Super-8 Programa ejemplo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 I1: r1 = M[Y] I2: r2 = M[Z] I3: r3 = r1+r2 I4: M[X] = r3 — — I5: r4 = M[B] ? I6: r5 = M[C] I7: r6 = r4*r5 I8: M[A] = r6 — — F F F F F F D D D D D D I I I I I I F D I E E E W E E E W — — — — — — — — — — — — E E E E E E E E E E E E E E E W W W W W F D I E E E W Permitiendo ejecución fuera de orden: 26 a 19 ciclos
arqPar Visión global … (Escalar => Superescalar) Super-9 Pipelines paralelos IF ID RD ALU MEM WB Grado = 3 • Romper límite IPC=1 • Paralelismo temporal y espacial • Coste hw adicional: • S2 Crossbar entre etapas • Accesos paralelos Reg y Cache • ¿Rendimiento IPC? Teórico Observado Unos 1,58..8 Otros 51..90 2 0,6..1,45 4 1 .. 2 6 1,2..2,3 Pentium4 Core2 Itanium PowerG5 3 4 6 8
arqPar Visión global … (Escalar => Superescalar) Super-10 • ¿Rendimiento IPC? Observado 2 0,6..1,45 4 1 .. 2 6 1,2..2,3 • Simulación con: • PTLsim/X arquitectura tipo x86-64 grado 4 • SPEC CPU2006 • 200 millones de instrucciones simuladas: datos “Fetch”
arqPar Visión global … (Escalar => Superescalar) Super-11 Pipelines diversificados IF ID RD EX ALU MEM1 FP1 BR MEM2 FP2 FP3 WB • Evitar unificación ineficiente • Diseño adhoc + eficiente: • Mejor latencia • Menos hardware • Control cauces EX: • Distribuido e independiente • ¿Cuánta diversidad? 1965 CDC6600 10 1990 M88110 10 1995 Pentium 2 2000 Itanium 23 2006 Core 2 14
arqPar Visión global … (Escalar => Superescalar) Super-12 IF en orden ID RD Dispatch buffer EX ALU MEM1 FP1 BR MEM2 FP2 fuera de orden FP3 WB Reorder buffer en orden • Permitir ejecución fuera de orden => Pipelines dinámicos
arqPar Visión global … (Modelo Superescalar) Super-13 Extraer Buffer de instrucciones Decodificar Buffer de dispatch Cada instrucción a U.F. adecuada Forzar terminación en orden Optimizar acceso a memoria Despachar Buffer de issuing Ejecutar Buffer de completar Completar Buffer de store Retirar
arqPar Visión global … (Modelo Superescalar) Super-14 L/S Queue CacheI CacheD Reorder Buffer Registros Issue Queue Write Back Fetch Decode Rename Issue Execute Commit Fig. 1.1 “Processor Microarchitecture. An Implementation Perspective”
arqPar Visión global … (Etapa Fetch) Super-15 CACHE I F D E W rol sub add mul add xor sub mov 4 4 E W E W or bra --- --- E W 8 --- add call --- • Caché extendida “línea = 8 Inst.” • Caché autoalineada Bancos de memoria 0 1 2 3 PC --- --- sub lsl add load asr sub para etapa D guardar --- --- sub lsl asr sub add load add load asr sub add load --- --- --- --- --- --- Buffer --- asr sub para etapa D sub lsl add load • ¡ La etapa Fetch no es trivial ! (Caché simple “línea = 4 Inst.”)
arqPar Visión global … (Etapa Decodificación) Super-16 Memoria principal Lógica Pre Deco. Cache I F D 4 4 Saltos Independencia Inst1 Inst2 Inst3 Inst4 4b 4b 4b 4b Inst4 Inst1 Inst2 Inst3 Tiene su sobrecarga • ¡ Mucho trabajo ! • Identificar las instrucciones concretas y su tipo • Detectar dependencias con instrucciones cercanas • Identificar saltos • Leer operandos RISC lo facilita mucho • ¿Acelerar? => Predecodificación (parcial) previa [miss cacheI]
arqPar Visión global … (Etapa Decodificación) Super-17 µop RISC
arqPar Visión global … (Etapa Decodificación) Super-18 CISC add [eax], ebx ld r0, ds:[eax] add r1, r0, ebx st ds:[eax], r1 RISC
arqPar Visión global … (Etapa Despachar) Super-19 • Decidir a qué U.F. enviar cada instrucción Extraer • Buffer de espera operando(s) no disponible(s) I5: r4 = M[B] Tomasulo Decodificar I6: r5 = M[C] central Estación de reserva I7 I7: r6 = r4*r5 Despachar distribuidas I6 ALU MEM1 FP1 BR dispatch I5 MEM2 FP2 issue FP3 ALU MEM1 FP1 BR Reorder buffer “Completar” MEM2 FP2 FP3 • Transición centralizado a distribuído
arqPar Visión global … (Etapa Ejecutar) Super-20 ALU TI SuperSPARC FPU IBM RS/6000 • Salto • Load / Store • Multimedia (a+e+1) + (b+f+1) + 2 2 (c+g+1) + (d+h+1) 2 2 Instrucciones % Tipo 40 ALU Regla 4 / 2 / 4 20 saltos 4 40 load/store • Tendencia a diversificar más => más U.F. más especializadas • ¿Cuántas U.F. de qué tipo? • U.F. > Grado • O(N2)
arqPar Visión global … (Etapa Ejecutar) Super-21 Instrucciones % Tipo 40 ALU 20 saltos 40 load/store • ¿Cuántas U.F. de qué tipo? • Simulación con: • PTLsim/X arquitectura tipo x86-64 grado 4 • SPEC CPU2006 • 200 millones de instrucciones simuladas: datos “Commit”
arqPar Visión global … (Etapas Completar y Retirar) Super-22 F R O N T E N D E X E C C U O T R I E O N B A C K E N D Excepciones precisas Estado máquina Prioridad a load vs store Estado memoria
arqPar Flujo de instrucciones (Problemática de los saltos) Super-23 • Por simplicidad: F D E W I1, I2, I3, I4, I5, I5, I6 vs I1, I2, I3, I5, I6 1 2 3 4 5 6 7 8 9 10 I1: r1 = M[A] F F F F F F F D D D D D D D E E E E E E E W W W W W W W I2: r3 = r3-1 I3: beq I5 I4: r2 = r2+r4 I5: r5 = r5-r6 I5: r5 = r5-r6 I6: M[B] = r5 Programa ejemplo I1: r1 = M[A] I2: r3 = r3-1 I3: beq I5 I4: r2 = r2+r4 I5: r5 = r5-r6 I6: M[B] = r5 ! Hasta fin ciclo 5 no se sabe dirección del salto ! ¿Cómo afecta a nuestro modelo?
arqPar Flujo de instrucciones (Penalización por saltos) Super-24 ? Modo de direccionamiento desp(PC) (Ri) • bra 55(R5) desp(Ri) salto ¿ Perder siempre 3 ciclos ? 21 Instrucciones • Incondicionales: bra 28(PC) => Determinar dirección destino • Condicionales: beq 55(R5) => + Evaluar condición de saltar • bra 28(PC) • bra (R5)
arqPar Flujo de instrucciones (Penalización por saltos) Super-25 ¿ Flags, Registros ? Registro Cond. Registros generales salto • Incondicionales: bra 28(PC) => Determinar dirección destino • Condicionales: beq 55(R5) => + Evaluar condición de saltar ¡ Demasiada pérdida !
arqPar Flujo de instrucciones (Técnicas especulativas) Super-26 Cache Inst. Branch Target Buffer Dir. Inst. Salto Dir. Destino Historia T T TT/T NT/T 0 1 N N PC T Saltar TN/T NN/N T + Mux N N Saltar FSM • Predecir (especular) • Dirección del salto • Condición del salto • Mecanismo para validar acierto o fracaso • Mecanismo de recuperación ante un fallo El salto sigue su ejecución $00F5A4 $00F5AC $00F5A4: beq 4(PC) • Hit BTB 86,5% • ¿ Aliasing ? OK 86,8 .. 97,0
arqPar Flujo de instrucciones (Técnicas especulativas) Super-27 a a Retirar éstas • Mecanismo de recuperación ante un fallo ¿ Gestión de etiquetas ? T (tag 01) T 01 01 01 inst1 inst2 inst3 inst1 inst2 inst3 01 01 01 + ¡Redirigir! (tag 02) N N T b b inst7 inst8 inst4 02 02 inst4 (tag 03) T T T c c e inst5 inst6 inst5 inst6 03 03 03 03 inst9 01 ¡Etiquetar! ¡Anular! d d f
arqPar Flujo de instrucciones (Técnicas especulativas) Super-28 PowerPC 604 • BTB dividida en dos • BTAC [64] saltos tomados y 1 ciclo • BHT [512] correctora y 2 ciclos • Actualización en Back-End • Estación de reserva Branch [4]
arqPar Flujo de instrucciones (¿Qué se consigue?) Super-29 Aritmética Coma flotante Media 4% Aritmética Entera Media 11% Más frecuentes los bcc • 2 bits historia y 4K entradas [Hennesy …]
arqPar Flujo de instrucciones (Otras técnicas especulativas) Super-30 Apenas mejora • ¿Cómo mejorar en la condición? • Más bits de historia • Más saltos recordados • Mejorar la función de predicción • Predictores correlacionados Historia de otros saltos influyen en la predicción del salto actual [globalidad] if (d==0) d = 1; if (d==1) ------ • Predictores múltiples: local + global …. Local 2 bits => 7% Correlacionado => 4% Múltiple => 3%
arqPar Flujo de instrucciones (Otras técnicas especulativas) Super-31 • Algunos problemas del predictor simple con 2 bits de historia: • Sea un patrón de salto => T N T N T N T N T……… ¿Guardar dos+ comportamientos? Historia 0 0 1 Historia PC 0 0 PC 1 0 1 0 0 1 1 0 50% T Registro histórico de saltos con desplazamiento 1 1 NT/T NN/N N T ¿Cuántos? Idealmente uno por salto TN/T TT/T
arqPar Flujo de instrucciones (Otras técnicas especulativas) Super-32 • Algunos problemas del predictor simple con 2 bits de historia: • 2 instrucciones distintas y mismo patrón de saltos => ¡Aliasing! Historia $A350 bne 4(PC) PC 1 0 1 0 1 0 1 0 1 0 1 0 $B684 beq 8(PC) ¿Guardar dos+ historias?
arqPar Flujo de instrucciones (Otras técnicas especulativas) Super-33 • 1992 Yeh y Patt => Predictor adaptativo de dos niveles PC • g Global [1] • p Individual [1 * bcc] • s Shared [n * bcc] Adaptativo • G Global [1] • P Individual [varios] 90% 95..97% PentiumPro GAg, PAg, PAs
arqPar Flujo de instrucciones (Otras técnicas especulativas) Super-34 • 1993 Scott McFarling => Predictor gshare Además: Return Address Stack DEC Alpha 21264 • ISCA’04 Ayosé Falcon y … => Prophet/Critic hybrid branch predictor
arqPar Visión global … (Etapa Ejecutar) Super-35 90% 95..97% GAg, PAg, PAs • Simulación con: • PTLsim/X arquitectura tipo x86-64: bimodal(2)+Gshare • SPEC CPU2006 • 200 millones de instrucciones simuladas: cond, indir, ret
arqPar Flujo de datos en registros Super-36 • Instrucción ALU típica: Riesgo estructural Ri = Fn (Rj, Rk) Dependencias de nombre WAW WAR Dependencias de datos RAW r1 = r2 + r3 ----- r2 = r4 + r5 r1 = r2 + r3 ----- r4 = r1 + r5 r1 = r2 + r3 ----- r1 = r4 + r5 ¡ Ficticias !
arqPar Flujo de datos en registros Super-37 • ¿Cómo se generan WAR y WAW? for (i=0; i<N; i++ { X[i] = Y[i] + Z[i]; A[i] = B[i] * C[i]; } + * + * Estático r4 = M[Y] r5 = M[Z] r6 = r4+r5 M[X] = r6 r7 = M[B] r8 = M[C] r9 = r7*r8 M[A] = r9 r4 = M[Y] r5 = M[Z] r6 = r4+r5 M[X] = r6 r4 = M[B] r5 = M[C] r6 = r4*r5 M[A] = r6 ?
arqPar Flujo de datos en registros Super-38 • ¿Cómo se generan WAR y WAW? for (i=0; i<N; i++ { X[i] = Y[i] + Z[i]; } ¡ Más parones ! r4 = M[Y] r5 = M[Z] r6 = r4+r5 M[X] = r6 ----- r4 = M[Y] r5 = M[Z] r6 = r4+r5 M[X] = r6 Estático Iteración i Iteración i+1 r4 = M[Y] r5 = M[Z] r6 = r4+r5 M[X] = r6 Dinámico ¿ Solución ? ¡ Más registros ! vs Tomasulo
arqPar Flujo de datos en registros Super-39 • Registros de Arquitectura ARF (pocos) + Renombrado RRF (más) r4 = M[Y] r5 = M[Z] r6 = r4+r5 M[X] = r6 ----- r4 = M[Y] r5 = M[Z] r6 = r4+r5 M[X] = r6 r4 = M[Y] r5 = M[Z] r6 = r4+r5 M[X] = r6 ----- s4 = M[Y] s5 = M[Z] s6 = s4+s5 M[X] = s6 ¡ Asignación única [ventana de instrucciones] ! Reorder Buffer Intel Core 2 Rename Buffer IBM Power 3 ARF y RRF mezclados Pentium 4 ¿ Cómo ?
arqPar Flujo de datos en registros Super-40 • Renombrado de registros a través del ROB Busy Free Tag Dato Atributos instrucción Dato V 1257 0 6376 1 0 4321 9254 1 1 ARF ROB ???? 0 0 • ¿Leer un operando en Ri PreIssue? RRF ¿Todas las instrucciones con registro destino? • Valor de ARF “1257” • Valor no disponible ¡Parón en estación de reserva “Tag”! • Valor de RRF “6376” • “Commit” => Actualizar RRF en ARF
arqPar Flujo de datos en registros Super-41 • Renombrado de registros a través del Rename Buffer Busy Free ¿Evitable doble escritura? RRF ARF Tag Dato Dato V RRF ARF • Renombrado ARF y RRF mezclados (IBM RS6000 FPU 32+8=40) OP T S1 S2 S3 OP T S1 S2 S3 ¿ Fload R2 M[] ? FAD 3 2 1 FAD 3 2 1 ¿Excepción y fallo predicción? Libres 5 ? Map Table 325 : 406 36 32 33 37 38 34 35 39 R2:R2 R2:R32 2 Pendientes commit 6
arqPar Flujo de datos en memoria Super-42 • Problemática del acceso a memoria disponible r1 r1 $000F3A58 ld r2,35(r1) $000F3A8D TLB 1 000F3 3F25 ¿ st r3,20(r4) ? $3F25A8D
arqPar Flujo de datos en memoria Super-43 • ¿Ejecución en orden de los accesos a memoria? DAXPY :: LINPAC Y(i) = A * X(i) + Y(i) F0 LD,a R4 ADDI,Rx,#512 ;last address Loop: F2 LD,0(Rx) ;load X(i) F2 MULTD,F0,F2 ;A*X(i) F4 LD,0(Ry) ;load Y(i) F4 ADDD,F2,F4 ;A*X(i)+Y(i) 0(Ry) SD,F4 ;store into Y(i) Rx ADDI,Rx,#8 ;inc. index to X Ry ADDI,Ry,#8 ;inc. Index to Y R20 SUB,R4,Rx ;compute bound BNZ,R20,Loop ;check if done LD SD LD MULTD ADDD 1ª iteración 2ª iteración ¿Fuera de orden? ld, multd, ld, addd, sd ld, multd, ld, addd, sd
arqPar Flujo de datos en memoria Super-44 • Load Bypassing, Load Forwarding y colas LSQ Store X Store Y Load Z ld st STQ LDQ STQ L1D reissue Load bypassing Load forwarding • Tag con menos bits “aliassing” Store X Store Y Load X ? • Forwarding Tag Addr completa • Predictor de dependencia LdSt 11..19% 1..4% Mejoras
arqPar Flujo de datos en memoria Super-45 • Load Bypassing, Load Forwarding y colas LSQ [Completo] ¿ Puede reducirse el consumo ? STQ LDQ
arqPar Flujo de datos en memoria Super-46 • LSQ [Reducir Consumo en L1D] Nicolaescu y otros ISLPED 2003 • ¡ Parten de LSQ unificada ! Serializar acceso: LSQ miss L1D ¿Cómo evitar acceso inútil LSQ+L1D? ¡ Baja tasa de forwarding < 15% ! LSQ Edad L/S Dir. Dato 2 L 16 Antiguo 3 S 18 X’ L1D Dir. Dato 4 S 20 Y’ 5 L 14 14 Z’ 14 Z 6 S 20 8 L 18 X --- --- 9 S Reciente issue 20 Y Y’ Reloj
arqPar Flujo de datos en memoria Super-47 • LSQ [Reducir Consumo en L1D] Nicolaescu y otros ISLPED 2003 • ¡ Parten de LSQ unificada ! Serializar acceso: LSQ miss L1D ¿Cómo evitar acceso inútil LSQ+L1D? ¡ Baja tasa de forwarding < 15% ! LSQ Edad L/S Dir. Dato 2 L 16 Antiguo 3 S 18 X’ L1D Dir. Dato 4 S 20 Y’ 5 L 14 ¡ Un ciclo más el 85% de los loads ! 14 Z’ 14 Z 6 S 20 8 L issue 18 X --- --- 9 S Reciente 20 Y ¿ En x86 ? Z Miss Reloj
arqPar Flujo de datos en memoria Super-48 • ¿Cuánto forwarding? • Simulación con: • PTLsim/X arquitectura tipo x86-64: LSQ [LQ.48+SQ.32] • SPEC CPU2006 • 200 millones de instrucciones simuladas
arqPar Flujo de datos en memoria Super-49 • LSQ [Reducir Consumo en L1D] Nicolaescu y otros ISLPED 2003 ¿Cómo evitar acceso inútil LSQ+L1D? ¡ Baja tasa de forwarding < 15% ! Usar LSQ libre [ld/st commited] como una cache LSQinfrautilizada dirvalor dirvalor ¡ Pasan a medir 6,3%+[45,5% | 27,0%] ! ld/st Ld x x ¡ Un ciclo más +50% de los loads ! ¡ 2% t ! ¡ 98% t !
arqPar Flujo de datos en memoria Super-50 • LSQ [Reducir Consumo en L1D] Carazo y otros JCSC Dic 2012 Predictor de forwarding ¿Cómo evitar acceso inútil? ¡ Baja tasa de forwarding < 15% ! [LDQ+STQ]Cached + x86-64 forward STQ en vuelo Ahorro Wat HIT STQ cacheada Predicho: SI FWD L1D + 1 ciclo LDQ cacheada Predictor de forwarding MISS load forward STQ en vuelo = ciclos y Wat MISS Predicho: NO FWD STQ cacheada LDQ cacheada L1D HIT = ciclos y Wat