Documentos de Académico
Documentos de Profesional
Documentos de Cultura
SIMD
1
Introducción
SIMD puede explotar el paralelismo a nivel de
datos para:
Computación científica: procesamiento de arreglos
Procesadores de imagen y sonido: multimedia
3
SIMD vs MIMD
Para CPUs x86:
Prever dos núcleos
adicionales por chip
anualmente
Aceleración potencial de
SIMD dos veces mas que
MIMD
4
Arquitecturas vectoriales
Idea básica:
Leer conjuntos de datos a “vectores de registros”
Operar en dichos registros
Devolver los resultados a memoria
Los registros son controlados por el compilador
registros actúan como buffers controlados por el compilador
Se usan para ocultar la latencia de memoria
Incrementa el ancho de banda de memoria
Carga/almacenamiento de vectores segmentado
Costo de latencia de memoria: 1 vez por vector
Carga/almacenamiento convencional
Costo de latencia de memoria por elemento del vector
5
Ejemplo: VMIPS
Registros vectoriales
Cada registro guarda un vector de 64
elementos de 64 bits
El banco de registros tiene 16 puertos de
lectura y 8 puertos de escritura
Unidades funcionales vectoriales
Totalmente segmentadas
Detectan de riesgos de datos y control
Unidad de carga/almacenamiento vectorial
Totalmente segmentada
Una palabra por ciclo de reloj despues de
latencia inicial
Registros escalares
32 RPG
32 registros de punto flotante
6
VMIPS: instrucciones
7
VMIPS Instructions
Example: DAXPY
L.D F0,a ;load scalar a
LV V1,Rx ;load vector X
MULVS.D V2,V1,F0 ;vector-scalar mult
LV V3,Ry ;load vector Y
ADDVV V4,V2,V3 ;add
SV Ry,V4 ;store result
En VMIPS
Una detención por el primer elemento del vector. Los elementos
subsecuentes deben fluir suavemente por el cauce.
Se requiere una detención del cauce por instrucción vectorial
8
Instrucciones VMIPS
Opera en varios elementos concurrentemente
Permite usar unidades de ejecución lentas pero anchas
Alto rendimiento, poca potencia
Flexible
64 64-bit / 128 32-bit / 256 16-bit, 512 8-bit
Cumple con necesidades de multimedia (8 bits) y aplicaciones
cientificas que requieren gran precisión
9
Tiempo de ejecución vectorial
El tiempo de ejecución depende de 3 factores:
Longitud de vectores operandos
Riesgos estructurales
Dependencia de datos
10
Convoy
Conjunto de instrucciones vectoriales que pueden
ejecutarse juntos
No deben tener riesgos estructurales
Secuencias con riesgos de dependencia RAW deben estar
en convoy diferentes
Sin embargo pueden estar en el mismo convoy via chaining
11
Vector Chaining
Versión vectorial de bypassing de registros
Chaining
Permite que una operación vectorial comience tan pronto como los elementos
individuales de su operando fuente vectorial esten disponibles
Los resultados de la primera unidad funcional se adelantan a la segunda unidad
V V V V V
1 2 3 4 5
Chain Chain
LV v1
MULV v3,v1,v2 Load
ADDV v5, v3, v4 Unit
Mult. Add
Memory
Ventaja de Vector Chaining
Sin chaining, se debe esperar a que el último elemento del
resultado se escriba antes de iniciar la instrucción
dependiente
Load
Mul
Time Add
Load
Mul
Add
Convoy y Chimes
Chime
Unidad de tiempo para ejecutar un convoy
m convoys se ejecutan en m chimes
Para un vector de longitud n, se requiere m x n ciclos de reloj
14
Ejemplo
LV V1,Rx ;load vector X
MULVS.D V2,V1,F0 ;vector-scalar mult
LV V3,Ry ;load vector Y
ADDVV.D V4,V2,V3 ;add two vectors
SV Ry,V4 ;store the sum
Convoys:
1 LV MULVS.D
2 LV ADDVV.D
3 SV
15
Retos
Tiempo de arranque
Latencia de la unidad funcional vectorial
Similar a Cray-1
Suma en punto flotante => 6 ciclos de reloj
Multiplicación en punto flotante => 7 ciclos de reloj
División en punto flotante => 20 ciclos de reloj
Carga de vector => 12 ciclos de reloj
16
EJECUCION DE INSTRUCCIONES VECTORIALES
ADDV C,A,B
Ejecución en 4 carriles
Ejecución en una
de 4 unidades
unidad funcional
funcionales
segmentada
segmentadas
A[6] B[6] A[24] B[24] A[25] B[25] A[26] B[26] A[27] B[27]
A[5] B[5] A[20] B[20] A[21] B[21] A[22] B[22] A[23] B[23]
A[4] B[4] A[16] B[16] A[17] B[17] A[18] B[18] A[19] B[19]
A[3] B[3] A[12] B[12] A[13] B[13] A[14] B[14] A[15] B[15]
19
Vectorización automatica de codigo
for (i=0; i < N; i++)
C[i] = A[i] + B[i];
Código secuencial escalar
Código vectorizado
load
load load
Iter. 1 load
Tiempo
load load
add
add add
store store store
load Ite Ite
load r. 1 r. 2 Vector Instruction
Iter. 2
Vectorización: reordenamiento masivo en tiempo de
add compilación del secuenciamiento de operaciones.
Requiere analisis extensivo de dependencias de
store bucles
20
Vector Length Register
La longitud del vector no se conoce en tiempo de
compilación?
Usar Vector Length Register (VLR)
Usar strip mining para vectores mayores a la longitud
máxima:
low = 0;
VL = (n % MVL); /*find odd-size piece using modulo op % */
for (j = 0; j <= (n/MVL); j=j+1) { /*outer loop*/
for (i = low; i < (low+VL); i=i+1) /*runs for length VL*/
Y[i] = a * X[i] + Y[i] ; /*main operation*/
low = low + VL; /*start of next vector*/
VL = MVL; /*reset the length to maximum vector length*/
}
21
Longitud máxima de vector
Ventaja:
Determina el número máximo de elementos en un vector para una
arquitectura determinada
Generaciones posteriores pueden incrementar MVL (Maximum
Vector Lenght
No se necesita cambiar ISA
22
Vector Mask Register
Considere:
for (i = 0; i < 64; i=i+1)
if (X[i] != 0)
X[i] = X[i] – Y[i];
24
Bancos de memoria
El sistema de memoria debe diseñarse para soportar
ancho de banda alto para carga y almacenamiento de
vectores
25
Bancos de memoria
Ejemplo:
El computador Cray T90 tiene 32 procesadores y cada uno de ellos
genera 4 cargas y 2 almacenamientos por ciclo.
El ciclo del procesador es de 2.167 ns y el ciclo de la SRAM es de
15 ns
¿Cuantos bancos de memoria se necesitan?
Solución
En cada ciclo se generan 32x6 = 192 referencias a memoria
Caba banco de SRAM esta ocupado por 15/2.167 = 6.92 ciclos de
reloj (~7 ciclos de CPU)
Entonces se requiere 192 x 7 = 1344 bancos de memoria
26
Stride: Arreglos multidimensionales
Considere:
for (i = 0; i < 100; i=i+1)
for (j = 0; j < 100; j=j+1) {
A[i][j] = 0.0;
for (k = 0; k < 100; k=k+1)
A[i][j] = A[i][j] + B[i][k] * D[k][j];
}
27
Stride: Arreglos multidimensionales
for (i = 0; i < 100; i=i+1)
for (j = 0; j < 100; j=j+1) {
A[i][j] = 0.0;
for (k = 0; k < 100; k=k+1)
A[i][j] = A[i][j] + B[i][k] * D[k][j];
}
28
Problema del stride
for (i = 0; i < 100; i=i+1)
for (j = 0; j < 100; j=j+1) {
A[i][j] = 0.0;
for (k = 0; k < 100; k=k+1)
A[i][j] = A[i][j] + B[i][k] * D[k][j];
}
Solución
Para un stride de 1 la carga tomará 12+64=76 ciclos de reloj
El peor stride posible es un valor que es múltiplo del número de
bancos de memoria, como en este caso con un stride de 32 y 8
bancos de memoria. Cada acceso a memoria colisionará con el
acceso previo y tendrá que esperar por busy time de 6 ciclos del
banco. El tiempo total sera 12+1+6*63 = 391 ciclos de reloj, o 6.1
ciclos de reloj por elemento
30
Scatter-Gather
Mecanismo de direccionamiento de
elementos que permite acceder a los
mismos independientemente de su
posicion real en memoria
(direccionamiento indirecto)
31
Scatter Gather
for (i = 0; i < n; i=i+1)
A[K[i]] = A[K[i]] + C[M[i]];
32
Extensiones SIMD
Las aplicaciones multimedia operan con datos mas
pequeños que la palabra nativa
Los sistemas gráficos usan 8 bits por color primario
Las muestras de audio usan 8-16 bits
Sumador de 256-bit
16 operaciones simultáneas de 16 bits
32 operaciones simultáneas de 8 bits
33
SIMD vs. Vector
Las extensiones Multimedia SIMD fijan el número de
operandos en el opcode
Las arquitecturas vectoriales tiene un VLR para especificar el
número de oprandos
Extensiones SIMD Multimedia : modos de direccionamiento
no sofisticados (strided, scatter-gather)
No tienen registros máscara
Estas caracteristicas
Permiten al compilador vectorial vectorizar un gran conjunto de
aplicaciones
Hacen dificil para el comilador generar código SIMD y hacen de la
programación en ensamblador muy dificil
34
SIMD
Implementaciones:
Intel MMX (1996)
Reconvertir registros de punto flotante de 64 bits
Ocho registros de enteros de 8 bits o cuatro registros de 16 bits
Streaming SIMD Extensions (SSE) (1999)
Registros separados de 128 bits
Ocho operandos de 16 bits, cuatro de 32 bits o dos de 64 bits
Aritmética de punto flotante de precisión simple
Punto flotante de doble precisión en
SSE2 (2001), SSE3(2004), SSE4(2007)
Advanced Vector Extensions (2010)
Cuatro operandos enteros/punto flotante de 64 bits
Los operandos deben ser consecutivos y tener posiciones de
memoria alineados
35
SIMD
implementaciones:
Advanced Vector Extensions (2010)
Duplica el ancho a 256 bits
Cuatro operandos e/pf de 64 bits
Extendible a 512 y 1024 bits en generaciones futuras
Los operandos deben ser consecutivos y estar en ubicaciones alineadas
de memoria
36
SIMD extensions
Porque son populares?
Cuesta poco agregarlos a la ALU estándar
Facil de implementar
Necesita menos ancho de banda de memoria que los vectores
Transferencias de datos separadas alineadas en memoria
Vector: una instrucción, 64 accesos a memoria, posible fallo de página a
la mitad de un vector!
Utiliza espacio de registros más pequeño
No necesita los mecanismos sofisticados de las arquitecturas
vectoriales
37
EjemploSIMD
Example DXPY:
L.D F0,a ;load scalar a
MOV F1, F0 ;copy a into F1 for SIMD MUL
MOV F2, F0 ;copy a into F2 for SIMD MUL
MOV F3, F0 ;copy a into F3 for SIMD MUL
DADDIU R4,Rx,#512 ;last address to load
Loop:
L.4D F4,0[Rx] ;load X[i], X[i+1], X[i+2], X[i+3]
MUL.4D F4,F4,F0 ;a×X[i],a×X[i+1],a×X[i+2],a×X[i+3]
L.4D F8,0[Ry] ;load Y[i], Y[i+1], Y[i+2], Y[i+3]
ADD.4D F8,F8,F4 ;a×X[i]+Y[i], ..., a×X[i+3]+Y[i+3]
S.4D 0[Ry],F8 ;store into Y[i], Y[i+1], Y[i+2],
Y[i+3]
DADDIU Rx,Rx,#32 ;increment index to X
DADDIU Ry,Ry,#32 ;increment index to Y
DSUBU R20,R4,Rx ;compute bound
BNEZ R20,Loop ;check if done
38