UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de...

13
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de Ingeniería Introducción a CUDA C Laboratorio de Intel para la Academia y Cómputo de alto desempeño Elaboran: Ariel Ulloa Trejo Fernando Pérez Franco Revisión: Ing. Laura Sandoval Montaño

Transcript of UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de...

Page 1: UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de ...lcomp89.fi-b.unam.mx/licad/assets/CUDA/04_Matrices.pdf · 07_matrices_02.cu 08_matrices_03.cu Ejercicio: Hacer un programa

UNIVERSIDAD NACIONAL AUTÓNOMA DE

MÉXICO

Facultad de IngenieríaIntroducción a CUDA C

Laboratorio de Intel para la Academia y

Cómputo de alto desempeño

Elaboran: Ariel Ulloa TrejoFernando Pérez Franco

Revisión: Ing. Laura Sandoval Montaño

Page 2: UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de ...lcomp89.fi-b.unam.mx/licad/assets/CUDA/04_Matrices.pdf · 07_matrices_02.cu 08_matrices_03.cu Ejercicio: Hacer un programa

Temario

1.Antecedentes2.El GPU3.Funciones y vectores4.Manejo de matrices5.Memoria compartida

Page 3: UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de ...lcomp89.fi-b.unam.mx/licad/assets/CUDA/04_Matrices.pdf · 07_matrices_02.cu 08_matrices_03.cu Ejercicio: Hacer un programa

4 MatricesErrores

Vimos en las funcionespasadas que regresan un valorcudaError_t.Éste es usado para detectarerrores; si la ejecución fueexitosa, regresa uncudaSucces. En otro caso, elcódigo del error seráregresado.

Para poder leer los códigos delos errores, usamoscudaGetErrorString().cudaGetLastError() envía elúltimo error. Si hubo uno antesde éste, no es reportado.

Page 4: UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de ...lcomp89.fi-b.unam.mx/licad/assets/CUDA/04_Matrices.pdf · 07_matrices_02.cu 08_matrices_03.cu Ejercicio: Hacer un programa

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 donde noexisten.La configuración de ejecuciónes inválida.

05_errores_01.cu

Page 5: UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de ...lcomp89.fi-b.unam.mx/licad/assets/CUDA/04_Matrices.pdf · 07_matrices_02.cu 08_matrices_03.cu Ejercicio: Hacer un programa

Más de grids, bloques e hilos:

CUDA permite la ejecución degrids compuestos por bloqueshasta de 3 dimensiones, y a suvez, cada bloque compuestopor hilos en 3d.Para hacerlo, utilizamos dim3(para encapsular datosmultidimensionales).

Page 6: UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de ...lcomp89.fi-b.unam.mx/licad/assets/CUDA/04_Matrices.pdf · 07_matrices_02.cu 08_matrices_03.cu Ejercicio: Hacer un programa

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.

Page 7: UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de ...lcomp89.fi-b.unam.mx/licad/assets/CUDA/04_Matrices.pdf · 07_matrices_02.cu 08_matrices_03.cu Ejercicio: Hacer un programa

Ejemplo:

Una matriz de 6x6 es mapeada en un arreglo de 36 elementos.El objetivo es dividir la matriz en 4 bloques de 3x3 y el kernelsumará a cada elemento el primero de cada bloque. Elresultado se guarda en otra matriz del mismo tamaño.

Consideremos dos datos:

BLOCK_SIZE = 3 (longitud de cadabloque)STRIDE = 6 (longitud de la matrizcompleta)

Page 8: UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de ...lcomp89.fi-b.unam.mx/licad/assets/CUDA/04_Matrices.pdf · 07_matrices_02.cu 08_matrices_03.cu Ejercicio: Hacer un programa

En el dispositivo, cadapequeño bloque serámapeado en un bloque dentrodel grid y para cada operación,existirá un hilo. Por lo tantoexisten tantos hilos comoelementos de la matriz.

La configuración de laejecución será, por lo tanto:

dim3 ThreadsBlocks( 3, 3 );

dim3 GridBlocks( 2 , 2);

Page 9: UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de ...lcomp89.fi-b.unam.mx/licad/assets/CUDA/04_Matrices.pdf · 07_matrices_02.cu 08_matrices_03.cu Ejercicio: Hacer un programa

El truco está en generar losíndices viendo a la memoriacomo un arreglo de 36 en lugarde una matriz de 6x6.

Los índices de los valores a sumar son entonces:

{0, 3, 18, 21}

Page 10: UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de ...lcomp89.fi-b.unam.mx/licad/assets/CUDA/04_Matrices.pdf · 07_matrices_02.cu 08_matrices_03.cu Ejercicio: Hacer un programa

Para asignar los índices de cada elemento de la matriz a los hilos:int bx = blockIdx.x;int by = blockidx.y;Int tx = threadIdx.x;Int ty = threadIdx.y;d_a[ (by * BLOCK_SIZE + ty) * STRIDE + (bx * BLOCKSIZE + tx)

];Para encontrar el elemento que se sumará a cada uno,simplemente cambiamos el índice del hilo a 0:

06_matrices_01.cu

Page 11: UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de ...lcomp89.fi-b.unam.mx/licad/assets/CUDA/04_Matrices.pdf · 07_matrices_02.cu 08_matrices_03.cu Ejercicio: Hacer un programa

Ejemplo: Programa que sumados matrices cuadradas.

07_matrices_02.cu 08_matrices_03.cu

Ejercicio: Hacer un programaque sume dos matricescuadradas de 250x250.

Page 12: UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de ...lcomp89.fi-b.unam.mx/licad/assets/CUDA/04_Matrices.pdf · 07_matrices_02.cu 08_matrices_03.cu Ejercicio: Hacer un programa

Ejemplo: Programa que hace latranspuesta de una matrizpequeña.

Ejercicio: Programa queobtiene la transpuesta de unamatriz grande.

09_matrices_04.cu 10_matrices_05.cu

Page 13: UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de ...lcomp89.fi-b.unam.mx/licad/assets/CUDA/04_Matrices.pdf · 07_matrices_02.cu 08_matrices_03.cu Ejercicio: Hacer un programa