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!