Computación en procesadores gráficos Programación con CUDA
|
|
- José Carlos Olivares Méndez
- hace 7 años
- Vistas:
Transcripción
1 Computación en procesadores gráficos Programación con CUDA José Jesús Fernández Rodriguez Ester Martín Garzón José Antonio Martínez García José Román Bilbao Castro Francisco M. Vázquez López
2 Contenidos y Actividades Arquitectura de las GPUs Modelo de programación SIMT Claves computacionales para la programación de GPUs CUDA Ejercicios Programación con CUDA 2
3 Arquitectura de las GPUs Thread Processor Streaming Multiprocessor: SMs Scalar Processor: SPs Memoria On-chip: Registros Shared Memory Off-chip: Memoria global o device memory Texture cache, constant cache Programación con CUDA 3
4 Arquitectura de las GPUs Thread Processor: Coordina la ejecución de los threads Streaming Multiprocessor SM: Contiene 8 Scalar Processor SP 4, 14, 16, 30 SMs según arquitectura (G80, G92,., GT200) GeForce GTX 285: 30 SM x 8 SP = 240 Cores GeForce GTX 295: Dual 30 SM x 8 SP x 2 GPUs = 480 Cores Tesla C1070: 30 SM x 8 SP x 4 GPUs = 960 Cores Fermi (GT300): 16 SM x 32 SP = 512 Cores Scalar Processor SP: Cores Unidades funcionales en coma flotante de simple precisión 2 Unidades en coma flotante de doble precisión IEEE Fermi: 4 Unidades conforme estándar IEEE Programación con CUDA 4
5 Arquitectura de las GPUs Memorias On-Chip: Baja latencia (varios ciclos) Registros (R/W): Almacenan las variables declaradas en los kernels Accesible por thread Tamaño: 16 K Registros de 32 bits Shared Memory (R/W): Almacenan arrays A compartir entre todos los threads del bloque Mecanismo para la comunicación entre todos los threads del bloque Tamaño: 16 Kb (Fermi: 48Kb + 16Kb configurable) Programación con CUDA 5
6 Arquitectura de las GPUs Memorias Off-Chip: Device memory (R/W) Tamaños: 512Mb, 1GB, 2GB, 4GB Alta latencia: ciclos por acceso aleatorio Mejorar acceso bajo condiciones de coalescencia Caché de texturas (R) 6Kb-8Kb por SM Zona ligada a device memory pero 8Kb dentro de cada SM Misma latencia que la de un registro en cache hit Misma latencia que device memory en cache miss Reserva dinámica Caché de constantes (R) 64Kb Mínima latencia cuando todos los threads acceden a la misma dirección Tamaño fijo. Reserva estática Programación con CUDA 6
7 Arquitectura de las GPUs Programación con CUDA 7
8 Arquitectura de las GPUs Programación con CUDA 8
9 Modelo de programación SIMT SIMT: Single Instruction Multiple Threads Extensión de SIMD (Single Instruction Multiple Data) Programación vectorial Paralelismo de grano fino Unidad mínima de ejecución: thread Agrupación en bloques y grid Cada thread es asignado a un SP Los distintos bloques se asignan a los SMs. Cola de bloques por SM. Para la ejecución, los bloques se dividen en agrupaciones de 32 threads: warp El acceso a memoria se realiza en grupos de 16 threads: half-warp Esta organización tiene el objetivo de aprovechar al máximo las posibilidades de paralelismo de la arquitectura, ocultando latencias mediante la ejecución concurrente de tareas. Programación con CUDA 9
10 Modelo de programación SIMT Operación y = α a, α = 2 threads a y Speed up* = 16x Programación con CUDA 10
11 Modelo de programación SIMT y = α a, α = 2 threads z = β b, β = a y GPU 1 b z Speed up* (2 GPUs) = 32x GPU 2 Programación con CUDA 11
12 Modelo de programación SIMT Bloques: Dimensiones: 1D, 2D, 3D Máximo 512 threads por bloque Dimensión máxima: 512 x 512 x 64 Grid: Dimensiones: 1D, 2D Dimensión máxima: x x 1 Programación con CUDA 12
13 Modelo de programación SIMT Cómo se determina la topología del bloque? Mapear los datos del problema a los threads Problemas: Situaciones en las que se accede a una misma estructura de distinta forma Limitados por las operaciones que definen el algoritmo Dependencias de datos Soluciones: Cambiar la forma de almacenar las estructuras Dividir en múltiples kernels Programación con CUDA 13
14 Modelo de programación SIMT Jerarquía de memoria Programación con CUDA 14
15 Modelo de programación SIMT Programación con CUDA 15
16 Modelo de programación SIMT Programación heterogénea CPU-GPU CPU: Host. Código secuencial GPU: Device. Kernels. Código paralelo Ejecución asíncrona Multi GPU: Cudathreads Etapas: Transferencia CPU -> GPU: PCIX Ejecución del kernel Transferencia GPU -> CPU: PCIX Programación con CUDA 16
17 Modelo de programación SIMT Multi GPU Memory Cache Quad Core Cores Cuda Threads Kernel 1 Kernel 2 Kernel 3 Kernel 4 GPUs Device memory Por aquí no hay comunicación. Volver a la CPU Programación con CUDA 17
18 Modelo de programación SIMT Modelo memoria distribuida: MPI Programación con CUDA 18
19 Modelo de programación SIMT Modelo memoria compartida: Posix- Threads, Open-MP Programación con CUDA 19
20 Modelo de programación SIMT Compute capability: 1.0, 1.1, 1.2, 1.3 Define características, operaciones, tamaños Compute capability 1.0: Máximo Threads/Bloque: 512. Bloque: 512 x 512 x 64 Máximo grid: x x 1 Registros por bloque: 8K-registros de 32 bits Shared memory por bloque: 16Kb Constant memory: 64Kb Texture memory: 6Kb-8Kb por SM Máximo bloques activos por SM: 8 Máximo warps activos por SM: 24 Máximo threads activos por SM: 768 Máximo instrucciones PTX por kernel: 2 millones Programación con CUDA 20
21 Modelo de programación SIMT Compute capability 1.1: Funciones atómicas en memoria global para palabras de 32 bits Compute capability 1.2: Funciones atómicas en shared memory para palabras de 32 bits Funciones atómicas en memoria global para palabras de 64 bits Registros por bloque: 16K-registros de 32 bits Máximo warps activos por SM: 32 Máximo threads activos por SM: 1024 Compute capability 1.3: Operaciones coma flotante de doble precisión IEEE Programación con CUDA 21
22 Claves computacionales para la programación de GPUs Coalescing. Acceso coalescente o fusionado a memoria global Capacidad de la arquitectura para obtener 16 palabras de memoria simultáneamente (en un único acceso) por medio de los 16 threads del half-warp Reduce la latencia de memoria a 16 veces menos Primera cuestión de eficiencia en el desarrollo del kernel Se consigue bajo ciertos patrones de acceso Estos patrones dependen de la capacidad de cómputo de la GPU Programación con CUDA 22
23 Claves computacionales para la programación de GPUs Coalescing compute capability 1.0, 1.1 El acceso a memoria de los threads de un half-warp puede realizarse en uno o dos accesos a memoria si: Los threads acceden a palabras de 4 bytes (float, int) con lo que resulta en una operación de 64 bytes Los threads acceden a palabras de 8 bytes (float2, int2) con lo que resulta en una operación de 128 bytes Los threads acceden a palabras de 16 bytes (float4, int4) con lo que resulta en dos operaciones de 128 bytes Las 16 palabras accedidas por los 16 threads del halfwarp han de estar en el mismo segmento de memoria Los threads han de acceder en secuencia a las 16 palabras de memoria. O sea, el k-th thread accede a la k- th palabra Qué pasa con el tipo double (8 bytes)? Programación con CUDA 23
24 Claves computacionales para la programación de GPUs 1 acceso 16 accesos Programación con CUDA 24
25 Claves computacionales para la programación de GPUs Coalescing compute capability 1.2, 1.3 El acceso a memoria de los threads de un half-warp puede realizarse en un acceso a memoria si: Los threads acceden a palabras dentro del mismo segmento de memoria, siendo éste de tamaño: 32 bytes, si los threads acceden a palabras de 1 byte 64 bytes, si los threads acceden a palabras de 2 bytes 128 bytes, si los threads acceden a palabras de 4 ó 8 bytes El tamaño de segmento ha de ser el doble de las palabras a las que se accede salvo en el caso en el que las palabras son de 8 bytes Cuando el patrón de acceso a memoria requiere el uso de n-segmentos distintos, se realizarán n-accesos Programación con CUDA 25
26 Claves computacionales para la programación de GPUs 1 acceso 2 accesos Programación con CUDA 26
27 Claves computacionales para la programación de GPUs Alineación de segmentos 1ª fila 2ª fila Matriz 2x10 float. Tamaño de fila = 40 bytes Cuantos accesos se realizan? Alineado Total Segmento = 64 bytes 40 bytes Padding 6x4 = 24 bytes Programación con CUDA 27
28 Claves computacionales para la programación de GPUs Registros / Shared memory Uso beneficioso al ser memorias de baja latencia A compartir entre todos los threads del bloque Estamos limitados por sus tamaños Si nos excedemos, se hace uso de una memoria especial gestionada sólo por el compilador: local memory La local memory está ubicada en la device memory, por lo que tiene alta latencia Cómo controlamos el espacio gastado en registros y shared memory? Mediante un flag al compilador: -Xptxas=-v Programación con CUDA 28
29 Claves computacionales para la programación de GPUs Uso de cachés: Constant cache, Texture cache Su uso es beneficioso siempre que se produzca un cache hit Ante un cache miss, la latencia es la misma que la del acceso a memoria global Válidas cuando el problema presente cierta reutilización de datos Limitaciones: Tamaño Sólo lectura Reserva estática en la caché de constantes La misma palabra de la caché de constantes ha de ser accedida por todos los threads del half-warp En la práctica, el uso de la caché de texturas produce un aumento considerable en el rendimiento final del algoritmo Programación con CUDA 29
30 Claves computacionales para la programación de GPUs Bandwidth Medida que define el buen uso que realizamos de la memoria global Cada GPU tiene un peak bandwith que representa el máximo teórico que se puede alcanzar Bandwidth teórico para Geforce GTX280: (1107 Mhz x 10 6 x (512/8) x 2)/10 9 =141,6 Gbps 512-bit: wide memory interface, DDR: Double Data Rate Bandwidth efectivo: ((Br + Bw) / 10 9 ) / time(secs) (Gbps) Br: Bytes leídos Bw: Bytes escritos por el kernel Para su cálculo no se tiene en cuenta el acceso a cachés Un valor bajo indica que el punto de partida en la optimización del kernel es revisar el cómo se realiza el acceso a memoria Programación con CUDA 30
31 Claves computacionales para la programación de GPUs Ejemplo: Kernel con un acceso aleatorio a uno de sus vectores, este se encuentra en caché de texturas: Qué indica un valor alto de Bandwidth? Qué indica un valor bajo? Y un valor muy bajo? Programación con CUDA 31
32 Claves computacionales para la programación de GPUs Divergencia Ocurre cuando se producen saltos condicionales en el código Uso de sentencias if condicion then else Serialización hasta que se acaba el if Se pierde paralelismo al estar muchos threads parados Intentar evitar situaciones de este tipo Programación con CUDA 32
33 Claves computacionales para la programación de GPUs Transferencias CPU <-> GPU La CPU se comunica con la GPU por medio del bus PCIX Alta latencia en comparación con el acceso a memoria GDDR4, GDDR5 Peak Bandwidth = 8Gbps con PCIX 16x Gen2 Optimizar las transferencias: Comunicación CPU->GPU Procesamiento Resultados GPU->CPU En ciertos problemas, los datos a procesar pueden generarse directamente en la GPU sin necesidad de la comunicación inicial Programación con CUDA 33
34 Claves computacionales para la programación de GPUs Ocupación Mide el grado en el que el kernel que se ejecuta mantiene ocupados a los SMs Ratio entre los warps activos por SM y el máximo posible La ejecución de un warp mientras otro está pausado o estancado es la única forma de ocultar latencias y mantener el hardware ocupado Situaciones: Divergencia Accesos memoria Una alta ocupación no implica siempre un alto rendimiento Una baja ocupación imposibilita la ocultación de latencias, por lo que resulta en una reducción del rendimiento Se calcula con: Cuda occupancy calculator (xls) Cuda visual profiler Programación con CUDA 34
35 Claves computacionales para la programación de GPUs Se indica: Threads por bloque Registros usados por thread Shared memory por bloque Se obtiene: Ratio de ocupación = 100% Cuál es el número máximo de warps activos por SM para compute capability 1.3? Programación con CUDA 35
36 Claves computacionales para la programación de GPUs Active warps=32 100% Para y 240 threads por bloque se obtiene tambien 100% ocupación Recomendable usar multiplos del warp Registros: Hasta 16 por thread Shared memory: Hasta 4Kb por bloque * Programación con CUDA 36
37 Claves computacionales para la programación de GPUs Reglas para determinar el tamaño de bloque Número de threads múltiplo del tamaño del warp (32): Facilita coalescencia. Por qué? Evitar warps incompletos Si existen suficientes bloques por SM comenzar con un tamaño mayor o igual a 64 threads por bloque Entre 128 y 256 threads por bloque es una buena elección Comprobar experimentalmente con 512 Programación con CUDA 37
38 Claves computacionales para la programación de GPUs Cuda visual profiler Herramienta para medir parámetros de rendimiento de un kernel # número de accesos coalescentes # saltos condicionales, divergencia bandwidth, Obtiene valores de la estadística sobre varios SMs, no sobre el total Extrapola los resultados al total de SMs. Es una aproximación Bandwidth incluye todas las estructuras de memoria, no sólo las relevantes para el algoritmo Programación con CUDA 38
39 Claves computacionales para la programación de GPUs Optimización en operaciones: +, *, add-multiply: 8 operaciones/ciclo / : 0.88 operaciones/ciclo Uso de operaciones fast_math: comprobar precisión requerida Programación con CUDA 39
40 CUDA Computed Unified Device Architecture NVIDIA, Nov 2006: Arquitectura para computación paralela de propósito general Conjunto de extensiones al lenguaje C Será válida para otros lenguajes de alto nivel: C++, OpenCL, Fortran, DirectX Programación con CUDA 40
41 CUDA Identificación de threads, bloques, grid: int threadidx.x, threadidx.y, threadidx.z Identificador (x, y, z) del thread dentro del bloque int blockidx.x, blockidx.y, blockidx.z Identificador (x, y, z) del bloque dentro del grid int blockdim.x, blockdim.y, blockdim.z Tamaño (x, y, z) del bloque Identificador único de thread threadidx.x: Número de thread dentro de un bloque 1-D threadidx.x + (blockidx.x * blockdim.x): Identificador de thread único entre todos los bloques 1-D (grid) (threadidx.x, threadidx.y): Coordenadas del thread dentro de un bloque 2-D (threadidx.x + (blockidx.x * blockdim.x), threadidx.y + (blockidx.y * blockdim.y): Coordenadas del thread dentro del grid (con bloques 2-D) Programación con CUDA 41
42 CUDA Bloques 1-D thid = threadidx.x + (blockidx.x * blockdim.x) threadidx.x blockidx.x = 0 blockidx.x = 1 blockidx.x = 2 0 blockdim.x -1 Grid (3, 1) Si blockdim.x = 10 Los identificadores únicos de los threads, son: Bloque 0: 0..9 Bloque 1: Bloque 2: Programación con CUDA 42
43 CUDA Bloques 2-D blockdim.y blockdim.x blockidx.x = 0 blockidx.y = 0 blockidx.x = 1 blockidx.y = 0 blockidx.x = 0 blockidx.y = 1 blockidx.x = 1 blockidx.y = 1 blockidx.x = 0 blockidx.y = 2 Grid (3, 1) blockidx.x = 1 blockidx.y = 2 griddim.x griddim.y Grid (2, 3) Programación con CUDA 43
44 CUDA Bloques 2-D blockdim.x = 2 blockdim.y = 5 (threadidx.x,threadidx.y) (0,0) (0,1) (0,2) (0,3) (0,4) (1,0) (1,1) (1,2) (1,3) (1,4) (blockidx.x, blockidx.y) = (1,2) (2,10) (2,11) (2,12) (2,13) (2,14) (3,10) (3,11) (3,12) (3,13) (3,14) thidx = threadidx.x + (blockidx.x * blockdim.x) thidy = threadidx.y + (blockidx.y * blockdim.y) Programación con CUDA 44
45 CUDA Identificadores Porqué la notación es distinta para el caso de bloques 1-D y 2-D? 1-D eje cartesiano 2-D fila, columna matriz Normalmente cuando se definen bloques 2-D es para simplificar la referenciación a los elementos de una matriz También se podían haber referenciado mediante un eje cartesiano x Programación con CUDA 45 y
46 CUDA Identificadores Ejemplo 1-D: dim3 blocksize(10,1); dim3 gridsize(3,1); Ejemplo 2-D: dim3 blocksize(2,5); dim3 gridsize(2,3); Programación con CUDA 46
47 CUDA Invocación a kernels dim3 blocksize(2,5); dim3 gridsize(2,3); example_kernel<<<gridsize,blocksize>>>(param1, param2,..) Opcionalmente se puede indicar el tamaño de la memoria shared (si su reserva es dinámica): size_t sharedmemsize=256; // bytes example_kernel<<<gridsize,blocksize,sharedmemsize>>>(params...) Programación con CUDA 47
48 CUDA Invocación a kernels En el ejemplo anterior sharedmemsize=256 bytes Cuantos bytes hay disponibles por thread? Código host: fichero.cu Código device: fichero_kernel.cu global void example_kernel(params..) {.. } Programación con CUDA 48
49 CUDA device Función que se ejecuta en el device Invocable solamente desde el device global Función que se ejecuta en el device Invocable solamente desde el host host Función que se ejecuta en el host Invocable solamente desde el host Limitación kernels: Recursividad Número variable de parámetros Declaración de variables estáticas Programación con CUDA 49
50 CUDA Manejo de memoria Normalmente: Reserva lineal y dinámica Ej. Array N elementos float CPU: Notación h_nombre size_t size=n*sizeof(float); float *h_a=malloc(size); GPU: Device memory. Notación d_nombre size_t size=n*sizeof(float); float *d_a; cudamalloc((void **), &d_a,size); Programación con CUDA 50
51 CUDA Manejo de memoria Cualquier memoria reservada en el dispositivo sólo es referenciable desde los kernels Depuración complicada: printf s en host o modo emulación Copia de datos CPU->GPU cudamemcpy(d_a, h_a,size, cudamemcpyhosttodevice); Copia de datos GPU->CPU cudamemcpy(h_a, d_a,size, cudamemcpydevicetohost); Programación con CUDA 51
52 CUDA Ejemplo: Suma de dos vectores Código device // Kernel global void VecAdd_kernel(float *d_a, float * d_b, float *d_c, int N) { int i = threadidx.x + (blockidx.x * blockdim.x); if (i < N) d_c[i] = d_a[i] + d_b[i]; } Porqué comprobar i < N? Cuantos threads se ejecutan? Ocurre divergencia? Programación con CUDA 52
53 CUDA Código host int main(){ int N = 1000; size_t size = N * sizeof(float); int MAX_BLOCKSIZE = 256; //.. Asignar valores a los vectores, etc // Reserva en device float *d_a; cudamalloc((void **) &d_a, size); float *d_b; cudamalloc((void **) &d_b, size); float *d_c; cudamalloc((void **) &d_c, size); Programación con CUDA 53
54 CUDA //Copiar datos a la GPU cudamemcpy(d_a, h_a, size, cudamemcpyhosttodevice); cudamemcpy(d_b, h_a, size, cudamemcpyhosttodevice); //Topología bloques, grid int BLOCKSX=ceil((float) N/MAX_BLOCKSIZE); //3.90 -> 4 dim3 blocksize(max_blocksize,1); dim3 gridsize(blocksx,1); //Llamada al kernel VecAdd_kernel<<<gridsize, blocksize>>>(d_a, d_b, d_c, N); Programación con CUDA 54
55 CUDA //Obtener resultados de la GPU cudamemcpy(h_c, d_c, size, cudamemcpydevicetohost); //Liberar memoria GPU cudafree(d_a); cudafree(d_b); cudafree(d_c); //Liberar memoria CPU free(h_a); free(h_b); free(h_c); } Programación con CUDA 55
56 CUDA Inicialización de memoria //Inicializa size bytes de d_a a 0 cudamemset(d_a, 0, size); //Inicializa size bytes de d_a a 1 cudamemset(d_a, 1, size); //d_a[1]= Sincronización Establece un punto de sincronización (barrier) entre un conjunto de threads: dependiendo de donde se sitúe La sincronización dentro de un warp es implícita Las operaciones cudamemcpy conllevan una sincronización implícita Programación con CUDA 56
57 CUDA Sincronización Host: cudathreadsynchronize(); Kernel: syncthreads(); // Kernel global void VecAdd_kernel(float *d_a, float * d_b, float *d_c, int N) { int i = threadidx.x + (blockidx.x * blockdim.x); if (i < N){ d_c[i] = d_a[i] + d_b[i]; syncthreads(); Qué ocurre aquí? } } Programación con CUDA 57
58 CUDA Ejercicio 1: ~ejercicios/cudamallocandmemcpy Ejemplo de transferencia host->device, device->device y device- >host cudamallocandmemcpy.cu nvcc cudamallocandmemcpy.cu o cudamalloc 1. Inicializar h_a a n 2. Declarar d_a, d_b 3. Transferir h_a -> d_a 4. Transferir d_a -> d_b 5. Inicializar h_a a 0 6. Transferir d_b -> h_a 7. Comprobar resultado Programación con CUDA 58
59 CUDA Ejercicio 2: ~ejercicios/myfirstkernel/a Ejemplo de asignación en memoria de un valor myfirstkernel.cu, myfirstkernel_kernel.cu nvcc myfirstkernel.cu o mykernel 1. Declaración h_a, d_a 2. Definición grid, bloques 3. Ejecución del kernel 4. Sincronización 4. Transferencia d_a -> h_a 5. Comprobar resultados De qué tamaño son los bloques? Qué hace cada thread? Porqué se realiza una sincronización? Programación con CUDA 59
60 CUDA Ejercicio 3: ~ejercicios/myfirstkernel/b Ejemplo de funcionamiento en modo emulación myfirstkernelemu.cu, myfirstkernelemu_kernel.cu nvcc myfirstkernelemu.cu o mykernel -deviceemu Programación con CUDA 60
61 CUDA Shared memory Reserva estática: Dentro del kernel shared float d_sdata[256]; //Cada bloque dispone de 256 floats Reserva dinámica: Desde el host (en la llamada al kernel) se indica el tamaño extern shared float d_sdata[]; Programación con CUDA 61
62 CUDA Texture memory //Host cudabindtexture(null,d_texture,d_a); cudaunbindtexture(d_texture); //Declaración en el kernel como variable global texture<float, 1> d_texture; //Acceso float value = tex1dfetch(d_texture, index); Programación con CUDA 62
63 CUDA Constant memory //Declaración en el kernel como variable global extern constant int d_cdata[256]; // Copiar desde el host size_t size=256 * sizeof(int); size_t offset=0; //Offset en bytes a partir de donde se copia en d_cdata cudamemcpytosymbol(d_cdata, h_a,size, offset, cudamemcpyhosttodevice); //Acceso temp = d_cdata[i]; Programación con CUDA 63
64 CUDA Medida de tiempos GPU timers Milisegundos Precisión de medio microsegundo cudaevent_t start, stop; float time; cudaeventcreate(&start); cudaeventcreate(&end); cudaeventrecord(start, 0); example_kernel<<<gridsize,blocksize>>> cudaeventrecord(stop, 0); cudaeventsynchronize(stop); cudaeventelapsedtime(&time, start, stop); cudaeventdestroy(start); cudaeventdestroy(stop); Programación con CUDA 64
65 CUDA Medida de tiempos C timers <sys/time.h> Microsegundos En la práctica ambos métodos son equivalentes Necesaria la sincronización de threads antes de poner start y de medir stop struct timeval start, stop; double usecs; cudathreadsynchronize(); gettimeofday(&start, NULL); example_kernel<<<gridsize,blocksize>>> cudathreadsynchronize(); gettimeofday(&stop, NULL); usecs=(stop.tv_sec-start.tv_sec)*1e6+ (stop.tv_usec-start.tv_usec); Programación con CUDA 65
66 CUDA Librería CUTIL <cutil.h> Incluída en la SDK de desarrollo Macros CUT_INIT_DEVICE Inicializa el primer device que se encuentra CUDA_SAFE_CALL(call) Realiza una llamada a una función cuda y muestra un texto con el tipo de error que se ha producido CUT_EXIT Finaliza la ejecución de un programa forzando a pulsar una tecla Funciones Parsing de los parámetros indicados en la línea de comandos Comparación de arrays para comparar CPU y GPU Timers Conflictos en shared memory Programación con CUDA 66
67 CUDA El toolkit de CUDA incluye Librería runtime de CUDA: cudart Librería FFT: cufft Librería BLAS (Algebra lineal): cublas Librerías de terceros cudpp: CUDA Data Parallel Primitives CULA: LAPACK (Algebra lineal) GPULib: Librerías matemáticas para IDL y MATLAB VSIPL: Procesamiento de señales cusparseblas: En desarrollo. Dpto. Arquitectura UAL Programación con CUDA 67
68 CUDA Compilación nvcc: Compilador de NVIDIA Flags -deviceemu: Modo emulación. Admite printf s en kernels -O2, -O3: Flags optimización gcc, sólo aplicables al código del host -use_fast_math: Usar implementación de funciones rápidas. El compilador las cambia automaticamente -Xptxas=-v. Ver ocupación de registros y shared memory -arch=sm11 sm12 sm13. Compilar para una determinada compute capability Si se compila < sm13, el tipo double se transforma en float dentro del kernel, pero no dentro del host scons Útil para linkar códigos C++, C, con.cu Necesita script cuda.py en phyton Programación con CUDA 68
69 Ejercicios Ejercicio 4: ~ejercicios/reversearray/singleblock reversearray_singleblock.cu, reversearraysb_kernel.cu nvcc reversearray_singleblock.cu o reversearray Cuantos bloques se ejecutan? De qué tamaño es el bloque? Cuantos SMs trabajan? Qué hace cada thread? d_out[255]=d_in[0] d_out[254]=d_in[1] d_out[253]=d_in[2] Se realiza un acceso coalescente en d_in y d_out? Para compute capability 1.0 y 1.1 Para compute capability 1.2 y 1.3 Programación con CUDA 69
70 Ejercicios Ejercicio 5: ~ejercicios/reversearray/multiblock reversearray_multiblock.cu, reversearraymb_kernel.cu nvcc reversearray_multiblock.cu o reversearray Tamaño de bloque? Número de bloques? Cuantos SMs trabajan? Qué valores toman inoffset y outoffset? Qué valores toman in y out? Coalescencia en d_in y d_out? Programación con CUDA 70
71 Ejercicios Ejercicio 6: ~ejercicios/reversearray/multiblockfast reversearray_multiblockfast.cu, reversearraymbf_kernel.cu nvcc reversearray_multiblockfast.cu o reversearray Qué se guarda en sdata? Se realiza la copia en d_out igual que en los ejercicios anteriores? sdata[9]=d_in[0] sdata[8]=d_in[1] sdata[0]=d_in[9] d_out[50]=sdata[0] // d_in[9] d_out[51]=sdata[1] // d_in[8] d_out[59]=sdata[9] // d_in[0] Programación con CUDA 71
72 Ejercicios Ejercicio 7: ~ejercicios/vecadd vecadd.cu, vecadd_kernel.cu nvcc vecadd.cu o vecadd./vecadd //N = 100, Tamaño bloque = 256, verbose = 1 Flags entrada: N: Tamaño vector, MAX_BLOCKSIZE: Tamaño de bloque, verbose: Salida por pantalla El programa realiza la suma de dos vectores: C = A + B Medir tiempos para: Copia datos GPU, ejecución kernel, copia datos CPU. Se necesita algún punto de sincronización? N = 10000, , 1e6 MAX_BLOCKSIZE = 16, 32, 64, 128, 256, 512 Un grupo con cudaeventcreate y otro con gettimeofday Porqué la duración del kernel no va en proporción al tamaño del vector? Calcular la ocupación mediante Cuda Occupancy Calculator Calcular el ancho de banda para cada configuración Programación con CUDA 72
73 Ejercicios Ejercicio 7: Resultados para 9500 GT sec 1e4 1e5 1e6 16 0,2477 1, , ,1823 1, , ,1781 1, , ,1766 1, , ,1721 1, , ,1860 1, ,5409 Programación con CUDA 73
74 Ejercicios Ejercicio 7: Resultados para GTX 285 sec 1e4 1e5 1e6 16 0,0808 0,4604 4, ,0600 0,2497 2, ,0506 0,1455 1, ,0513 0,1327 0, ,0510 0,1367 0, ,0533 0,1428 0,9559 Programación con CUDA 74
75 Ejercicios Ejercicio 7: Cuda Occupancy Calculator nvcc vecadd.cu o vecadd -Xptxas=-v 4 Registros + 44 bytes shared memory GT 33 % 33 % 67 % 100 % 100 % 67 % 285 GTX 25 % 25 % 50 % 100 % 100 % 100 % Programación con CUDA 75
76 Ejercicios Ejercicio 7: Peak Bandwidth=25.6 GDDR3, 16.0 GDDR2 Gbps 9500 GT 1e4 1e5 1e6 16 4,8446 6,2118 6, ,5826 8,9425 9, ,7378 9,1863 9, ,7950 9,2251 9, ,9727 9,2173 9, ,4516 9,1165 9,5687 Programación con CUDA 76
77 Ejercicios Ejercicio 7: Peak Bandwidth=159.0 Gbps GTX 285 1e4 1e5 1e , , , , , , , , , , , , , , , , , ,5361 Programación con CUDA 77
78 Ejercicios Ejercicio 7: Cuda Visual Profiler Parámetro gpu time cpu time occupancy grid size X branch divergent branch instructions gld request gst request 9500 GT GTX Programación con CUDA 78
79 Ejercicios Cuda Visual Profiler Gpu time stamp: Marca de tiempo para el kernel a ejecutar Method: Operación memcpy* o ejecución de un kernel GPU Time: Tiempo en GPU CPU Time: Tiempo en CPU occupancy: Ratio entre warps activos por SM y máximo gld uncoalesced: Número de lecturas de memoria no coalescentes gld coalesced: Número de lecturas de memoria coalescentes gld request: Número total de lecturas en memoria gst uncoalesced: Número de escrituras en memoria no coalescentes gst coalesced: Número de escrituras en memoria coalescentes gst request: Número total de escrituras en memoria gst_32/64/128b: Número de transacciones de escritura en memoria de 32, 64 ó 128 bytes Programación con CUDA 79
80 Ejercicios tlb hit: Aciertos en caché de constantes tlb miss: Fallos en caché de constantes sm cta launched: Número de bloques ejecutados en un SM branch: Número de saltos realizados por los threads en la ejecución de un kernel divergent branch: Número de saltos divergentes dentro de un warp warp serialize: Número de warps serializados debido a un conflicto de direccionamiento en la memoria shared o caché de constantes. cta launched: Número de bloques ejecutados grid size X, Y: Número de bloques en X, Y block size X, Y, Z: Número de threads por bloque en X, Y, Z dyn sm per block: Tamaño de memoria shared dinámica por bloque (bytes) sta smem per block: Tamaño de memoria shared estática por bloque (bytes) reg per thread: Número de registros por thread Programación con CUDA 80
81 Ejercicios Cuda Visual Profiler Desafortunadamente, no todos los valores están disponibles para todas las GPUs Saber interpretar los valores, ya que se corresponden con la ejecución de varios SMs, no del total Útil en la comparación de un mismo parámetro después de la optimización del código Parámetros resúmen: GPU usec CPU usec % GPU time Bandwidth read, write, overall Gbps Instruction throughput Programación con CUDA 81
82 Ejercicios Ejercicio 8 Producto matriz densa por vector: u = A v Dimensiones A: N x M, u: N, v: M Inicializar A y v aleatoriamente Con <stdlib.h>: srand48(time(null)) para establecer semilla drand48() genera un float [0, 1) Realizar código secuencial para comprobar que el kernel es correcto, comprobar con una matriz p.ej 5 x 5 Una vez comprobado, comprobar que la suma de los elementos del vector obtenido mediante la CPU es el mismo valor que se obtiene con la GPU Parámetros de entrada del programa: N: Número de filas M: Número de columnas BLOCKSIZE: Tamaño del bloque 1-D Verbose: Salida por pantalla si es 1 Iterations: Iteraciones del kernel Programación con CUDA 82
83 Ejercicios Ejercicio 8: Código secuencial for (i = 0; i < N; i++) { u[ i ]=0; for (j = 0; j < M; j++) u[ i ]+=A[ i*m+ j ] * v[ j ]; } Programación con CUDA 83
84 Ejercicios Medir tiempos para: Transferencia CPU->GPU Ejecución del kernel Transferencia GPU->CPU, recordar si es necesario usar puntos de sincronización Calcular ocupación y bandwidth Obtener la tabla de tiempos usando los dos mejores valores de BLOCKSIZE y para A=1000x2000, 2000x1000, 2000x5000 y 5000x5000 Preguntas: Para qué estructuras (u, A, v) se realiza un acceso coalescente a memoria? Comentar topología de bloques/threads usada: Cuantos threads calculan una fila? Se podría usar más de 1 thread por fila?. Ventajas/Inconvenientes Precisión en los resultados. Hay diferencias?, Por qué? Programación con CUDA 84
85 Ejercicios Mejoras a realizar: Usar la caché de texturas para almacenar el vector v Almacenar la matriz por columnas Qué se gana con esta optimización? Usar la memoria shared para realizar productos parciales de cada fila y usar más threads por fila Se te ocurre alguna optimización sobre la actualización de cada valor de u? Repetir el estudio de tiempos realizado para las optimizaciones planteadas y comparar con la versión inicial Obtener los ratios más importantes de cuda visual profiler Programación con CUDA 85
86 Ejercicios Ejercicio 8: Cuda Occupancy Calculator nvcc mv.cu o mv -Xptxas=-v 8 Registros + 48 bytes shared memory Occupancy GT 33 % 33 % 67 % 100 % 100 % 67 % Programación con CUDA 86
87 Ejercicios Ejercicio 8: Resultados para 9500 GT Iterations = 100, BLOCKSIZE = 128 N x M/sec 1000x x x x5000 CPU-GPU 0, , , , Kernel 2, , , , GPU-CPU 0, , , , Bandwith 0, , , , Programación con CUDA 87
88 Ejercicios Ejercicio 8: Resultados para 9500 GT Iterations = 100, BLOCKSIZE = 256 N x M/sec 1000x x x x5000 CPU-GPU 0, , , , Kernel 2, , , , GPU-CPU 0, , , , Bandwith 0, , , , Programación con CUDA 88
89 Ejercicios Ejercicio 8 Preguntas: Por qué se obtiene mejor rendimiento para 2000x1000 que para 1000x2000? Por qué el bandwidth es extremadamente bajo? Programación con CUDA 89
90 Ejercicios Ejercicio 8: Resultados para 9500 GT usando caché de texturas Iterations = 100, BLOCKSIZE = 128 N x M/sec 1000x x x x5000 CPU-GPU 0, , , , Kernel 1, , , , GPU-CPU 0, , , , Bandwith 1, , , , Programación con CUDA 90
91 Ejercicios Ejercicio 8: Resultados para 9500 GT usando caché de texturas Iterations = 100, BLOCKSIZE = 256 N x M/sec 1000x x x x5000 CPU-GPU 0, , , , Kernel 1, , , , GPU-CPU 0, , , , Bandwith 1, , , , Programación con CUDA 91
92 Ejercicios Ejercicio 8: Cuda Visual Profiler Iterations = 100, BLOCKSIZE = 256, 2000x5000 gputime cputime occupancy gridsizex gridsizey blocksizex blocksizey blocksizez StaSmemperblock 1ª versión caché Programación con CUDA 92
93 Ejercicios Ejercicio 8: Cuda Visual Profiler Iterations = 100, BLOCKSIZE = 256, 2000x5000 Registersperthread Sm_cta_launched branch divergentbranch instructions warp_serialize cta_launched 1ª versión caché Programación con CUDA 93
Computación en procesadores gráficos
Programación con CUDA José Antonio Martínez García Francisco M. Vázquez López Manuel Ujaldón Martínez Portada Ester Martín Garzón Universidad de Almería Arquitectura de las GPUs Contenidos Modelo de programación
Más detallesPrimeros pasos con CUDA. Clase 1
Primeros pasos con CUDA Clase 1 Ejemplo: suma de vectores Comencemos con un ejemplo sencillo: suma de vectores. Sean A, B y C vectores de dimensión N, la suma se define como: C = A + B donde C i = A i
Más detallesPROGRAMACIÓN AVANZADA DE GPUs PARA APLICACIONES CIENTÍFICAS
Grupo de Ing. Electrónica aplicada a Espacios INteligentes y TRAnsporte Área Audio-Visual PROGRAMACIÓN AVANZADA DE GPUs PARA APLICACIONES CIENTÍFICAS Torrevieja (Alicante) Del 19 al 22 de Julio Álvaro
Más detallesArquitecturas y programación de procesadores gráficos. Nicolás Guil Mata Dpto. de Arquitectura de Computadores Universidad de Málaga
Arquitecturas y programación de procesadores gráficos Dpto. de Arquitectura de Computadores Universidad de Málaga Indice Arquitectura de las GPUs Arquitectura unificada Nvidia: GT200 Diagrama de bloques
Más detallesINTRODUCCIÓN A LA COMPUTACIÓN PARALELA CON GPUS
INTRODUCCIÓN A LA COMPUTACIÓN PARALELA CON GPUS Sergio Orts Escolano sorts@dtic.ua.es Vicente Morell Giménez vmorell@dccia.ua.es Universidad de Alicante Departamento de tecnología informática y computación
Más detallesDESARROLLO DE APLICACIONES EN CUDA
DESARROLLO DE APLICACIONES EN CUDA Curso 2014 / 15 Procesadores Gráficos y Aplicaciones en Tiempo Real Alberto Sánchez GMRV 2005-2015 1/30 Contenidos Introducción Debugging Profiling Streams Diseño de
Más detallesComputación de Propósito General en Unidades de Procesamiento Gráfico GPGPU. Clase 5 Programación Avanzada y Optimización
Computación de Propósito General en Unidades de Procesamiento Gráfico () P. Ezzatti, M. Pedemontey E. Dufrechou Clase 5 Programación Avanzada y Optimización Contenido Memoria compartida Conflicto de bancos
Más detallesComputación de Propósito General en Unidades de Procesamiento Gráfico GPGPU
Computación de Propósito General en Unidades de Procesamiento Gráfico () E. Dufrechou, P. Ezzatti, M. Pedemontey J.P. Silva Clases 4 Programación Contenido Modelo de programación Introducción Programación
Más detallesModelo de aplicaciones CUDA
Modelo de aplicaciones CUDA Utilización de GPGPUs: las placas gráficas se utilizan en el contexto de una CPU: host (CPU) + uno o varios device o GPUs Procesadores masivamente paralelos equipados con muchas
Más detallesCUDA Overview and Programming model
Departamento de Ciencias de la computación Universidad de Chile Modelado en 3D y sus Aplicaciones en Realidad Virtual CC68W CUDA Overview and Programming model Student: Juan Silva Professor: Dr. Wolfram
Más detallesSUMA de Vectores: Hands-on
SUMA de Vectores: Hands-on Clase X http://fisica.cab.cnea.gov.ar/gpgpu/index.php/en/icnpg/clases Algunas preguntas practicas (1) Que pasa si los vectores a sumar son muy grandes? (2) Como saber en que
Más detallesComputación matricial dispersa con GPUs y su aplicación en Tomografía Electrónica
con GPUs y su aplicación en Tomografía Electrónica F. Vázquez, J. A. Martínez, E. M. Garzón, J. J. Fernández Portada Universidad de Almería Contenidos Computación matricial dispersa Introducción a SpMV
Más detallesProgramando la GPU con CUDA RIO 2014 Río Cuarto (Argentina), 17 y 18 de Febrero, 2014. Agradecimientos. Prerrequisitos para este tutorial
Programando la GPU con CUDA RIO 2014 Río Cuarto (Argentina), 17 y 18 de Febrero, 2014 Manuel Ujaldon Nvidia CUDA Fellow Profesor del Dpto. de Arquitectura de Computadores. Universidad de Málaga (España).
Más detallesGPGPU Avanzado. Sistemas Complejos en Máquinas Paralelas. Esteban E. Mocskos (emocskos@dc.uba.ar) 5/6/2012
Sistemas Complejos en Máquinas Paralelas GPGPU Avanzado Esteban E. Mocskos (emocskos@dc.uba.ar) Facultad de Ciencias Exactas y Naturales, UBA CONICET 5/6/2012 E. Mocskos (UBA CONICET) GPGPU Avanzado 5/6/2012
Más detallesMemorias, opciones del compilador y otras yerbas. Clase 3
Memorias, opciones del compilador y otras yerbas Clase 3 Memorias en CUDA Grid CUDA ofrece distintas memorias con distintas características. Block (0, 0) Shared Memory Block (1, 0) Shared Memory registros
Más detallesProgramando la GPU con CUDA
Programando la GPU con CUDA Curso en el Dpto. de Matemáticas e Informática. UIB. 23 al 25 de Junio, 2014. Manuel Ujaldon Nvidia CUDA Fellow Profesor Titular del Dpto. de Arquitectura de Computadores. Universidad
Más detallesKepler. 1. Presentación de la arquitectura. Índice de contenidos [25 diapositivas] Kepler, Johannes (1571-1630)
Índice de contenidos [25 diapositivas] Manuel Ujaldón Nvidia CUDA Fellow Dpto. Arquitectura de Computadores Universidad de Málaga 1. Presentación de la arquitectura [3] 2. Los cores y su organización [7]
Más detallesArquitecturas GPU v. 2013
v. 2013 Stream Processing Similar al concepto de SIMD. Data stream procesado por kernel functions (pipelined) (no control) (local memory, no cache OJO). Data-centric model: adecuado para DSP o GPU (image,
Más detallesComputación de Propósito General en Unidades de Procesamiento Gráfico GPGPU
Computación de Propósito General en Unidades de Procesamiento Gráfico () E. Dufrechou, P. Ezzatti M. Pedemonte Práctico Programación con CUDA Práctica 0: Ejecución del ejemplo visto en teórico (suma de
Más detallesDescubriendo Kepler. 1. Presentación de la arquitectura. Agradecimientos. Indice de contenidos [46 diapositivas]
Agradecimientos Descubriendo Kepler Manuel Ujaldón Nvidia CUDA Fellow Dpto. Arquitectura de Computadores Universidad de Málaga A los ingenieros de Nvidia, por compartir ideas, material, diagramas, presentaciones,...
Más detallesBloque IV. Prácticas de programación en CUDA. David Miraut Marcos García Ricardo Suárez
Bloque IV Prácticas de programación en CUDA David Miraut Marcos García Ricardo Suárez Control de flujo Situaciones no tratadas Claves con tamaños diferentes. Cada Wrap debería acceder a claves del mismo
Más detallesArquitectura de Computadoras para Ingeniería
Departamento de Cs. e Ingeniería de la Computación Universidad Nacional del Sur Arquitectura de Computadoras para Ingeniería Ejercicios Trabajo Práctico N 7 Jerarquía de Memoria Primer Cuatrimestre de
Más detallesLibrería Thrust. Clase 4. http://fisica.cab.cnea.gov.ar/gpgpu/index.php/en/icnpg/clases
Librería Thrust Clase 4 http://fisica.cab.cnea.gov.ar/gpgpu/index.php/en/icnpg/clases Hasta aquí... CUDA C/C++ Control de bajo nivel del mapeo al hardware Desarrollo de algoritmos de alta performance.
Más detallesSISTEMAS OPERATIVOS Arquitectura de computadores
SISTEMAS OPERATIVOS Arquitectura de computadores Erwin Meza Vega emezav@unicauca.edu.co Esta presentación tiene por objetivo mostrar los conceptos generales de la arquitectura de los computadores, necesarios
Más detallesArquitectura de GPUs
Arquitectura de GPUs Carlos Bederián, Nicolás Wolovick FaMAF, Universidad Nacional de Córdoba, Argentina 1 de Agosto de 2012 ECAR12@DC.UBA Revisión 3739, 2012-08-02 Introducción Organización GPU: cálculo
Más detallesProgramación. Test Autoevaluación Tema 3
Programación Test Autoevaluación Tema 3 Autores: M. Paz Sesmero Lorente Paula de Toledo Heras Fco. Javier Ordoñez Morales Juan Gómez Romero José A. Iglesias Martínez José Luis Mira Peidro SOLUCIONES 1.
Más detallesEjemplos de optimización para Kepler. 1. Balanceo dinámico de la carga. Contenidos de la charla [18 diapositivas]
Ejemplos de optimización para Kepler Manuel Ujaldón Nvidia CUDA Fellow Dpto. Arquitectura de Computadores Universidad de Málaga Contenidos de la charla [18 diapositivas] 1. Balanceo dinámico de la carga.
Más detallesUniversidad de Córdoba. Trabajo de Fin de Máster
Universidad de Córdoba Máster en Sistemas Inteligentes Trabajo de Fin de Máster Minería de Reglas de Asociación en GPU Córdoba, Julio de 2013 Autor: Alberto Cano Rojas Director: Dr. Sebastián Ventura Soto
Más detallesTutorial CUDA Univ. de Santiago. 6 y 7 de Agosto, 2013
Tutorial CUDA Univ. de Santiago. 6 y 7 de Agosto, 2013 La suma por reducción Este código realiza la suma de un vector de N elementos mediante un operador binario de reducción, es decir, en log 2 (N) pasos.
Más detallesEjercicios de jerarquía de memoria
Ejercicios de jerarquía de memoria J. Daniel García Sánchez (coordinador) David Expósito Singh Javier García Blas Óscar Pérez Alonso J. Manuel Pérez Lobato Arquitectura de Computadores Grupo ARCOS Departamento
Más detallesTaller: Introducción a GPU's y Programación CUDA para HPC
Taller: Introducción a GPU's y Programación CUDA para HPC Amilcar Meneses Viveros Departamento de Computación CINVESTAV-IPN / LUFAC Computación Julio 2011 CONTENIDO I.- INTRODUCCION A GPU's Y CUDA 1.1
Más detallesDesde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.
Tipos de Datos Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial. Entrada de datos Procesamientos de datos Salida de resultados Los
Más detallesFUNDAMENTOS DE COMPUTACIÓN PARA CIENTÍFICOS. CNCA Abril 2013
FUNDAMENTOS DE COMPUTACIÓN PARA CIENTÍFICOS CNCA Abril 2013 6. COMPUTACIÓN DE ALTO RENDIMIENTO Ricardo Román DEFINICIÓN High Performance Computing - Computación de Alto Rendimiento Técnicas, investigación
Más detallesElectrónica Digital II
Electrónica Digital II TIPOS DE MEMORIAS MEMORIA DDR MEMORIA DDR2 MEMORIA DDR3 COMPARACIÓN TIEMPOS DE ACCESO TIPOS DE LATENCIAS RAS CAS ACTIVIDAD PRECARGA TIPOS DE CONFIGURACIONES SINGLE CHANNEL DUAL CHANNEL
Más detallesExtracción paralela de valores propios en matrices Toeplitz simétricas usando hardware gráfico
Extracción paralela de valores propios en matrices Toeplitz simétricas usando hardware gráfico Tesis de Máster en Computación Paralela y Distribuida de: Leandro Graciá Gil Dirigida por: Antonio Manuel
Más detallesComputación de Propósito General en Unidades de Procesamiento Gráfico GPGPU
Computación de Propósito General en Unidades de Procesamiento Gráfico () R. Bayá, E. Dufrechou, P. Ezzattiy M. Pedemonte Clase 1 Introducción Contenido Un poco de historia El pipeline gráfico Tarjetas
Más detallesMúltiples GPU (y otras chauchas)
Múltiples GPU (y otras chauchas) Clase 16, 21/11/2013 http://fisica.cab.cnea.gov.ar/gpgpu/index.php/en/icnpg/clases Carlos Bederián bc@famaf.unc.edu.ar IFEG-CONICET, FaMAF-UNC Motivación No desperdiciar
Más detallesDefinición de Memoria
Arquitectura de Ordenadores Representación de Datos en Memoria Abelardo Pardo abel@it.uc3m.es Universidad Carlos III de Madrid Departamento de Ingeniería Telemática Definición de Memoria DRM-1 La memoria
Más detallesDiseño de compiladores. Organización de memoria. Organización de memoria. Organización de memoria. Zona de código 04/05/2014 ORGANIZACIÓN DE MEMORIA
Diseño de compiladores Gestión de la memoria / Generación de código ORGANIZACIÓN DE MEMORIA Organización de memoria Depende del tipo de lenguaje (declarativos, imperativos), del compilador y del sistema
Más detallesOrganización lógica Identificación de bloque
Cómo se encuentra un bloque si está en el nivel superior? La dirección se descompone en varios campos: Etiqueta (tag): se utiliza para comparar la dirección requerida por la CPU con aquellos bloques que
Más detallesSeminario II: Introducción a la Computación GPU
Seminario II: Introducción a la Computación GPU CONTENIDO Introducción Evolución CPUs-Evolución GPUs Evolución sistemas HPC Tecnologías GPGPU Problemática: Programación paralela en clústers heterogéneos
Más detallesFUNDAMENTOS DE COMPUTACION INVESTIGACION PROCESADORES DIANA CARRIÓN DEL VALLE DOCENTE: JOHANNA NAVARRO ESPINOSA TRIMESTRE II
FUNDAMENTOS DE COMPUTACION INVESTIGACION PROCESADORES DIANA CARRIÓN DEL VALLE DOCENTE: JOHANNA NAVARRO ESPINOSA TRIMESTRE II 2013 Características principales de la arquitectura del procesador AMD Phenom
Más detallesSistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria
1.2. Jerarquía de niveles de un computador Qué es un computador? Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria Es un sistema tan complejo
Más detallesIntroducción a los Sistemas Operativos
Introducción a los Sistemas Operativos Pedro Corcuera Dpto. Matemática Aplicada y Ciencias de la Computación Universidad de Cantabria corcuerp@unican.es 1 Índice General Conceptos sobre ordenadores Concepto
Más detallesProcesadores de lenguaje Tema 6 La tabla de símbolos
Procesadores de lenguaje Tema 6 La tabla de símbolos Departamento de Ciencias de la Computación Universidad de Alcalá Resumen La tabla de símbolos. Requerimientos de información. Diseño de la tabla de
Más detallesUniversidad Complutense de Madrid FACULTAD DE INFORMÁTICA
Universidad Complutense de Madrid FACULTAD DE INFORMÁTICA INGENIERÍA EN INFORMÁTICA SISTEMAS INFORMÁTICOS ALGORITMOS PARA GRAFOS Y PROGRAMACIÓN DE PROPÓSITO GENERAL EN CUDA Ezequiel Denegri Guillermo Frontera
Más detallesArquitectura de aceleradores. Carlos Bederián IFEG CONICET GPGPU Computing Group FaMAF UNC bc@famaf.unc.edu.ar
Arquitectura de aceleradores Carlos Bederián IFEG CONICET GPGPU Computing Group FaMAF UNC bc@famaf.unc.edu.ar Contenidos Cómo llegamos hasta acá Qué hay ahora Qué hace Cómo lo uso Hacia dónde parece que
Más detallesFLAG/C. Una API para computación matricial sobre GPUs. M. Jesús Zafont Alberto Martín Francisco Igual Enrique S. Quintana-Ortí
FLAG/C Una API para computación matricial sobre GPUs M. Jesús Zafont Alberto Martín Francisco Igual Enrique S. Quintana-Ortí High Performance Computing & Architectures Group Universitat Jaume I de Castellón
Más detallesTécnicas de paralelización de código para robots basados en emociones
1 UNIVERSIDAD POLITECNICA DE VALENCIA G R A D O E N I N G E N I E R Í A I N F O R M Á T I C A Técnicas de paralelización de código para robots basados en emociones TRABAJO FINAL DE GRADO Autor: Francisco
Más detallesUtilización de la programación paralela en procesadores gráficos para el cálculo científico.
Utilización de la programación paralela en procesadores gráficos para el cálculo científico. EMNO 2013 Rolando E. Rodríguez Fernández Medicina Computacional, Instituto de Nefrología. y Facultad de Física,
Más detallesTema 2. El lenguaje JAVA
Tema 2. El lenguaje JAVA Nomenclatura habitual Variables Tipos de variables Tipos primitivos Referencias Arrays Operadores Operadores de Java Precedencia de operadores Sentencias de control Sentencias
Más detallesIntroducción. Por último se presentarán las conclusiones y recomendaciones pertinentes.
Introducción En el presente documento se explicarán las consideraciones realizadas para implementar la convolución bidimensional en la arquitectura CUDA. En general se discutirá la metodología seguida
Más detalles16bits: Tamaño total: 2 16 Tamaño página: 2 13 nº de páginas: 2 16 / 2 13 = 2 3 = 8 páginas Tamaño de tabla: 2 3 *2B = 16B por tabla
Calcule el espacio de memoria necesario de una tabla de página de un nivel para un espacio de direcciones de 16bits, 32bits, 48bits y 64bits. Asuma que cada entrada de página es del mismo tamaño que el
Más detallesKepler. 1. Presentación de la arquitectura. Contenidos de la charla. Kepler, Johannes (1571-1630)
Contenidos de la charla Manuel Ujaldón Nvidia CUDA Fellow Dpto. Arquitectura de Computadores Universidad de Málaga 1. Presentación de la arquitectura [7 diapositivas] 2. La memoria y el transporte de datos
Más detallesAgradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1
Prologo Agradecimientos Nota de los autores Índice general I III V VII 1 Problemas, algoritmos y programas 1 1.1 Programas y la actividad de la programación.................... 4 1.2 Lenguajes y modelos
Más detallesTema: Microprocesadores
Universidad Nacional de Ingeniería Arquitectura de Maquinas I Unidad I: Introducción a los Microprocesadores y Microcontroladores. Tema: Microprocesadores Arq. de Computadora I Ing. Carlos Ortega H. 1
Más detallesSoluciones a los problemas impares. Tema 5. Memorias. Estructura de Computadores. I. T. Informática de Gestión / Sistemas
Tema 5. Soluciones a los problemas impares Estructura de Computadores I. T. Informática de Gestión / Sistemas Curso 28-29 Tema 5 Hoja: 2 / 36 Tema 5 Hoja: 3 / 36 Base teórica La memoria es el lugar en
Más detallesProcesos e Hilos en C
Procesos e Hilos en C 6 de febrero de 2012 En esta sesión vamos a escribir programas en lenguaje C que utilicen hilos y procesos para comparar el rendimiento del sistema ante la gestión de unos y otros.
Más detallesTile64 Many-Core. vs. Intel Xeon Multi-Core
Tile64 Many-Core vs. Intel Xeon Multi-Core Comparación del Rendimiento en Bioinformática Myriam Kurtz Francisco J. Esteban Pilar Hernández Juan Antonio Caballero Antonio Guevara Gabriel Dorado Sergio Gálvez
Más detallesUNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.
UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO. TRUJILLO 1.- Resumen de Prog1 Comentarios es C++ Declaraciones de variables.
Más detallesTodo programa en 'C' consta de una o más funciones, una de las cuales se llama main.
LENGUAJE C CARACTERISTICAS DEL LENGUAJE 'C' El lenguaje 'C' se conoce como un lenguaje compilado. Existen dos tipos de lenguaje: interpretados y compilados. Los interpretados son aquellos que necesitan
Más detallesMemorias RAM. Basilio B. Fraguela Rodríguez. Copyright Basilio B. Fraguela 2006
Memorias RAM Basilio B. Fraguela Rodríguez Evolución de la velocidad del procesador y la memoria 1000 Ley de Moore CPU µproc 60%/año 100 10 1 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 DRAM 1990
Más detallesHerramientas para el estudio de prestaciones en clusters de computación científica, aplicación en el Laboratorio de Computación Paralela
Introducción Herramientas Estudio Conclusiones Herramientas para el estudio de prestaciones en clusters de computación científica, aplicación en el Laboratorio de Computación Paralela Ingeniería en Informática
Más detallesJerarquía de memoria - Motivación
Jerarquía de memoria - Motivación Idealmente uno podría desear una capacidad de memoria infinitamente grande, tal que cualquier. palabra podría estar inmediatamente disponible Estamos forzados a reconocer
Más detallesTema 5: Memorias. Espacio reservado para notas del alumno
Tema 5: Memorias S Definiciones S Parámetros característicos S Jerarquía de memoria S Dispositivos de almacenamiento S Clasificación S Fundamentos de las memorias S Memoria caché / Memoria virtual S Memoria
Más detallesTema 6 (II) Jerarquía de Memoria
Tema 6 (II) Jerarquía de Memoria Grupo ARCOS Estructura de Computadores Grado en Ingeniería Informática Universidad Carlos III de Madrid Contenidos 1. Memoria cache Introducción: Acceso a bloque y principio
Más detallesPrincipios de Computadoras II
Departamento de Ingeniería Electrónica y Computadoras Ing. Ricardo Coppo rcoppo@uns.edu.ar Qué es un Objeto? Un objeto es una instancia de una clase Las clases actuán como modelos que permiten la creación
Más detallesArquitectura de Computadores II Clase #7
Arquitectura de Computadores II Clase #7 Facultad de Ingeniería Universidad de la República Instituto de Computación Curso 2009 Veremos Memoria virtual Resumen de ideas para mejorar performance 1 Recordemos:
Más detallesMemoria. Organización de memorias estáticas.
Memoria 1 Memoria Organización de memorias estáticas. 2 Memoria En memoria físicas con bus de datos sea bidireccional. 3 Memoria Decodificación en dos niveles. 4 Necesidad de cantidades ilimitadas de memoria
Más detallesMemoria Dinámica. Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez
Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez 1. PUNTEROS 2. MEMORIA DINÁMICA 2 1. PUNTEROS 3 Qué es un puntero? Un tipo de variable cuyo valor es la dirección de memoria de otra variable.
Más detallesProgramación de GPUs con CUDA
Programación de GPUs con CUDA Alvaro Cuno 23/01/2010 1 Agenda GPUs Cuda Cuda + OpenGL 2 GPUs (Graphics Processing Units) 3 Supercomputadores Mapa de los 100 supercomputadores Sudamérica: posiciones 306
Más detallesFundamentos de Programación 2017-I
Fundamentos de Programación 2017-I Fundamentos para la construcción de código a partir del algoritmo Objetivo: El alumno construirá programas utilizando el lenguaje de programación C a través de un análisis
Más detallesLa memoria del ordenador
La memoria del ordenador Alberto Molina Coballes David Sánchez López Fundamentos de Hardware Diciembre 2011 La memoria Desde el punto de vista informático, memoria es todo dispositivo que es capaz de:
Más detallesIntroducción a la Computación. Capítulo 10 Repertorio de instrucciones: Características y Funciones
Introducción a la Computación Capítulo 10 Repertorio de instrucciones: Características y Funciones Que es un set de instrucciones? La colección completa de instrucciones que interpreta una CPU Código máquina
Más detallesCPU MEMORIAS CACHE. Memorias caché. Memoria caché = memoria de tamaño pequeño y acceso rápido situada entre la CPU y la memoria principal.
MEMORIAS CACHE Memoria caché = memoria de tamaño pequeño y acceso rápido situada entre la CPU y la memoria principal. Tiempo ciclo memoria > tiempo de ciclo del procesador la CPU debe esperar a la memoria
Más detallesApuntadores (Punteros)
Apuntadores (Punteros) x9ff10 X int 209 SESION 7 *ptr Definición Llamados también punteros. Un Apuntador es una variable que contiene una dirección de memoria, la cual corresponderá a un dato o a una variable
Más detallesNociones básicas de computación paralela
Nociones básicas de computación paralela Javier Cuenca 1, Domingo Giménez 2 1 Departamento de Ingeniería y Tecnología de Computadores Universidad de Murcia 2 Departamento de Informática y Sistemas Universidad
Más detallesTaller de Sistemas Operativos. Direccionamiento de Memoria 2012
Taller de Sistemas Operativos Direccionamiento de Memoria 2012 TSO Direccionamiento de Memoria - 2010 Agenda Arquitectura de memoria en x86 (IA-32). Direccionamiento en Linux. Arquitectura de memoria en
Más detallesOptimización de Rutinas Multinivel de Álgebra Lineal en Sistemas Multicore
Máster en Nuevas Tecnologías en Informática Facultad de Informática Universidad de Murcia Optimización de Rutinas Multinivel de Álgebra Lineal en Sistemas Multicore Autor: Jesús Cámara Moreno Directores:
Más detallesCurso de Programación Avanzada en C
Curso de Programación Avanzada en C Copyright, 1996 Universidad Sim on Bol ivar 1 Prof. Mariela J. Curiel Contenido del Curso Conceptos BásicosB Estructuras de Control Arreglos Otros tipos de datos derivados
Más detallesComputación de Propósito General en Unidades de Procesamiento Gráfico GPGPU. Clase 0 Lanzamiento del Curso. Motivación
Computación de Propósito General en Unidades de Procesamiento Gráfico () Pablo Ezzatti, Martín Pedemonte Clase 0 Lanzamiento del Curso Contenido Evolución histórica en Fing Infraestructura disponible en
Más detallesMemoria Cache. Departamento de Arquitectura de Computadores
Memoria Cache Departamento de Arquitectura de Computadores Índice Introducción. Conceptos básicos Características de los sistemas de memoria Jerarquías de memoria Memoria Principal Características físicas
Más detallesMemoria Virtual. Memoria Virtual
Memoria Virtual DISEÑO DE SISTEMAS DIGITALES EL-3310 I SEMESTRE 2008 Memoria Virtual Define la relación entre memoria principal y memoria secundaria Permite crear la ilusión de una memoria principal de
Más detallesHPC y GPUs. GPGPU y software libre. Emilio J. Padrón González DE UNIVERSIDADE DA CORUNA GAC.UDC.ES
HPC y GPUs GPGPU y software libre Emilio J. Padrón González DE UNIVERSIDADE DA CORUNA GAC.UDC.ES Workshop HPC y Software Libre Ourense, Octubre 2011 Contenidos 1 Introducción Evolución CPUs Evolución GPUs
Más detallesRobert Rodríguez Cruz, 26 de junio de 2014.
Quiero empezar dando las gracias a Beatriz Otero, mi tutora y mentora en este proyecto final de carrera. Gracias por la confianza que ha depositado en mí, por sus enseñanzas y por su constante apoyo para
Más detallesOPTIMIZACIÓN DE ALGORITMOS PARA PROCESADO DE IMÁGENES CON GPUs
MÁSTER UNIVERSITARIO EN INGENIERÍA INFORMÁTICA UNIVERSIDAD POLITÉCNICA DE MADRID E.T.S. INGENIEROS INFORMÁTICOS OPTIMIZACIÓN DE ALGORITMOS PARA PROCESADO DE IMÁGENES CON GPUs TRABAJO FIN DE MÁSTER AUTOR
Más detalles6. PROCESADORES SUPERESCALARES Y VLIW
6. PROCESADORES SUPERESCALARES Y VLIW 1 PROCESADORES SUPERESCALARES Y VLIW 1. Introducción 2. El modelo VLIW 3. El cauce superescalar 4. Superescalar con algoritmo de Tomasulo 2 PROCESADORES SUPERESCALARES
Más detallesElementos de un programa en C
Elementos de un programa en C Un programa en C consta de uno o más archivos. Un archivo es traducido en diferentes fases. La primera fase es el preprocesado, que realiza la inclusión de archivos y la sustitución
Más detallesMultiplicación de Matrices en Sistemas cc-numa Multicore. Autor: Jesús Cámara Moreno Director: Domingo Giménez Cánovas
Multiplicación de Matrices en Sistemas cc-numa Multicore Autor: Jesús Cámara Moreno Director: Domingo Giménez Cánovas Índice de Contenido 1. Introducción 2. Línea de Investigación 3. Sistemas Empleados
Más detallesSISTEMAS PARALELOS Y DISTRIBUIDOS. 3º GIC. PRÁCTICA 3. PLANIFICACIÓN ESTÁTICA AVANZADA. TMS320C6713
SISTEMAS PARALELOS Y DISTRIBUIDOS. 3º GIC. PRÁCTICA 3. PLANIFICACIÓN ESTÁTICA AVANZADA. TMS320C6713 OBJETIVOS. En esta práctica se trata de estudiar dos de las técnicas de planificación estática más importantes:
Más detallesTEMA 4. ARQUITECTURA IA-64
TEMA 4. ARQUITECTURA IA-64 Stalling, W.Computer Organization and Architecture cap. 15 Intel IA-64 Architecture Software Developer s Manual Generalidades IA-64 Desarrollo conjunto Intel-HP Nueva arquitectura
Más detallesT5-multithreading. Indice
T5-multithreading 1.1 Indice Proceso vs. Flujos Librerías de flujos Comunicación mediante memoria compartida Condición de carrera Sección Crítica Acceso en exclusión mutua Problemas Abrazos mortales 1.2
Más detallesLusitania. Pensando en Paralelo. César Gómez Martín
Lusitania Pensando en Paralelo César Gómez Martín cesar.gomez@cenits.es www.cenits.es Esquema Introducción a la programación paralela Por qué paralelizar? Tipos de computadoras paralelas Paradigmas de
Más detallesOrganización de Computadoras. Turno Recursantes Clase 8
Organización de Computadoras Turno Recursantes Clase 8 Temas de Clase Subsistema de Memoria Organización de Memoria Principal Notas de clase 8 2 Memoria Velocidad del procesador: se duplica cada 18 meses
Más detallesEl nivel ISA (II)! Conjunto de Instrucciones
El nivel ISA (II) Conjunto de Instrucciones EC-2721 Arquitectura del Computador I Que es un Conjunto de Instrucciones? Colección completa de instrucciones comprendida por un procesador Lenguaje de máquina
Más detallesTema 3 SUBRUTINAS. Estructura de Computadores OCW_2015 Nekane Azkona Estefanía
Tema 3 SUBRUTINAS ÍNDICE Definición e instrucciones básicas Soporte para el tratamiento de subrutinas (ejecución de la subrutina y gestión del bloque de activación) Interrupciones vs llamadas a procedimiento
Más detallesProcesadores Gráficos: OpenCL para programadores de CUDA
Procesadores Gráficos: para programadores de CUDA Curso 2011/12 David Miraut david.miraut@urjc.es Universidad Rey Juan Carlos April 24, 2013 Indice Estándar Modelo de de El lenguaje programa de Inicialización
Más detallesComputación Híbrida, Heterogénea y Jerárquica
Computación Híbrida, Heterogénea y Jerárquica http://www.ditec.um.es/ javiercm/curso psba/ Curso de Programación en el Supercomputador Ben-Arabí, febrero-marzo 2012 Organización aproximada de la sesión,
Más detallesIntel XeonPhi Workshop
Intel XeonPhi Workshop Elena Núñez-González Unidad Informática Científica - CIEMAT Madrid, 11 de Febrero de 2015 Evento Lugar, Fecha Índice Introducción MIC Intel Xeon Phi Arquitectura Intel Xeon Phi Entorno
Más detallesCarlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas
2 - Introducción al lenguaje Java, identificadores y comentarios. Carlos Montenegro Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas 1. Introducción: Java tiene como todos
Más detalles