![Page 1: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/1.jpg)
Computación en procesadores gráficos
Portada
Programación con CUDAEjercicio 8
Computación en procesadores gráficos
Universidad de Almería
José Antonio Martínez GarcíaFrancisco M. Vázquez López
Manuel Ujaldón MartínezEster Martín Garzón
![Page 2: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/2.jpg)
Computación en procesadores gráficos2
Contenidos
Arquitectura de las GPUs
Modelo de programación SIMT
Claves computacionales para la programación de GPUs
Programación con CUDA: Ejercicio 8
Supercomputación gráfica y arquitecturas emergentes
![Page 3: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/3.jpg)
Computación en procesadores gráficos3
Programación con CUDA
Ejercicio 8Producto matriz densa por vector: u = A vDimensiones A: N x M, u: N, v: MInicializar A y v aleatoriamente
• Con <stdlib.h>:• srand48(time(NULL)) para establecer semilla• drand48() genera un float [0, 1)
Realizar código secuencial para comprobar que el kernel es correcto, comprobar con una matriz p.ej 5 x 5Una vez comprobado, comprobar que la suma de los elementos del vector obtenido mediante la CPU es el mismo valor que se obtiene con la GPUParámetros de entrada del programa:
• N: Número de filas• M: Número de columnas• BLOCKSIZE: Tamaño del bloque 1-D• Verbose: Salida por pantalla si es 1• Iterations: Iteraciones del kernel
![Page 4: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/4.jpg)
Computación en procesadores gráficos4
Programación con CUDA
Ejercicio 8 : Código secuencial
for (i = 0; i < N; i++) {u[ i ]=0;for (j = 0; j < M; j++)
u[ i ]+=A[ i*M+ j ] * v[ j ];}
![Page 5: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/5.jpg)
Computación en procesadores gráficos5
Programación con CUDA
Medir tiempos para:
• Transferencia CPU->GPU
• Ejecución del kernel
• Transferencia GPU->CPU, recordar si es necesario usar puntos de sincronización
Calcular ocupación y bandwidthObtener la tabla de tiempos usando los dos mejores valores de BLOCKSIZE y para A=1000x2000, 2000x1000, 2000x5000 y 5000x5000
Preguntas:• ¿ Para qué estructuras (u, A, v) se realiza un acceso coalescente a memoria ?
• Comentar topología de bloques/threads usada:
– ¿ Cuantos threads calculan una fila ?– ¿ Se podría usar más de 1 thread por fila ?. Ventajas/Inconvenientes
• Precisión en los resultados. ¿ Hay diferencias ?, ¿ Por qué ?
![Page 6: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/6.jpg)
Computación en procesadores gráficos6
Programación con CUDA
Mejoras a realizar :• Usar la caché de texturas para almacenar el vector v• Almacenar la matriz por columnas ¿ Qué se gana con esta
optimización ?• Usar la memoria shared para realizar productos parciales
de cada fila y usar más threads por fila• ¿ Se te ocurre alguna optimización sobre la actualización
de cada valor de u ?Repetir el estudio de tiempos realizado para las optimizaciones planteadas y comparar con la versión inicialObtener los ratios más importantes de cuda visual profiler
![Page 7: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/7.jpg)
Computación en procesadores gráficos7
Programación con CUDA
Ejercicio 8: Cuda Occupancy Calculatornvcc mv.cu –o mv -Xptxas=-v 8 Registros + 48 bytes shared memory
100 %67 %512
100 %100 %256
100 %100 %128
50 %67 %64
25 %33 %32
25 %33 %16
GTX 2859500 GT
![Page 8: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/8.jpg)
Computación en procesadores gráficos8
Programación con CUDA
Ejercicio 8 : Resultados para 9500 GTIterations = 100, BLOCKSIZE = 128
0,630000
0,000095
2,540294
0,001619
1000x2000
0,813500
0,000030
1,967700
0,001681
2000x1000
0,5700000,567400Bandwith
0,0004380,000035GPU-CPU
35,09171014,099960Kernel
0,0181580,007593CPU-GPU
5000x50002000x5000N x M/sec
![Page 9: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/9.jpg)
Computación en procesadores gráficos9
Programación con CUDA
Ejercicio 8 : Resultados para 9500 GTIterations = 100, BLOCKSIZE = 256
0,623900
0,000027
2,565286
0,001607
1000x2000
0,813600
0,000030
1,967527
0,001602
2000x1000
0,5674000,566700Bandwith
0,0007520,000032GPU-CPU
35,25447814,118784Kernel
0,0179250,007318CPU-GPU
5000x50002000x5000N x M/sec
![Page 10: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/10.jpg)
Computación en procesadores gráficos10
Programación con CUDA
Ejercicio 8Preguntas:
• ¿ Por qué se obtiene mejor rendimiento para2000x1000 que para 1000x2000 ?
• ¿ Por qué el bandwidth es extremadamente bajo ?
![Page 11: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/11.jpg)
Computación en procesadores gráficos11
Programación con CUDA
Ejercicio 8 : Resultados para 9500 GT usando caché de texturasIterations = 100, BLOCKSIZE = 128
1,001300
0,000023
1,598312
0,001724
1000x2000
1,657400
0,000027
0,965838
0,001645
2000x1000
0,8718000,871800Bandwith
0,0004070,000029GPU-CPU
22,9422749,177806Kernel
0,0181240,007338CPU-GPU
5000x50002000x5000N x M/sec
![Page 12: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/12.jpg)
Computación en procesadores gráficos12
Programación con CUDA
Ejercicio 8 : Resultados para 9500 GT usando caché de texturasIterations = 100, BLOCKSIZE = 256
1,002100
0,000021
1,596967
0,001675
1000x2000
1,653000
0,000405
0,968404
0,001604
2000x1000
0,8718000,871800Bandwith
0,0000350,000027GPU-CPU
22,9432229,177196Kernel
0,0183150,007431CPU-GPU
5000x50002000x5000N x M/sec
![Page 13: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/13.jpg)
Computación en procesadores gráficos13
Programación con CUDA
Ejercicio 8 : Resultados para 9500 GT usando caché de texturas y almacenamiento por columnasIterations = 100, BLOCKSIZE = 128
2,170500
0,000020
0,368768
0,001627
1000x2000
9,548000
0,000021
0,083871
0,001607
2000x1000
2,1791009,682800Bandwith
0,0004080,000470GPU-CPU
4,5899410,413185Kernel
0,0181800,007414CPU-GPU
5000x50002000x5000N x M/sec
![Page 14: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/14.jpg)
Computación en procesadores gráficos14
Programación con CUDA
Ejercicio 8 : Resultados para 9500 GT usando caché de texturas y almacenamiento por columnasIterations = 100, BLOCKSIZE = 256
2,173000
0,000020
0,368343
0,001622
1000x2000
9,557900
0,000021
0,083784
0,001661
2000x1000
2,1788009,683300Bandwith
0,0000400,000022GPU-CPU
4,5906780,413164Kernel
0,0182240,007400CPU-GPU
5000x50002000x5000N x M/sec
![Page 15: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/15.jpg)
Computación en procesadores gráficos15
Programación con CUDA
Optimización : caché de texturas, almacenamiento por columnas, y 4 threads por filaReserva dinámica de memoria sharedCódigo host :
int smemsize = BLOCKSIZE * sizeof(float);
kernel<<<gridsize, blocksize, smemsize>>>(…);
![Page 16: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/16.jpg)
Computación en procesadores gráficos16
Programación con CUDA
Código device :
template <typename T>struct SharedMemory{ __device__ T*getPointer(){extern __device__ void error(void);error();return NULL; } };
template <>struct SharedMemory<float>{ __device__ float* getPointer(){ extern __shared__ float s_float[];return s_float; } };
![Page 17: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/17.jpg)
Computación en procesadores gráficos17
Programación con CUDA
Declaración kernel :
SharedMemory<float> smem;
float *sdata = smem.getPointer();
![Page 18: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/18.jpg)
Computación en procesadores gráficos18
Programación con CUDA
Ejercicio 8: Cuda Occupancy Calculatornvcc mv.cu –o mv -Xptxas=-v 8 Registros + smem: 64 bytes estática + dinámica (blocksize*4)
2112 bytes
1088 bytes
576 bytes
320 bytes
192 bytes
128 bytes
Sharedmemory
100 %67 %512
100 %100 %256
100 %100 %128
50 %67 %64
25 %33 %32
25 %33 %16
GTX 2859500 GT
![Page 19: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/19.jpg)
Computación en procesadores gráficos19
Programación con CUDA
Ejercicio 8 : 9500 GT: caché de texturas, almacenamiento por columnas y 4 threads por filaIterations = 100, BLOCKSIZE = 128
8,71720
0,000019
0,091818
0,001632
1000x2000
9,611500
0,000020
0,082910
0,001632
2000x1000
9,8911009,820400Bandwith
0,0000270,000021GPU-CPU
1,0112140,407398Kernel
0,0182920,007441CPU-GPU
5000x50002000x5000N x M/sec
![Page 20: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/20.jpg)
Computación en procesadores gráficos20
Programación con CUDA
Ejercicio 8 : 9500 GT: caché de texturas, almacenamiento por columnas y 4 threads por filaIterations = 100, BLOCKSIZE = 256
8,743800
0,000020
0,091539
0,001633
1000x2000
9,654200
0,000020
0,082948
0,001609
2000x1000
9,8882009,820100Bandwith
0,0000280,000022GPU-CPU
1,0115070,407411Kernel
0,0180030,007577CPU-GPU
5000x50002000x5000N x M/sec
![Page 21: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/21.jpg)
Computación en procesadores gráficos21
Programación con CUDA
Ejercicio 8 : Cuda Visual ProfilerIterations = 100, BLOCKSIZE = 256, 2000x5000
48
1
1
256
1
8
1
91790
91768
caché
48
1
1
256
1
8
1
4170
4146
col+cach4086141344gputime
48
1
1
256
1
8
1
141362
1ª versión
4109cputime
32gridSizeX
1gridSizeY
256blockSizeX
1blockSizeY
64
1
1
4 T
StaSmemperblock
blockSizeZ
occupancy
![Page 22: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/22.jpg)
Computación en procesadores gráficos22
Programación con CUDA
Ejercicio 8 : Cuda Visual ProfilerIterations = 100, BLOCKSIZE = 256, 2000x5000
4
0
800404
2
80098
2
6
caché
4
0
640388
2
80098
2
7
col+cach
16
0
642759
72
80648
8
10
4 T8Registersperthread
4
0
640507
2
80130
2
1ª versión
Sm_cta_launched
divergentbranch
instructions
warp_serialize
cta_launched
branch
![Page 23: Computación en procesadores gráficosfvazquez/fp-content/attachs/CursoGPUs_Ejercicio… · 3 Computación en procesadores gráficos Programación con CUDA Ejercicio 8 Producto matriz](https://reader035.vdocuments.co/reader035/viewer/2022063013/5fcc942e5d0edd0d686a2255/html5/thumbnails/23.jpg)
Computación en procesadores gráficos23
Contraportada