Story Transcript
Paralelismo en monoprocesadores Procesadores VLIW
Profesor: Mag. Marcelo Tosini Cátedra: Arquitectura de Computadoras y técnicas Digitales Carrera: Ingeniería de Sistemas Ciclo: 4º año
Arquitectura VLIW básica • Data de principios de los años 70 • Muy apoyada en la tecnología de compiladores que optimicen el código • Una instrucción especifica varias operacíones agrupadas en un formato largo de instrucción con longitudes desde 128 a 1024 bits • La planificación de ejecución de las operaciones es externa al procesador • El rendimiento del procesador queda determinado por la calidad del compilador
Formato de instrucciones Procesador tradicional
100 inst inst11(op1) (op1) 101 inst 2 (op2) inst 2 (op2) 102 inst inst33(op3) (op3) 103 inst inst44(op4) (op4) 104 inst inst55(op5) (op5) 105 inst inst66(op6) (op6) 106 inst inst77(op7) (op7) 107 inst inst88(op8) (op8) 108 inst inst99(op9) (op9) 109 inst inst10 10(op10) (op10) una instrucción = una operación
Procesador VLIW
100 101 102 103 104 105 106 107 108 109
operación NOP operación operación11 NOP operación55 NOP operación NOP operación22 operación operación33 operación NOP operación operación66 NOP operación77 operación NOP NOP operación44 NOP NOP NOP operación NOP operación88 operación operación10 10 NOP NOP operación NOP NOP operación99 NOP NOP NOP NOP NOP NOP NOP operación NOP operación11 11 operación operación12 12 operación NOP operación14 14 operación operación16 16 NOP operación NOP operación operación13 13 NOP operación15 15 una instrucción = varias operaciones
VLIW vs. Superescalar 32-64 bits FX 1 0 1 2 3 4 5
Dynamic Dynamic scheduler scheduler
FX 2
Superescalar
FP
6
Instruction memory
load/ store
128-512 bits FX 1 0 1
FX 2
2 3 4
FP
5 6
Instruction memory
load/ store
VLIW
VLIW vs. Superescalar Diferente división de tareas entre software (compilador) y hardware (procesador)
Optimización Optimización (compilador) (compilador)
r ala sc re pe Su
Análisis Análisisde de dependencias dependencias (compilador) (compilador)
Planificación Planificaciónyy reserva reservade derecursos recursos (compilador) (compilador)
Análisis Análisisde de dependencias dependencias (procesador) (procesador)
Planificación Planificaciónyy reserva reservade derecursos recursos (procesador) (procesador)
IW VL
programa programa
Ejecución Ejecución (procesador) (procesador)
VLIW vs. Superescalar En VLIW no se puede determinar si hay dependencias en ciertos casos Ejemplo: lw sw
r1, 100(r2) r3, 0(r4)
; si r2 = r4+100, hay dependencia!!!
Procesador Procesadorsuperescalar superescalar comprueba compruebasisila ladirección direcciónr2 r2++100 100es esigual igualaar4 r4++00 ••igual => igual =>secuencializa secuencializalas lasinstrucciones instrucciones ••NO NOigual igual=> =>paraleliza paralelizalas lasinstrucciones instrucciones Procesador ProcesadorVLIW VLIW No Nopuede puededeterminarlo determinarlo=> =>el elcompilador compiladorsiempre siempresecuencializa secuencializa
Arquitectura VLIW: ventajas • La planificación de la ejecución estática de instrucciones es realizada por el compilador: • Menos lógica en la unidad de control del procesador • Mayor frecuencia de reloj (organización mas sencilla) • Mayor disponibilidad de especio para otras unidades (Pe: unidades funcionales) • Es una arquitectura muy difundida en circuitos embebidos • DSP´s • Multimedia (placas de sonido, video, etc.)
Arquitectura VLIW: Limitaciones • Tamaño del código • Mucho desperdicio de memoria por instrucciones NOP • Compatibilidad de código objeto • Hay que recompilar todo el código fuente para cada nueva versión de procesador • Baja ocupación de las unidades funcionales • Conflictos en el acceso al banco de registros desde varias unidades • Conflictos de predicción estática de accesos a memoria • Imposibilidad de determinación de latencias en caso de posibles fallos en accesos a Ram o caché • Dificultades en la predicción estática de saltos
Tamaño del código nop
adda
nop
nop
load
nop
addb
mul
store
sub
nop
nop
nop
nop
addc
nop
nop
nop
nop
nop
A
B
Formato de instrucción VLIW desempaquetado •útil para ejecución en las UF
C
D
Formato de instrucción VLIW empaquetado •útil para almacenar en la memoria
1 B 0 A
adda store
0 A 1 B
load sub
0 C 1 C
addb addc
1 D 1 A
0
Separador de instrucciones VLIW (1 = última instrucción)
B
Unidad funcional en la que se ejecutará la instrucción
mul nop
Tamaño del código En qué momento se descomprimen las instrucciones de memoria? • Carga en la I-Caché • Transferencia de bloques a la cache es lenta (bus de acceso a RAM cuello de botella) • El algoritmo de compresión puede ser complejo ya que se dispone de tiempo • se ocupa mucho especio de cache si las instrucciones están descomprimidas • Lectura de la I-Caché (Fetching) • En la caché se mantienen las instrucciones empaquetadas •La descompresión en la etapa de fetching puede ser lenta (agrega una o más etapas de segmentación al proceso)
Ocupación de las unidades funcionales Meta principal: Mantener ocupadas todas las unidades funcionales Problema: Para N unidades funcionales usables en cada ciclo de reloj • Se leen 2 operandos fuente por unidad • Se escribe un resultado por unidad
UF1 Register Bank
UF2 … UFn
Ocupación de las unidades funcionales Arquitectura del banco de registros • Área banco de registros ≈ cuadrado del número de puertos (de entrada o salida) • Diseño limitado por el número de puertos read1 A read1 B
read1 A
write1
read1 B
read2 A
write1
read2 B write2 Dout2 B
Dout2 A
Dout1 B
Dout1 A
Dout1 B
Dout1 A
Ocupación de las unidades funcionales Arquitectura del banco de registros • Tiempo de acceso al banco de registros proporcional al número de registros • Al crecer las áreas de celda básica y decodificadores hay mayores retardos
• A partir de aproximadamente 20 puertos (I/O) la velocidad se degrada bastante • Aproximadamente 14 lecturas y 7 escrituras => hasta 7 unidades funcionales como máximo
Ocupación de las unidades funcionales Optimización de la arquitectura del banco de registros • Particionar el banco de registros en bancos locales a cada unidad funcional y con canales de comunicación globales Bus global
Banco Bancode de registros registros
Banco Bancode de registros registros
Banco Bancode de registros registros
Banco Bancode de registros registros
UF1 UF1
UF2 UF2
UF3 UF3
UFn UFn
Planificación del compilador • La eficiencia del compilador influye mucho en el rendimiento final de la arquitectura Rendimiento alcanzado por los compiladores actuales es inferior al rendimiento potencial máximo que alcanza la arquitectura • Código generado por el compilador muy dependiente de la arquitectura VLIW de destino Ante actualizaciones de hardware es necesario reescribir el compilador (mayores costos de actualización) • Para optimizar mejor el código es útil que el programador ayude al compilador Lenguajes deben usar meta comandos (pragmas) especiales
Planificación del compilador Optimizaciones del compilador: Análisis global del código • Modificación del código fuente para incrementar el paralelismo a nivel de instrucción • Aplicación de técnicas usadas para superescalares: • • • •
Desenrollamiento de lazos Segmantación de software Actualización de referencias Renombre de registros
Planificación del compilador Ejemplo: Suma de un valor a un arreglo
En ensamblador:
lazo:
ld addd sd subi bnez
for (i=10; i>0; i--) x[i] = x[i] + s;
f0, 0(r1) f4, f0, f2 f4, 0(r1) r1, r1, #8 r1, lazo
; f0 = x[i] ; f4 = f0 + s ; x[i] = f4 ; i-; if i ≠ 0 goto lazo
Suponer un procesador VLIW de 3 unidades funcionales:
load/store load/store&&saltos saltos 2 ciclos de reloj
ALU ALUFX FX
ALU ALUFP FP
2 ciclos de reloj
3 ciclos de reloj
Planificación del compilador Instrucciones VLIW del programa Instr. Instr.
load/store load/store&&saltos saltos
ALU ALUFX FX
ALU ALUFP FP
11
ld ldf0, f0, 0(r1) 0(r1)
nop nop
nop nop
22
nop nop
nop nop
nop nop
33
nop nop
nop nop
addd adddf4, f4,f0, f0,f2 f2
44
nop nop
nop nop
nop nop
55
nop nop
nop nop
nop nop
66
sd sdf4, f4,0(r1) 0(r1)
subi subir1, r1,r1, r1,#8 #8
nop nop
77
nop nop
nop nop
nop nop
88
bnez bnezr1, r1,lazo lazo
nop nop
nop nop
99
nop nop
nop nop
nop nop
Planificación del compilador Replicación de código
lazo:
ld addd sd subi bnez
f0, 0(r1) f4, f0, f2 f4, 0(r1) r1, r1, #8 r1, lazo
lazo:
ld addd sd
f0, 0(r1) f4, f0, f2 f4, 0(r1)
ld addd sd
f0, 0(r1-8) f8, f6, f2 f4, 0(r1-8)
ld addd sd
f0, 0(r1-16) f12, f10, f2 f4, 0(r1-16)
ld addd sd
f0, 0(r1-24) f16, f14, f2 f4, 0(r1-24)
ld addd sd
f0, 0(r1-32) f20, f18, f2 f4, 0(r1-32)
subi bnez
r1, r1, #8 r1, lazo
Planificación del compilador Código VLIW optimizado del programa Instr. Instr.
load/store load/store&&saltos saltos
ALU ALUFX FX
ALU ALUFP FP
11 22
ldldf0, f0,0(r1) 0(r1) ldldf0, f0,0(r1-8) 0(r1-8)
nop nop nop nop
nop nop nop nop
33 44
ldldf0, f0,0(r1-16) 0(r1-16) ldldf0, f0,0(r1-24) 0(r1-24)
nop nop nop nop
addd adddf4, f4,f0, f0,f2 f2 addd adddf8, f8,f6, f6,f2 f2
55 66
ldldf0, f0,0(r1-32) 0(r1-32) sd sdf0, f0,0(r1) 0(r1)
nop nop nop nop
addd adddf12, f12,f10, f10,f2 f2 addd adddf16, f16,f14, f14,f2 f2
77 88
sd sdf0, f0,0(r1-8) 0(r1-8) sd sdf0, f0,0(r1-16) 0(r1-16)
nop nop nop nop
addd adddf20, f20,f18, f18,f2 f2 nop nop
99 10 10
sd sdf0, f0,0(r1-24) 0(r1-24) sd sdf0, f0,0(r1-32) 0(r1-32)
nop nop subi subir1, r1,r1, r1,#8 #8
nop nop nop nop
11 11 12 12
nop nop bnez bnezr1, r1,lazo lazo
nop nop nop nop
nop nop nop nop
13 13
nop nop
nop nop
nop nop
Instrucciones predicadas Ante una bifurcación el compilador asigna a las instrucciones de las dos ramas posibles un predicado a cada una. De esta manera es posible identificar la rama inválida cuando se resuelve la condición del branch Las instrucciones de ambas ramas pueden ejecutarse en paralelo ya que no poseen interdependencias
inst inst11 inst inst22 ifif(cond) (cond) inst inst44 inst inst55 inst inst66 else else inst inst77 inst inst88 inst inst99 Código fuente
sigue: sigue:
inst inst11 inst inst22 br br(cond), (cond),sigue sigue P1 P1: :inst inst44 P1 P1::inst inst55 P1 P1::inst inst66 ….. ….. P2 P2::inst inst77 P2 P2::inst inst88 P2 P2::inst inst99
Código ensamblador
inst inst11
inst inst22
branch branch
P1:inst P1:inst44 P2:inst P2:inst77 P1:inst P1:inst55 P1:inst P1:inst66 P2:inst P2:inst88 P2:inst P2:inst99 Código VLIW predicado
Instrucciones predicadas Ejemplo: ifif(a (a