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
int main() Primitiva __global__.
Debe devolver void.
{
// Kernel invocation
VecAdd<<<1, N>>>(A, B, C);
}
Al invocarlo se le indica
<<tamao grid, tamao bloque>>
Escalabilidad
Los ndices del elemento de la matriz Cada hilo realiza la operacin
que se va a procesar se definirn pues correspondiente. En este caso, es
en funcin del tamao del bloque, posible que el nmero de threads supere
del id el hilo dentro del bloque actual al nmero de elementos: controlar
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