introducción a cómputo paralelo con cuda...
TRANSCRIPT
![Page 1: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/1.jpg)
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICOFacultad de Ingeniería
Introducción a Cómputo Paralelo con CUDA C/C++
Laboratorio de Intel para la Academia y Cómputo de alto desempeño
Elaboran: Ariel Ulloa TrejoJaime Beltrán Rosales
Revisión: Ing. Laura Sandoval Montaño
![Page 2: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/2.jpg)
Temario
1. Antecedentes
2. El GPU
3. Modelo de programación CUDA
4. Manejo de matrices
5. Memoria compartida
Ariel Ulloa Trejo Jaime Beltrán Rosales
![Page 3: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/3.jpg)
4 Manejo de Matrices
Manejo de Errores
• Vimos que las funcionespasadas regresan un valorcudaError_t.
• Éste es usado para detectarerrores; si la ejecución fueexitosa, regresa un valorcudaSucces. En otro caso,será el código del error.
• Para poder leer los códigosde los errores, usamoscudaGetErrorString().
• cudaGetLastError() envía elúltimo error. Si hubo unoantes de éste, no esreportado.
Ariel Ulloa Trejo Jaime Beltrán Rosales
![Page 4: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/4.jpg)
• Como los kernels sonasíncronos, es necesariobloquear la ejecución hastaque el dispositivo hayaterminado su trabajo. Paraesto utilizamos la funcióncudaDeviceSynchronice().
Errores comunes:
• Utilizar variables en unsegmento de código dondeno existen.
• La configuración deejecución es inválida.
• Copiar memoria mayor a laalojada.
• El origen y destino de lacopia está mal.
Ariel Ulloa Trejo Jaime Beltrán Rosales
4 Manejo de Matrices
![Page 5: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/5.jpg)
• Utilizar la biblioteca Error.h y generar y detectar errores en elcódigo ejemplo.
Ejemplo
05_errores_01.cu
Ariel Ulloa Trejo Jaime Beltrán Rosales
4 Manejo de Matrices
![Page 6: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/6.jpg)
Más de grids, bloques e hilos:
• CUDA permite la ejecuciónde grids compuestos porbloques hasta de 3dimensiones, y a su vez,cada bloque compuesto porhilos en 3D.
• Para hacerlo, utilizamosdim3 (para encapsular datosmultidimensionales).
Ariel Ulloa Trejo Jaime Beltrán Rosales
4 Manejo de Matrices
![Page 7: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/7.jpg)
• Kernel<<<dim3(Ax, Ay, Az), dim3(Bx,By,Bz)>>>()
• Kernel<<<dim3(10, 32), dim3(10, 10)>>>()
• En caso de que una dimensión no sea especificada, es reemplazada automáticamente por 1.
Ariel Ulloa Trejo Jaime Beltrán Rosales
4 Manejo de Matrices
![Page 8: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/8.jpg)
• Programa que suma dos matrices cuadradas.
Ejemplo
Ariel Ulloa Trejo Jaime Beltrán Rosales
4 Manejo de Matrices
![Page 9: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/9.jpg)
Ejercicio:• Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento el
primero de cada bloque. Utilizar la configuración: dim3 bloques(2, 2) dim3 hilos(3, 3)
Ariel Ulloa Trejo Jaime Beltrán Rosales
4 Manejo de Matrices
![Page 10: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/10.jpg)
• Solución: Para asignar los índices de cada elemento de la matriz a loshilos:
int bx = blockIdx.x;
int by = blockidx.y;
int tx = threadIdx.x;
int ty = threadIdx.y;
int dy = blockDim.y;
int dx = blockDim.x;
d_a[ (by * dy + ty) * gridDim.x * blockDim.x + (bx * dx + tx) ];
06_matrices_01.cuAriel Ulloa Trejo
Jaime Beltrán Rosales
3 6 3
![Page 11: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/11.jpg)
• Medir tiempos en el GPU
• Para medir los tiempos que toman las actividades en el GPU, se utilizan los siguientes métodos:
• cudaEventCreate() Crea las variables
• cudaEventRecord() Realiza el inicio y parada
• cudaEventDestroy() Libera variables
• cudaEventElapsedTime() Obtiene dif. de tiempos
Ariel Ulloa Trejo Jaime Beltrán Rosales
4 Manejo de Matrices
GpuTimer.h
![Page 12: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/12.jpg)
• Hacer un programa genérico que sume dos matricescuadradas. Utilizar manejo de errores y medir tiempo condiferentes configuraciones de ejecución
Ejercicio
Ariel Ulloa Trejo Jaime Beltrán Rosales
![Page 13: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/13.jpg)
• Hacer un programa genérico que sume dos matricescuadradas. Utilizar manejo de errores y medir tiempo condiferentes configuraciones de ejecución
Ejercicio
Ariel Ulloa Trejo Jaime Beltrán Rosales
![Page 14: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/14.jpg)
• Hacer un programa genérico que sume dos matricescuadradas. Utilizar manejo de errores y medir tiempo condiferentes configuraciones de ejecución
Ejercicio
Ariel Ulloa Trejo Jaime Beltrán Rosales
![Page 15: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/15.jpg)
• Hacer un programa genérico que sume dos matricescuadradas. Utilizar manejo de errores y medir tiempo condiferentes configuraciones de ejecución
Ejercicio
Ariel Ulloa Trejo Jaime Beltrán Rosales
![Page 16: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/16.jpg)
• Hacer un programa genérico que sume dos matricescuadradas. Utilizar manejo de errores y medir tiempo condiferentes configuraciones de ejecución
Ejercicio
Ariel Ulloa Trejo Jaime Beltrán Rosales
![Page 17: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/17.jpg)
• Hacer un programa genérico que sume dos matricescuadradas. Utilizar manejo de errores y medir tiempo condiferentes configuraciones de ejecución
Ejercicio
Ariel Ulloa Trejo Jaime Beltrán Rosales
![Page 18: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/18.jpg)
• Hacer un programa genérico que sume dos matricescuadradas. Utilizar manejo de errores y medir tiempo condiferentes configuraciones de ejecución
Ejercicio
Ariel Ulloa Trejo Jaime Beltrán Rosales
![Page 19: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/19.jpg)
• Hacer un programa genérico que sume dos matricescuadradas. Utilizar manejo de errores y medir tiempo condiferentes configuraciones de ejecución
Ejercicio
Ariel Ulloa Trejo Jaime Beltrán Rosales
![Page 20: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/20.jpg)
• Hacer un programa genérico que sume dos matricescuadradas. Utilizar manejo de errores y medir tiempo condiferentes configuraciones de ejecución
Ejercicio
Ariel Ulloa Trejo Jaime Beltrán Rosales
![Page 21: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/21.jpg)
• Programa que transpone matrices pequeñas
Ejemplo
Ariel Ulloa Trejo Jaime Beltrán Rosales
4 Manejo de Matrices
![Page 22: Introducción a Cómputo Paralelo con CUDA C/C++lcomp89.fi-b.unam.mx/licad/assets/CUDA2o/04_Manejo... · 2015-01-28 · • Dividir una matriz de 6x6 en 4 bloques y sumar a cada elemento](https://reader030.vdocuments.net/reader030/viewer/2022020414/5bcc50fe09d3f2f14c8b5278/html5/thumbnails/22.jpg)
• Hacer un programa genérico que realice la transpuesta deuna matriz. Utilizar manejo de errores y medir tiempo condiferentes configuraciones de ejecución
Ejercicio
Ariel Ulloa Trejo Jaime Beltrán Rosales
4 Manejo de Matrices