Está en la página 1de 20

CUDA: MODELO DE PROGRAMACIN

Autor: Andrs Rondn Tema: GPUGP: nvidia CUDA.

Introduccin
En Noviembre de 2006, NVIDIA crea CUDA, una arquitectura de procesamiento paralelo de propsito general, con un nuevo modelo de programacin paralela. Compute Unified Device Architecture Pequea curva de aprendizaje. Escalable a 100s cores y a 1000s hilos paralelos. Empez como una pequea extensin de C, pero ya es soportada por OpenCL, Fortran...

Introduccin

DEFINICIONES
En el mbito CUDA:
Device = GPU Host = CPU Kernel = Funcin llamada desde el Host que se ejecuta en Device

Array de hilos paralelos:


1 CUDA Kernel se ejecuta mediante un array de Threads. Todos los Threads ejecutan el mismo cdigo. Cada Thread tiene un ID que se usa para direccionar la memoria y tomar las decisiones de control.

Jerarqua de hilos
Unidad bsica de operacin es el thread. Los hilos estn organizados en bloques de threads.(Blocks) Los bloques estn organizados en mallas de bloques. (Grids). Un Grid solo puede ejecutar un Kernel.

Jerarqua de hilos (II)

Jerarqua de hilos (y III)


Hilos identificados mediante threadIdx: vector de elementos 3D ( tiene 3 componentes, x, y y z) . Cada hilo puede venir identificado por un ndice 1, 2 3 dimensiones. Los hilos de un bloque pueden cooperar entre s mediante el uso de memoria compartida dentro del bloque y sincronizando su ejecucin para coordinar los accesos a memoria. Los grids pueden ser de 1 o 2 dimensiones, luego cada block dentro de un grid puede ser direccionado por un ndice de 1 o 2 dimensiones mediante blockIdx. Asimismo, la dimensin del bloque tambin se puede obtener desde dentro del kernel mediante blockDim.

Jerarqua de memoria
Cuda threads pueden acceder a los datos de mltiples espacios de memoria durante su ejecucin. Cada thread posee su propia memoria local. Cada block su propia memoria compartida por todos los threads del bloque y con el mismo tiempo de vida que los threads que lo componen. Todos los hilos tienen acceso a la memoria global. Existen adems otros 2 espacios de memoria adicionales de slo lectura: constant y texture memory.

Jerarqa de memoria

Modelo Hardware

Cooperacin CPU - GPU


El modelo de programacin de CUDA asume que los CUDA threads se ejecutan en un device que acta como coprocesador de un host que ejecuta un programa. Tambin asume que host y device poseen su propia DRAM, host memory y device memory. Cuda proporciona instrucciones para reservar, liberar, copiar memoria en la memoria del device, as como transferir datos entre el host y el device.

CUDA: EXTENSIN DE C.

Kernel
// Kernel definition __global__ void VecAdd(float* A, float* B, float* C) { ... Se define un kernel con la } Primitiva __global__. int main() Debe devolver void. { // Kernel invocation VecAdd<<<1, N>>>(A, B, C); }
Al invocarlo se le indica <<tamao grid, tamao bloque>>

Escalabilidad
Cada hilo realiza la operacin Los ndices del elemento de la matriz correspondiente. En este caso, es que se va a procesar se definirn pues posible que el nmero de threads supere en funcin del tamao del bloque, al nmero de elementos: controlar del id el hilo dentro del bloque actual y del tamao del id del bloque actual. // Kernel definition __global__ void MatAdd(float A[N][N], float B[N][N],float C[N][N]) { int i = blockIdx.x * blockDim.x + threadIdx.x; int j = blockIdx.y * blockDim.y + threadIdx.y; if (i < N && j < N) C[i][j] = A[i][j] + B[i][j]; Se define la dimensin del } Bloque. Puede ser de 1 o 2 dimensiones. int main() Le estamos diciendo que cada bloque { Va a tener 16x16=256 threads ... // Kernel invocation dim3 dimBlock(16, 16); dim3 dimGrid((N + dimBlock.x 1) / dimBlock.x,(N + dimBlock.y 1) / dimBlock.y); Se define la dimensin del MatAdd<<<dimGrid, dimBlock>>>(A, B, C); Grid. Tambin puede ser de 1 o 2 } y depende del tamao del bloque y del tamao del array.

Escalabilidad (II)
El tamao del block es elegido aparentemente de forma arbitraria, y el grid es creado con suficientes blocks para tener un thread por un elemento de la matriz. Todos los Threads de un block se ejecutan dentro del mismo core. El nmero de threads por block est limitado por los recursos de memoria del core: En la misma GPU, actualmente un block puede contener 512 threads.

Escalabilidad (y III)
El tamao de los datos suele ser ms grande que el de los hilos: Independencia de ejecucin entre bloques: debe dar igual el orden, y si se ejecutan en paralelo o en serie. Si no: __syncthreads(). Blocks necearios para permitir la escalabilidad a diferentes nmeros de core

Memoria
CUDA asume que device y host tienen su propia memoria. En principio, device trabaja con la host memory. Para que trabaje con su propia memoria, CUDA proporciona, entre otros: cudaMalloc(void **, size_t); cudaMemcpy(void *,void *, size_t,cudaMemcpyHostToDevice| cudaMemcpyDeviceToHost); cudaFree(void *);

COMPILACIN
Tenemos cdigo que se va a ejecutar en el host y cdigo que se va a ejecutar en el device. Nvcc se va a encargar de separarlos.

Una vez separados, el cdigo del host se compilar con su compilador habitual, pej. Cc, y el cdigo del device lo transformar en cdigo binario (cubin) o ensamblador (PTX) Por ltimo, para cargarlo y ejecutarlo en el device la aplicacin se ayuda de las APIS proporcinadas por los drivers de CUDA

Apndice
Interoperatividad con Directx y OpenGL. Versin 2.3.1 (26/08/2009) Muy extendido: Resultados google del orden de 1 M en nvidia cuda y de 1 K en nvidia cuda programming guide. Arquitectura actual: nvidia FERMI: 512 cuda cores. 228 universidades ensean cuda actualmente. (4 de ellas Espaolas)

Documentacin

http://www.nvidia.com/object/cuda_home.html# http://es.wikipedia.org/wiki/CUDA

También podría gustarte