Click here to load reader
View
242
Download
1
Embed Size (px)
Algoritmos y Programacin Paralela, curso 2010-11
Iniciacin a la Programacin de GPU
Domingo Gimnez
Bsicamente a partir del seminario de Juan Fernndez Peinadoren el curso de Computacin Cientfica en Clusters
http://www.ditec.um.es/~javiercm/curso_ccc/index.htmlRecursosLaboratorio de Computacin Cientfica,
grupo de CCPP Quad Core Luna Tarjeta NVIDIA geforce 9800GT
112 cores en 14 procesadores de 8 cores Memoria 512 MB Ancho de banda memoria 57.6 MB/s
*http://www.nvidia.es/page/tesla_gpu_processor.html
http://www.um.es/pcgumhttp://www.nvidia.es/page/tesla_gpu_processor.htmlhttp://www.nvidia.es/page/tesla_gpu_processor.htmlhttp://www.nvidia.es/page/tesla_gpu_processor.htmlhttp://www.nvidia.es/page/tesla_gpu_processor.htmlhttp://www.nvidia.es/page/tesla_gpu_processor.htmlhttp://www.nvidia.es/page/tesla_gpu_processor.htmlContenidosIntroduccinArquitectura hardware y software de CUDAProgramacinOptimizacin y depuracinVarios
MotivacinGraphics Processing Units (GPUs)
Las GPUs liberan a la CPU de realizar tareas concretas de procesamiento grfico de manera repetitiva
Presentes en cualquier equipo de sobremesa o servidor integradas en placa o como tarjetas externas
El mercado de los vdeojuegos ha propiciado su consolidacin, evolucin y precios competitivos
Las GPUs actuales tambin son procesadores multincleo muchos threads capaces de ejecutarse en paralelo
Motivacin GPUs ofrecen mayor rendimiento pico que las CPUs
CPUs diseadas para optimizar la ejecucin de aplicaciones de propsito general Lgica de control de flujo sofisticada Memorias cach multinivel Reducido nmero de ncleos Rendimiento: ~25 Gflops, ms de 10 /Gflop
GPUs diseadas para optimizar la ejecucin de tareas de procesamiento grfico Lgica de control de flujo simple y memorias cach pequeas Mltiples unidades funcionales para punto flotante Mayor ancho de banda de acceso a memoria Gran nmero de ncleos Rendimiento: ~500 Gflops, menos de 1 /Gflop
MotivacinEn la actualidad uso de GPUs para acelerar
aplicaciones de propsito general: General-Purpose computation on Graphics Processing Units (GPGPU)
Programacin de GPU mediante APIs grficas (Direct3D, OpenGL)
Modificacin de la aplicacin para expresarla en funcin de un conjunto de llamadas a la API grfica disponible
Tarea ardua y compleja que requiere un conocimiento detallado tanto de la arquitectura de la GPU como de la aplicacin
CUDA proporciona un modelo de programacin independiente de las APIs grficas, ms general y flexible
Las aplicaciones DEBEN paralelizarse
MotivacinGPUs ofrecen mayor rendimiento que las
CPUs en aplicaciones basadas en CUDA de diversos campos: Multiplicacin de matrices densas: speedup de 9.3x Procesamiento de vdeo (H.264): speedup de
12.23x Clculo de potencial elctrico: speedup de 64x Resolucin de ecuaciones polinomiales: speedup
de 205xNo todas las aplicaciones son susceptibles de
ser paralelizadas con xito en una GPU
ObjetivosConocer la tecnologa bsica hardware y
software que permite la paralelizacin de aplicaciones con CUDA
Adquirir la habilidad de paralelizar aplicaciones sencillas con CUDA en un entorno real
Ser capaces de determinar si una aplicacin de propsito general ofrece alguna posibilidad de paralelizacin con xito en CUDA a partir de su especificacin algortmica
Introduccin2003: OpenGL, programacin grficaNoviembre 2006: NVIDIA introduce la
arquitectura unificada (CUDA) con la presentacin de la NVIDIA GeForce 8800.
GPUs de NVIDIA compatibles con CUDA Modelos: GeForce, Tesla, Quadro Diferencias:
Interfaz (ancho de banda) y cantidad de memoria # ncleos (# SMs) # registros (8192 o 16384)
2009: OpenCL, GPGPU para plataformas grficas
*http://www.nvidia.es/object/cuda_gpus_es.html
http://www.nvidia.es/object/cuda_gpus_es.htmlhttp://www.nvidia.es/object/cuda_gpus_es.htmlhttp://www.nvidia.es/object/cuda_gpus_es.htmlhttp://www.nvidia.es/object/cuda_gpus_es.htmlhttp://www.nvidia.es/object/cuda_gpus_es.htmlhttp://www.nvidia.es/object/cuda_gpus_es.htmlIntroduccinCompute Unified Device Architecture (CUDA)
Arquitectura hardware y software Uso de GPU, construida a partir de la replicacin de un bloque
constructivo bsico, como acelerador con memoria integrada Estructura jerrquica de threads mapeada sobre el hardware
Modelo de memoria Gestin de memoria explcita
Modelo de ejecucin Creacin, planificacin y ejecucin transparente de miles de
threads de manera concurrente
Modelo de programacin Extensiones del lenguaje C/C++ junto con CUDA Runtime API
ContenidosIntroduccinArquitectura hardware y software de CUDAProgramacinOptimizacin y depuracinVarios
Arquitectura hardware y softwareGPU = N x Streaming Multiprocessors (SMs)
SM = 8 x Streaming Processors (SPs)
Arquitectura hardware y softwareLos Procesadores (SPs)
Realizan operaciones escalares sobre enteros/reales 32 bits
Ejecutan threads independientes pero todos deberan ejecutar la instruccin leda por la Instruction Unit (IU) en cada instante
Single Instruction Multiple Thread (SIMT) Explotacin de paralelismo de datos y, en menor medida,
de tareas
threads son gestionados por el hardware en cada SM
Creacin y cambios de contexto con coste despreciable
Se libera al programador de realizar estas tareas
Arquitectura hardware y softwareLas partes del cdigo paralelizadas para
ejecutarse en la GPU se denominan kernelsUn kernel descompone un problema en un
conjunto de subproblemas y lo mapea sobre un grid Grid: vector 1D o 2D de thread blocks
Cada thread block tiene su BID (X,Y) dentro del grid Thread blocks: vector 1D, 2D o 3D de threads
Cada thread tiene su TID (X,Y,Z) dentro de su thread block
Los threads utilizan su BID y TID para determinar el trabajo que tienen que hacer (SPMD)
Arquitectura hardware y software
Arquitectura hardware y softwareEjemplo: clculo de y= x+y, x e y vectores
void saxpy_serial(int n, float *y, float alpha, float *x){
for(int i=0; i
Modelo de memoriaBanco de registros (register file): 8192 registros
Repartidos entre todos los thread blocks en ejecucin Tiempo de acceso muy pequeo
Memoria compartida (shared memory): 16 KB de memoria Repartida entre todos los thread blocks en ejecucin Compartida por todos los threads de cada thread
block Tiempo de acceso similar a los registros
Memoria global (global memory): hasta 1.5 GB de memoria compartida por todos los thread blocks Tiempo de acceso elevado (cientos de ciclos)
Modelo de memoriaMemoria constante (constant memory): 64 KB de
memoria con 8 KB de memoria cache Todos los threads de un warp (grupo de 32 threads) pueden
leer el mismo valor de la memoria constante simultneamente en un ciclo de reloj
Tiempo de acceso similar a los registros Slo admite operaciones de lectura
Memoria de texturas (texture memory): Explota localidad espacial con vectores de datos 1D o 2D Tiempo de acceso elevado pero menor que memoria global Slo admite operaciones de lectura
Memoria local (local memory) Memoria privada de cada thread para la pila y las variables
locales con propiedades similares a la memoria global
Modelo de memoria
Modelo de memoriaCPU y GPU espacios de memoria separados
Utilizar funciones para reservar memoria en la GPU Copiar datos de CPU a GPU Copiar datos de GPU a CPU Liberar memoria de GPU
Punteros Son direcciones y no se sabe si la direccin
corresponde a CPU o GPU Si desde CPU se accede a memoria de GPU, o al
revs, el programa se puede colgar
Modelo de ejecucinPrograma CUDA, extensin de C:
se ejecuta en el host (CPU) al llamar a un kernel se utiliza el device (GPU)
como coprocesador del host. Similar al modelo OpenMP, CPU y GPU en modo asncrono
slo se ejecuta un kernel cada vez con mltiples hilos (miles) cada hilo, usando su identificador, trabaja con
datos distintos sincronizacin entre los hilos al acabar el kernel
dentro del kernel las funciones se ejecutan en la GPU
Modelo de ejecucin Cada thread block de un grid
se asigna a un nico SM Un SM asigna a cada thread
block los recursos necesarios (Thread contexts, registros, shm...)
Cada SM puede gestionar y ejecutar hasta 768 threads
Comunicacin de todos los threads de un thread block por acceso a memoria compartida
Sincronizacin de los threads de un thread block con una nica instruccin_syncthreads();
Modelo de ejecucinLos threads de distintos thread blocks slo se
pueden comunicar va memoria global y no se pueden sincronizar La sincronizacin se produce de manera implcita entre la
ejecucin de un kernel y el siguiente Los thread blocks de un grid deben ser independientes Los resultados deberan ser correctos sin importar el orden
de ejecucin de los thread blocks del grid Esta restriccin reduce la complejidad del hardware y, sobre
todo, favorece la escalabilidad pero limita el rango de aplicaciones que pueden paralelizarse
con xito para ser ejecutadas en una GPU utilizando CUDACada thread block se divide en grupos de 32
threads denominados warps
Modelo de ejecucinCada SM crea, planifica y ejecuta hasta 24 warps
pertenecientes a uno o ms thread blocks (768 threads)
Cada warp ejecuta una instruccin en 4 ciclos de relojCuando un warp se bloquea, el SM ejecuta otro warp
perteneciente al mismo o a otro thread block activo Ocultacin de las largas late