Introducción a Cómputo Paralelo con CUDA...

22
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad 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 Trejo Jaime Beltrán Rosales Revisión: Ing. Laura Sandoval Montaño

Transcript of Introducción a Cómputo Paralelo con CUDA...

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

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

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

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

• 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

• 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

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

• 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

• 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

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

• 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

• 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

• 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

• 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

• 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

• 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

• 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

• 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

• 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

• 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

• 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

• 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

• 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