Está en la página 1de 38

ARQUITECTURAS

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

 SIMD es mas eficiente que MIMD en consumo de


energía
 Solo necesita una instrucción por operación de datos
 Atractivo para dispositivos móviles personales

 SIMD permite que los programadores sigan


pensando secuencialmente
2
SIMD Variantes
 Arquitecturas vectoriales
 Extensiones SIMD
 MMX: Multimedia Extensions (1996)
 SSE: Streaming SIMD Extensions
 AVX: Advanced Vector Extension (2010)
 Graphics Processor Units (GPUs)

3
SIMD vs MIMD
 Para CPUs x86:
 Prever dos núcleos
adicionales por chip
anualmente

 Doble de ancho SIMD


cada 4 años

 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

 Requiere 6 instrucciones vs casi 600 en MIPS

 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

 Independencia de elementos dentro de una instrucción


vectorial
 Permite escalar unidades funcionales sin controles de dependencia
costosos

 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

 Las unidades funcionales VMIPS consumen un elemento


por ciclo de reloj
 El tiempo de ejecución es aproximadamente igual a la longitud del
vector

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

 Con chaining, se puede iniciar la instrucción dependiente


tan pronto cono el primer resultado aparezca

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

 3 chimes, 2 FP ops por resultado, ciclos por FLOP = 1.5


 Para vectores de 64 elementos: 64 x 3 = 192 ciclos de reloj

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]

C[2] C[8] C[9] C[10] C[11]


C[1] C[4] C[5] C[6] C[7]

C[0] C[0] C[1] C[2] C[3]


Múltiples carriles
 El elemento n del vector A esta “cableado” al elemento n del vector B
 Pequeño incremento en sobrecarga de control
 Permite multiples carriles hardware
 No hay comunicación entre carriles
 No se debe cambiar el código de máquina

 Agregar mas carriles permite


compensar la tasa de reloj y energia
sin sacrificar rendimiento 18
Múltiples carriles

 Para un uso efectivo


 Las aplicaciones y la arquitectura
deben soportar vectores largos
 De otro modo, se ejecutarán
rápidamente y se quedarán sin
instrucciones requiriendo ILP

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];

 Use registro de mascara de vector para deshabilitar


elementos:
LV V1,Rx ;load vector X into V1
LV V2,Ry ;load vector Y
L.D F0,#0 ;load FP zero into F0
SNEVS.D V1,F0 ;sets VM(i) to 1 if V1(i)!=F0
SUBVV.D V1,V1,V2 ;subtract under vector mask
SV Rx,V1 ;store the result in X

 La tasa GFLOPS decrece! 23


Vector Mask Register
 VMR es parte del estado arquitectónico

 Apoyarse en los compiladores para manipular el VMR


explícitamente

 Los GPUs consiguen el mismo resultado utilizando


hardware
 Invisible al software

 Tanto las arquitecturas GPU como vectoriales pierden


tiempo en enmascaramiento

24
Bancos de memoria
 El sistema de memoria debe diseñarse para soportar
ancho de banda alto para carga y almacenamiento de
vectores

 Distribuir acceso en múltiples bancos


 Controlar direcciones de banco independientemente
 Cargar/almacenar palabras no secuenciales
 Soportar múltiples procesadores vectoriales compartiendo la misma
memoria

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];
}

 Debemos vectorizar la multiplicación de las filas de B con


las columnas de D
 Se necesita acceder a elementos adyascentes de B y D
 Elementos de B almacenados en orden row-major, pero los
elementos de D estan almacenados en orden column-major

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];
}

 Asumiendo que cada entrada es DWORD, la distancia entre D[0][0] y


D[1][0] es : 800 bytes
 Una vez cargado el vector al registro, este actúa como si tuviese
elementos lógicamente adyascentes
 Use non-unit stride para D! ( B usa unit stride)
 Capacidad de acceder direcciones no secuenciales y transformarlas a una
estructura densa!
 Use LVWS/SVWS: carga/almacena vector con instrucción de stride
 Stride se almacena en un RPG (dinámico)

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];
}

 Con non-unit stride, es posible solicitar accesos del mismo


banco con frecuencia
 Cuando múltiples accesos compten por el mismo banco de
memoria:
 Conflicto por banco de memoria
 Detener un acceso
 Un conflicto por banco ocurre cuando el mismo banco es referido
más rápido que el busy time del banco
29
Problema del stride
 ejemplo:
 8 bancos de memoria, busy time de banco igual a 6 ciclos, latencia
total de memoria 12 ciclos (costo de arranque, iniciación)
 ¿Cuál es la diferencia enre un vector de 64 elementos con un stride
de 1 y 32?

 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)

 Considere la suma de un vector sparse


en arreglos A y C

for (i = 0; i < n; i=i+1)


A[K[i]] = A[K[i]] + C[M[i]];

 Donde K y M son vectores índice para


designar los elementos no cero de A y C

 Se utiliza operaciones Gather-scatter

31
Scatter Gather
for (i = 0; i < n; i=i+1)
A[K[i]] = A[K[i]] + C[M[i]];

 LVI/SVI: load/store vector indexed/gather


 Use index vector:
LV Vk, Rk ;load K
LVI Va, (Ra+Vk) ;load A[K[]]
LV Vm, Rm ;load M
LVI Vc, (Rc+Vm) ;load C[M[]]
ADDVV.D Va, Va, Vc ;add them
SVI (Ra+Vk), Va ;store A[K[]]

 A y C deben tener el mismo número de elementos no cero


(tamaño de K y M)

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

También podría gustarte