Академический Документы
Профессиональный Документы
Культура Документы
Amilcar Meneses Viveros Departamento de Computacin CINVESTAV-IPN / LUFAC Computacin Julio 2011
CONTENIDO
I.- INTRODUCCION A GPU's Y CUDA 1.1 Preliminares de programacin y computacin paralela. 1.2 Arquitecturas basadas en GPU's. 1.3 El ambiente de desarrollo CUDA. II. PRINCIPIOS Y CONCEPTOS DE PROGRAMACION CUDA 2.1 Tipos de funciones y manejo de memoria. 2.2 Bloques y grids. III.- ESTRUCTURA DE LOS PROGRAMAS CUDA 3.1 Uso de codigo C y C++ 3.2 Codigo CUDA (.cu) 3.3 El ambiente de desarrollo con Eclipse IV.- EJEMPLOS Y EJERCICIOS 4.1 Ejemplos con programas de manejo de matrices y vectores: suma, resta, multiplicacin, mtodo gaussjordan. V.- COOPERACION ENTRE HILOS 5.1 Manejo de bloques 5.2 Sincronizacin y memoria compartida
Taller: Introduccin a GPU's y Programacin CUDA para HPC PARTE I: Introduccin a GPU's y CUDA
Computacin serial
Computacin paralela
Memoria CPU
Memoria CPU
Memoria CPU
RED
Tiempo
Pipeline
Tiempo
Tiempo
Tiempo
Preliminares - Proceso
Arquitectura von Neumann Programa residente en memoria
MEMORIA
Carga Ejecuta
CPU
Preliminares - Proceso
Programa cargado en memoria que est en ejecucin o listo para ejecucin
rea de datos
Cdigo ejecutable.
rea de cdigo
rea de pila
Preliminares - Proceso
Proceso multithreading tiene un hilo principal y un conjunto de procesos esclavos.
rea de datos
Cdigo ejecutable.
rea de cdigo
Hilo principal (512MB)
rea de pila
Samuel H. Fueller & Lynette I. Millett. Computer, IEEE, pp. 31-38, January 2011.
Nmero de ncleos
Teraops
Teraops
Teraops
Glenn Lupton, Don Thulin, Accelerating HPC Using GPUs; white paper; Hewlett-Packard Company June 13, 2008.
Tecnologas de GPGPUs
Unidades de procesamiento grco de propsito general. Procesadores vectoriales. Fabricantes: nVidia, ATI, Intel... La idea es aprovechar las unidades aritmticas y lgicas de los GPUs para hacer computaciones de alto rendimiento.
Procesador escalar opera sobre nmeros sencillos (escalares). Procesadores vectoriales operan en vectores de nmeros.
CPU vs GPU
CPU
Baja latencia de memoria. Acceso aleatorio. 20GB/s ancho de banda. 0.1Top. 1Gop/watt Modelo de programacin
altamente conocido.
GPU
Gran ancho de banda. Acceso secuencial. 100GB/s ancho de banda. 1Top. 10 Gop/watt Modelo de programacin muy
poco conocido.
CPU vs GPU
Que es GPGPU ?
Computacin de propsito general usando GPU y API de grcas en aplicacin es distintas a grcos en 3D. GPU acelera la trayectoria crtica de una aplicacin. Algoritmos paralelos sobre datos aprovechan los atributos del GPU. Grandes arreglos de datos, rendimiendo de streaming. Paralelismo de grano no SIMD. Computaciones de punto otante de baja latencia. Aplicaciones ver //GPGPU.org Efectos fsicps de video juegos (FX), procesamiento de imgenes. Modelado fsico, ingeniera computacional, algebra matricial, convolucin, correlacin, ordenamientos.
33
Friday, October 21, 2011
Fragment Program
Comunicacin limitada
Entre pixeles Dispersin a[i] = p
34
Friday, October 21, 2011
CUDA
Compute Unied Device Architecture Modelo de programacin de propsito general El usuario inicializa conjuntos de threads en el GPU GPU = super-threaded dedicado para procesamiento masivo de datos (co-processor) Conjunto de software dedicado Manejadores de dispositivos, lenguaje y herramientas. Manejador para carga de programas al GPU Manejador Independiente - Optimizado para computaciones Interfaz diseada para computaciones - API no grca Comparte datos con objetos OpenGL en buffer Aceleracin garantizada en los accesos a memoria Manejo explicito de la memoria del GPU
35
Friday, October 21, 2011
motherboard
tarjeta grca
Conguraciones de HW
GPU1
GPU2
GPU3
GPU4
DDR 1 DDR N
Chip set 1
C0 C2 C4 C1 C3 C5
C6 C8 C10 C7 C9 C11
Chip set 2
DDR 1 DDR N
CPU1
CPU2
Conguraciones de HW a) b)
c)
d)
Load/store
Load/store
Load/store
Load/store
Load/store
Load/store
42
Global Memory
Friday, October 21, 2011
GeForce 8800
Tesla D870
Programacin en C con herramientas CUDA Modelo multihilos SPMD utiliza paralelismo en datos y en hilos.
Tesla S870
43
Friday, October 21, 2011
Plataformas de desarrollo
Frameworks, lenguajes y herramientas que nos permiten crear programas que corran en arquitecturas de GPGPUs. OpenCL CUDA Brook+ DirectCompute CAPS
Plataformas de desarrollo
Frameworks, lenguajes y herramientas que nos permiten crear programas que corran en arquitecturas de GPGPUs. OpenCL CUDA Brook+ DirectCompute CAPS
OpenCL
Open Computing Language (OpenCL). Framework para escribir programas que se ejecuten en plataformas heterogneas (CPUs multicore y GPUs).
Modelo heterogneo
OpenCL
Originalmente fue desarrollador por Apple (con colaboracin de AMD, IBM, INTEL, nVidia). Apple manda la propuesta inicial al grupo Krhonos en 2008.
OpenCL
Dene OpenCL C - Variante del ISO C99 optimizado para la computacin en GPU. Computacin paralela masiva basada en SPMD.
Cdigo GPU
Cdigo CPU
OpenCL
Dene OpenCL C - Variante del ISO C99 optimizado para la computacin en GPU. Computacin paralela masiva basada en SPMD.
OpenCL
Dene OpenCL C - Variante del ISO C99 optimizado para la computacin en GPU. Computacin paralela masiva basada en SPMD.
2) Se especican los datos y los kernels necesarios. El RT manda los datos a la RAM de los GPUs.
OpenCL
Modelo de memoria.
OpenCL
Modelo de memoria.
Plataformas de desarrollo
Frameworks, lenguajes y herramientas que nos permiten crear programas que corran en arquitecturas de GPGPUs. OpenCL CUDA Brook+ DirectCompute CAPS
CUDA
Compute Unied Device Architecture Modelo de programacin de propsito general El usuario inicializa conjuntos de threads en el GPU GPU = super-threaded dedicado para procesamiento masivo de datos (co-processor) Conjunto de software dedicado Manejadores de dispositivos, lenguaje y herramientas. Manejador para carga de programas al GPU Manejador Independiente - Optimizado para computaciones Interfaz diseada para computaciones - API no grca Comparte datos con objetos OpenGL en buffer Aceleracin garantizada en los accesos a memoria Manejo explicito de la memoria del GPU
54 Friday, October 21, 2011
...
Serial Code (host) Parallel Kernel (device) KernelB<<< nBlk, nTid >>>(args);
...
55
Plataformas de desarrollo
Frameworks, lenguajes y herramientas que nos permiten crear programas que corran en arquitecturas de GPGPUs. OpenCL CUDA Brook+ DirectCompute CAPS
Brook+
Lenguaje de programacin desarrollado por Stanford University. Desarrollado para utilizar tarjetas aceleradoras grcas (GPU) para hacer computaciones de propsito general. Extencin del lenguaje C.
Plataformas de desarrollo
Frameworks, lenguajes y herramientas que nos permiten crear programas que corran en arquitecturas de GPGPUs. OpenCL CUDA Brook+ DirectCompute CAPS
DirectCompute
API desarrollado por Microsoft para desarrollar aplicaciones de propsito especco en unidades de GPU. Corre en Windows Vista y Windows 7. Lenguaje HLSL, sintaxis similar a C.
Plataformas de desarrollo
Frameworks, lenguajes y herramientas que nos permiten crear programas que corran en arquitecturas de GPGPUs. OpenCL CUDA Brook+ DirectCompute CAPS
CAPS
Software desarrollado por la compaia HPC Project. Genera cdigo para GPUs al estilo OpenMP a partir de cdigo C o FORTRAN.
Contenido
Introduccin a HPC Tecnologa de GPGPU Plataformas de desarrollo Estrategias de programacin Comentarios nales y conclusiones
Estrategias de programacin
Buscar particionamiento sobre datos (SPMD). Dominio del problema. Estrategia de paralelismo incremental. Generar operaciones de grano no.
Tamao del grano: nmero de computaciones que se ejecutan entre la comunicacin y la sincronizacin.
Ejecucin de hilos
SM1
SM2
SM3
SM4
Ejecucin de hilos
SM1
SM2
SM3
SM4
Kernel disperso
64 KB
64 KB
64 KB
64 KB
64 KB
64 KB
64 KB
64 KB
768 KB
64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB
Registros
Por omisin, variables locales de cada kernel se asignan a registros. FERMI:
DDR 1 DDR N
Chip set 1
C0 C2 C4 C1 C3 C5
C6 C8 C10 C7 C9 C11
Chip set 2
DDR 1 DDR N
CPU1
CPU2
DDR 1 DDR N
Chip set 1
C0 C2 C4 C1 C3 C5
C6 C8 C10 C7 C9 C11
Chip set 2
DDR 1 DDR N
CPU1
CPU2
DDR 1 DDR N
Chip set 1
C0 C2 C4 C1 C3 C5
C6 C8 C10 C7 C9 C11
Chip set 2
DDR 1 DDR N
CPU1
CPU2
DDR 1 DDR N
Chip set 1
C0 C2 C4 C1 C3 C5
C6 C8 C10 C7 C9 C11
Chip set 2
DDR 1 DDR N
CPU1
CPU2
Multi-GPU
GPU3 GPU4
Se requiere del desarrollo de algoritmos mixtos para aprovechar la potencia computacional de los nuevos servidores y clusters.
DDR 1 DDR N
Chip set 1
C0 C2 C4 C1 C3 C5
C6 C8 C10 C7 C9 C11
Chip set 2
DDR 1 DDR N
CPU1
CPU2
Se requiere del desarrollo de algoritmos mixtos para aprovechar la potencia computacional de los nuevos servidores y clusters.
DDR 1 DDR N
Chip set 1
C0 C2 C4 C1 C3 C5
C6 C8 C10 C7 C9 C11
Chip set 2
DDR 1 DDR N
CPU1
CPU2
MPI +
OpenMP pthreads
Palabras clave
threadIdx, blockIdx
region[threadIdx.x] = image[i];
Escencial
__syncthreads
__syncthreads() ... image[j] = result; }
Runtime API
Memory, symbol, execution management
// Allocate GPU memory void *myimage = cudaMalloc(bytes)
Funcion de lanzamiento
cudacc
EDG C/C++ frontend Open64 Global Optimizer
GPU Assembly
foo.s
gcc / cl
Mark Murphy, NVIDIAs Experience with Open64, www.capsl.udel.edu/conferences/ open64/2008/Papers/101.doc
76
NVCC
cdigo CPU
Virtual Fsica
Cdigo PTX
ld.global.v4.f32 mad.f32
G80
GPU
Cdigo destino
2877
Friday, October 21, 2011
Ligado
Cualquier archivo ejecutable con cdigo CUDA requiere dos bibliotecas dinmicas: Biblioteca en tiempo de ejecucin CUDA (cudart). Biblioteca de ncleo CUDA (cuda).
Taller: Introduccin a GPU's y Programacin CUDA para HPC PARTE II: PRINCIPIOS Y CONCEPTOS DE PROGRAMACION CUDA
...
Serial Code (host) Parallel Kernel (device) KernelB<<< nBlk, nTid >>>(args);
...
82
Load/store
Load/store
Load/sto
83
84
Friday, October 21, 2011
Thread Block 1
1 2 3 4 5 6 7 0
85
Simplica el direccionamiento de memoria cuando se trabaja con datos multidimensionales Procesamiento de imgenes Resolucin de PDE ....
86
Friday, October 21, 2011
Block (1, 0)
Shared Memory
Registers
Registers
Registers
Registers
Global Memory
87
Friday, October 21, 2011
Block (1, 0)
Shared Memory
Global Memory
88
Friday, October 21, 2011
Block (1, 0)
Shared Memory
Registers
Registers
Registers
Registers
Thread (0, 0)
Thread (1, 0)
Thread (0, 0)
Thread (1, 0)
Host
Global Memory
91
Friday, October 21, 2011
64 KB
64 KB
64 KB
64 KB
64 KB
64 KB
64 KB
64 KB
768 KB
64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB
64 KB
64 KB
64 KB
64 KB
64 KB
64 KB
64 KB
64 KB
768 KB
64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB
768 KB
64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB
Tabla de resumen
Taller: Introduccin a GPU's y Programacin CUDA para HPC PARTE III - ESTRUCTURA DE LOS PROGRAMAS CUDA
El hardware est diseado para habilitar un runtime y manejador ligero Alto desempeo
101
Friday, October 21, 2011
Ejemplo
% nvcc -o ejecu kernels.cu funciones.c main.c -lm -lc
float HostFunc()
// Funciones en GPU (kernels) __device__ int funcionK(int a) { int resultado; ... return resultado; } __global__ void kernel1() { int a = escalar; } __global__ void kernel2() { ... r = funcionK(threadIdx.x); ... }
// Funciones en GPU (kernels) __device__ int funcionK(int a) { int resultado; ... return resultado; } __global__ void kernel1() { int a = escalar; } __global__ void kernel2() { ... r = funcionK(threadIdx.x); ... }
rea de datos
Cdigo de CPU (funciones)
Cdigo ejecutable.
rea de cdigo
rea de pila
Para funciones ejecutadas en el device: No recursin No debe haber declaraciones de variables estticas dentro de la funcin No pueden tener un nmero variable de argumentos
Cualquier llamado a una funcin de kernel function es asncronca desde CUDA 1.0, se requiere de una sncronizacin explcita para el bloqueo.
Programa CUDA
A nivel alto, tenemos un proceso principal el cual se ejecuta en el CPU y ejecuta los siguientes pasos: 1.Inicializa la tarjeta. 2.Asigna memoria en el host y en el device. 3.Copia datos del host al device. 4.Asinga multiples copias de kernels de ejecucin al device. 5.Copia datos de la memoria del device a la memoria del host. 6.Repite pasos 3 a 5 como sea necesario. 7.Libera memoria (del host y device) y termina.
primero.cu
int main(int argc, char **argv) { float *h_x, *d_x; // h=host, d=device int nblocks=2, nthreads=8, nsize=2*8;
Cdigo host
h_x = (float *)malloc(nsize*sizeof(float)); cudaMalloc((void **)&d_x,nsize*sizeof(float)); my_first_kernel<<<nblocks,nthreads>>>(d_x); cudaMemcpy(h_x,d_x,nsize*sizeof(float), cudaMemcpyDeviceToHost); for (int n=0; n<nsize; n++) printf(" n, x = %d %f \n",n,h_x[n]); cudaFree(d_x); free(h_x); }
Friday, October 21, 2011
primero.cu
//#include <cutil_inline.h> __global__ void my_first_kernel(float *x) { int tid = threadIdx.x + blockDim.x*blockIdx.x; x[tid] = threadIdx.x; }
Cdigo kernel
Taller: Introduccin a GPU's y Programacin CUDA para HPC PARTE IV - EJEMPLOS Y EJERCICIOS
A
M
C
P
WIDTH
WIDTH
WIDTH
WIDTH
M0,0 M1,0 M2,0 M3,0 M0,1 M1,1 M2,1 M3,1 M0,2 M1,2 M2,2 M3,2 M0,3 M1,3 M2,3 M3,3
M
M0,0 M1,0 M2,0 M3,0 M0,1 M1,1 M2,1 M3,1 M0,2 M1,2 M2,2 M3,2 M0,3 M1,3 M2,3 M3,3
N B
k
WIDTH WIDTH
P C
WIDTH
WIDTH
Nd B
tx
A ty k
WIDTH
Pd
ty tx
WIDTH
WIDTH
WIDTH
// Asigna los hilos de ejecucion al dispositivo MatrixMulKernel<<<dimGrid, dimBlock>>>(Ad, Bd, Cd, n);
Grid 1 Block 1
Bd
Cada hilo:
Carga un rengln de la matriz Ad. Carg una columna de la matriz Ad. Realiza una multiplicacin y una suma por cada par de elementos de Ad y Bd.
48
WIDTH
Ad
Cd
cudaEventCreate(&start); cudaEventCreate(&stop);
// 2. Registra el evento inicial cudaEventRecord(start, 0); // 3. Ejecutar funciones de cuda // (asignar memoria, copiar datos, // llamar kernels, ... )
cudaEventCreate(&start); cudaEventCreate(&stop);
// 2. Registra el evento inicial cudaEventRecord(start, 0); // 3. Ejecutar funciones de cuda // (asignar memoria, copiar datos, // llamar kernels, ... )
Ejecucin de hilos
#include <stdio.h> #define N (33 * 1024) __global__ void add( int *a, int *b, int *c ) { int tid = threadIdx.x + blockIdx.x * blockDim.x; while (tid < N) { c[tid] = a[tid] + b[tid]; tid += blockDim.x * gridDim.x; } }
Ejecucin de hilos
N esta definido por la cantidad 33792
Ejecucin de hilos
SM1
SM2
SM3
SM4
Ejecucin de hilos
SM1
SM2
SM3
SM4
64 KB
64 KB
64 KB
64 KB
64 KB
64 KB
64 KB
64 KB
768 KB
64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB
Kernel disperso
Variables globales
Variables que son visibles desde distintos kernels.
Variables en la memoria del device, no en el host. Cualquier kernel puede hacer operaciones de Lectura/Escritura. Se pueden declarar arreglos de tamao jo.
Variables constantes
Constantes que son visibles desde distintos kernels.
Se inicializan desde el host con la funcin cudaMemcpyToSymbol Cualquier kernel puede hacer operaciones de Lectura. Se pueden declarar arreglos de tamao jo.
Constantes
Una constante es una variable cuyo valor se pone en tiempo de ejecucin. Existen valores que se ponen en tiempo de compilacin #define PI 3.1415936f a = b * 2.0f / PI; Estos valores se guardan en el rea de cdigo, no ocupan registro pues vienen en el ujo de instrucciones.
Registros
Por omisin, variables locales de cada kernel se asignan a registros. FERMI:
Registros
Por omisin, variables locales de cada kernel se asignan a registros. TESLA:
Registros
Memoria compartida
Variables visibles por todos los hilos de un bloque. Se declaran dentro de un kernel.
Puede ser una alternativa al uso de arreglos locales. Reduce el uso de registros cuando una variable tiene el mismo valor en todos los threads.
64 KB
64 KB
64 KB
64 KB
64 KB
64 KB
64 KB
64 KB
768 KB
64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB
Reduccin
< u, v >=
i=0
u[ i ] v [ i ]
Cada hilo hace una parte de la operacin total y al nal se suman los resultados parciales. En cuda podemos ver resultados parciales por hilo y por bloque.
Reduccin
Vector U Vector V
Reduccin
Reduccin
Reduccin
Reduccin
Reduccin
Reduccin
Reduccin
Reduccin
Reduccin
Reduccin
Reduccin
Reduccin
// Producto Punto const int N = 33*1024; const int threadsPerBlock = 256; const int blocksPerGrid = 32; __global__ void dot(float *a, float *b, float *c) { __shared__ float cache[threadsPerBlock]; int tid = threadIdx.x + blockIdx.x * blockDim.x; int cacheIndex = threadIdx.x; float temp = 0; while (tid < N) { temp += a[tid] * b[tid]; tid += blockDim.x * gridDim.x; } cache[cacheIndex] = temp; __syncthreads(); int i = blockDim.x/2; while (i != 0) { if (cacheIndex < i) cache[cacheIndex] += cache [cacheIndex + i]; __syncthreads(); i /= 2; } if (cacheIndex == 0) { c[blockIdx.x] = cache[0]; } }
Reduccin
Bibiografa
J. Sanders & E. Kandrot; CUDA by Example: An Introduction to General-Purpose GPU Programming; Addison-Wesley Professional, 2010. NVIDIA Corporation ; NVIDIA CUDA C, Programming Guide, Version 3.2, Septiembre 2010. NVIDIA Corporation ; NVIDIA CUDA, CUDA C Best Practices Guide, Version 3.2, Agosto 2010. NVIDIA Corporation ; The CUDA Compiler Driver NVCC; Agosto 2010. NVIDIA Corporation; NVIDIA CUDA, Reference Manual, Version 3.2 Beta, Agosto 2010.
159
Friday, October 21, 2011
Bibiografa
D. Kirk & Wen-Mei W. Hwu; Programming Massively Parallel Processors: A Hands-on Approach; Morgan Kaufmann, 2010. Mike Giles; Course on CUDA Programming on NVIDIA GPUs, July 2010. NVIDIA Corporation; CUDA Presentation 4.0; 2011. Michael J. Quinn; Parallel Programming in C with MPI and OpenMP; McGrawHill, International Edition, 2003. Jack Dongara, et. al.; Sourcebook of Parallel Computing, Morgan Kaufmann Ed.; 2003.
160
Friday, October 21, 2011
Bibiografa
Jack Dongara, et. al.; Sourcebook of Parallel Computing, Morgan Kaufmann Ed.; 2003. T.G. Mattson, B.A. Sanders, B.L. Massingill; Patterns For Parallel Programming; Addison Wesley, 2007. G.E. Karniadakis, R.M. Kirby II; Parallel Scientic Computing in C ++ and MPI; 2nd edition, Cambridge University Press, 2005.
161
Friday, October 21, 2011