Publicado el 31 de Julio del 2017
1.200 visualizaciones desde el 31 de Julio del 2017
962,2 KB
36 paginas
Creado hace 13a (11/05/2011)
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
inst 1 (op1)
inst 1 (op1)
inst 2 (op2)
inst 2 (op2)
inst 3 (op3)
inst 3 (op3)
inst 4 (op4)
inst 4 (op4)
inst 5 (op5)
inst 5 (op5)
inst 6 (op6)
inst 6 (op6)
inst 7 (op7)
inst 7 (op7)
inst 8 (op8)
inst 8 (op8)
inst 9 (op9)
inst 9 (op9)
inst 10 (op10)
inst 10 (op10)
100
101
102
103
104
105
106
107
108
109
100
101
102
103
104
105
106
107
108
109
Procesador
VLIW
operación 8
operación 8
NOPNOP
NOPNOP
NOPNOP
NOPNOP
operación 5
operación 5
operación 3
operación 3
operación 7
operación 7
NOPNOP
operación 10
operación 10
operación 9
operación 9
NOPNOP
NOPNOP
operación 1
operación 1
NOPNOP
NOPNOP
operación 2
operación 2
operación 6
operación 6
operación 4
operación 4
NOPNOP
NOPNOP
NOPNOP
NOPNOP
operación 11 operación 12
operación 12
operación 11
operación 14 operación 16
operación 16
operación 14
operación 13
operación 13
operación 15
operación 15
NOPNOP
una instrucción = una operación
una instrucción = varias operaciones
VLIW vs. Superescalar
Dynamic
Dynamic
scheduler
scheduler
32-64 bits
0
1
2
3
4
5
6
Instruction memory
128-512 bits
0
1
2
3
4
5
6
Instruction memory
Superescalar
VLIW
FX 1
FX 2
FP
load/
store
FX 1
FX 2
FP
load/
store
VLIW vs. Superescalar
Diferente división de tareas entre software (compilador) y hardware (procesador)
programa
programa
Optimización
Optimización
(compilador)
(compilador)
Análisis de
Análisis de
dependencias
dependencias
(compilador)
(compilador)
S
u
p
e
r
e
s
c
a
l
a
r
Análisis de
Análisis de
dependencias
dependencias
(procesador)
(procesador)
Planificación y
Planificación y
reserva de recursos
reserva de recursos
(compilador)
(compilador)
Planificación y
Planificación y
reserva de recursos
reserva de recursos
(procesador)
(procesador)
V
L
I
W
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)
Procesador superescalar
Procesador superescalar
; si r2 = r4+100, hay dependencia!!!
comprueba si la dirección r2 + 100 es igual a r4 + 0
comprueba si la dirección r2 + 100 es igual a r4 + 0
• igual => secuencializa las instrucciones
• igual => secuencializa las instrucciones
• NO igual => paraleliza las instrucciones
• NO igual => paraleliza las instrucciones
Procesador VLIW
Procesador VLIW
No puede determinarlo => el compilador siempre secuencializa
No puede determinarlo => el compilador siempre 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
load
store
nop
nop
adda
nop
sub
nop
nop
Formato de instrucción
VLIW empaquetado
nop
addb
nop
addc
nop
A
nop
mul
nop
nop
nop
B
Formato de instrucción
VLIW desempaquetado
•útil para ejecución
en las UF
C
D
•útil para almacenar
en la memoria
B1
A0
adda
store
A0
B1
load
sub
C0
C1
addb
addc
D1
A1
mul
nop
0 Separador de instrucciones VLIW (1 = última instrucción)
B
Unidad funcional en la que se ejecutará la instrucción
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
• se ocupa mucho especio de cache si las instrucciones están
dispone de tiempo
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
Register
Bank
UF1
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
write1
D
o
u
t
1
A
D
o
u
t
1
B
read1 A
read1 B
write1
read2 A
read2 B
write2
D
o
u
t
1
A
D
o
u
t
1
B
D
o
u
t
2
A
D
o
u
t
2
B
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 de
Banco de
registros
registros
Banco de
Banco de
registros
registros
Banco de
Banco de
registros
registros
Banco de
Banco de
registros
registros
UF1UF1
UF2UF2
UF3UF3
UFnUFn
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
for (i=10; i>0; i--)
x[i] = x[i] + s;
En ensamblador:
lazo:
ld
addd
sd
subi
bnez
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 & saltos
load/store & saltos
2 ciclos de reloj
ALU FX
ALU FX
2 ciclos de reloj
ALU FP
ALU FP
3 ciclos de reloj
Planificación del compilador
Instrucciones VLIW del programa
Instr.
Instr.
load/store & saltos
load/store & saltos
ALU FX
ALU FX
11
22
33
44
55
66
77
88
99
ld f0, 0(r1)
ld f0, 0(r1)
nopnop
nopnop
nopnop
nopnop
nopnop
nopnop
nopnop
nopnop
nopnop
sd f4, 0(r1)
sd f4, 0(r1)
subi r1, r1, #8
subi r1, r1, #8
nopnop
bnez r1, lazo
bnez r1, lazo
nopnop
nopnop
nopnop
nopnop
ALU FP
ALU FP
nopnop
nopnop
addd f4, f0, f2
addd f4, f0, f2
nopnop
nopnop
nopnop
nopnop
nopnop
nopnop
Planificación del compilador
Replicación de código
lazo:
ld
addd
sd
lazo:
ld
addd
sd
subi
bnez
f0, 0(r1)
f4, f0, f2
f4, 0(r1)
r1, r1, #8
r1, lazo
ld
addd
sd
ld
addd
sd
ld
addd
sd
ld
addd
sd
subi
bnez
f0, 0(r1)
f4, f0, f2
f4, 0(r1)
f0, 0(r1-8)
f8, f6, f2
f4, 0(r1-8)
f0, 0(r1-16)
f12, f10, f2
f4, 0(r1-16)
f0, 0(r1-24)
f16, f14, f2
f4, 0(r1-24)
f0, 0(r1-32)
f20, f18, f2
f4, 0(r1-32)
r1, r1, #8
r1, lazo
Planificación del compilador
Código VLIW optimizado del programa
Instr.
Instr.
load/store & saltos
load/store & saltos
ALU FX
ALU FX
ALU FP
ALU FP
11
22
33
44
55
66
77
88
99
1010
1111
1212
1313
ld f0, 0(r1)
ld f0, 0(r1)
ld f0, 0(r1-8)
ld f0, 0(r1-8)
ld f0, 0(r1-16)
ld f0, 0(r1-16)
ld f0, 0(r1-24)
ld f0, 0(r1-24)
ld f0, 0(r1-32)
ld f0, 0(r1-32)
sd f0, 0(r1)
sd f0, 0(r1)
sd f0, 0(r1-8)
sd f0, 0(r1-8)
sd f0, 0(r1-16)
sd f0, 0(r1-16)
sd f0, 0(r1-24)
sd f0, 0(r1-24)
sd f0, 0(r1-32)
sd f0, 0(r1-32)
bnez r1, lazo
bnez r1, lazo
nopnop
nopnop
nopnop
nopnop
nopnop
nopnop
nopnop
nopnop
nopnop
nopnop
nopnop
nopnop
nopnop
nopnop
subi r1, r1, #8
subi r1, r1, #8
addd f4, f0, f2
addd f4, f0, f2
addd f8, f6, f2
addd f8, f6, f2
addd f12, f10, f2
addd f12, f10, f2
addd f16, f14, f2
addd f16, f14, f2
addd f20, f18, f2
addd f20, f18, f2
nopnop
nopnop
nopnop
nopnop
nopnop
nopnop
nopnop
nopnop
Instrucciones predicadas
Ante una bifurcación el compilador asigna a las instrucciones de las dos ramas
posibles un predicado a cada una.
De e
Comentarios de: Paralelismo en monoprocesadores - Procesadores VLIW (0)
No hay comentarios