CUDA C

Anuncio
CUDA C
Clase 2
module load cuda
• Obteniendo las propiedades del Device desde CUDA C
• Funciones en CUDA C
• Manejo de Errores
• Problemas y soluciones
Copiando los códigos
[flavioc@gpgpu-­‐fisica ~]$ ls /share/apps/codigos common ejemplos_thrust SUMA-­‐Vectores Get_device [flavioc@gpgpu-­‐fisica ~]$ cd icnpg2013/ [flavioc@gpgpu-­‐fisica icnpg2013]$ cp -­‐R /share/apps/codigos/Get_device/ . [flavioc@gpgpu-­‐fisica icnpg2013]$ cd Get_device [flavioc@gpgpu-­‐fisica Hola_mundo]$ ls devicequery.cu devicequery.h main.cu Makefile submit_gpuh.sh vector_io.cu vector_io.h !
!
!
!
vector_ops.cu vector_ops.h Get device
devicequery.cu
!
int device_count; int driverVersion = 0, runtimeVersion = 0; cudaGetDeviceCount( &device_count ); // printf("Number of GPUs available : %d\n",device_count); Cuenta el número de devices
!
cudaGetDevice(&card); cudaDeviceProp deviceProp; cudaGetDeviceProperties(&deviceProp, card); cuda_runtime_api.h
!
cudaDeviceProp struct definido en cuda_runtime_api.h
Get/Set device
devicequery.cu
!
int device_count; int driverVersion = 0, runtimeVersion = 0; cudaGetDeviceCount( &device_count ); // printf("Number of GPUs available : %d\n",device_count); Cuenta el número de devices
!
cudaGetDevice(&card); cudaDeviceProp deviceProp; cudaGetDeviceProperties(&deviceProp, card); cuda_runtime_api.h
!
cudaSetDevice(int) Selecciona el Device para correr cudaGetDevice(*int) Obtiene el Device en el que se está corriendo
Trabajo Práctico 1
[flavioc@gpgpu-­‐fisica ~]$ ls /share/apps/codigos/TPs TP1 [flavioc@gpgpu-­‐fisica ~]$ ls /share/apps/codigos/TPs/TP1 g1ej1 g1ej2 g1ej3 g1ej4 g1ej5 [flavioc@gpgpu-­‐fisica TP1]$ cp -­‐R /share/apps/codigos/TPs/TP1 icnpg2013/ ¡Hands On!
Trabajo Práctico 1
http://fisica.cab.cnea.gov.ar/gpgpu/index.php/en/icnpg
Generaciones de GPU
CUDA Driver Version
GeForce GTX 780
GeForce GTX 480
5.5
5.5
CUDA Capability Major/Minor version number
Total amount of global memory
Multiprocessors
Cores per Multiprocessor
Multiprocessors x Cores/MP = Cores
Maximum number of threads per block
Maximum sizes of each dimension of a block
Maximum sizes of each dimension of a grid
9
Generaciones de GPU
CUDA Driver Version
GeForce GTX 780
GeForce GTX 480
5.5
5.5
CUDA Capability Major/Minor version number
Total amount of global memory
Multiprocessors
Cores per Multiprocessor
Multiprocessors x Cores/MP = Cores
Maximum number of threads per block
Maximum sizes of each dimension of a block
Maximum sizes of each dimension of a grid
10
Funciones en el device
!
__device__ int addem( int a, int b ) { return a + b; } !
__global__ void add(int a, int b, int *dc ) { *dc = addem(a,b); }
__global__ declara a add como una función que se ejecuta en el device
__device__ declara a addem como una función que se ejecuta en el device, y se llama desde el device
Los argumentos pasan por valor como en Lenguaje C
11
Funciones en CUDA C
Sólo acceden a variables en la GPU
No pueden tener número variable de argumentos
No pueden ser recursivas (__device__ functions support recursion in device code compute capability > 2.x)
No pueden contener variables estáticas
Deben declararse con un calificador: __global__, __host__ o __device__
Funciones en CUDA C
Calificador
Se ejecuta en
Se llama desde
__device__
device
device
__global__
device
host
__host__
host
host
__global__ designa una función como kernel
funciones __global__ son void
funciones __global__ necesitan una configuración de lanzamiento <<<xx,yy>>>
Las llamadas a funciones __global__ son asincrónicas, es decir que retornan antes que el device haya
completado su ejecución
!
CUDA Programming Guide, Appendix E
¿ Dudas ?
Midiendo el tiempo de ejecución en GPU
cudaEvent_t start,stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord( start, 0 );
!
// llamado a Kernel/s
!
cudaEventRecord( stop, 0 );
cudaEventSynchronize( stop ); //Necesario
!
float
elapsedTime;
cudaEventElapsedTime( &elapsedTime,start, stop )); // en milisec.
printf( "Time in Kernel: %3.1f ms\n", elapsedTime);
En kernels cortos (como los de estas clases) puede ser
necesario correrlos varias veces usando un for/while
[email protected]
todos los alumnos + profesores
problemas, dudas, consultas sobre el curso en general
Usar el subject!
[email protected]
email dirigido a los docentes
problemas, dudas, consultas particulares
Usar el subject!
Descargar