Primeros pasos con CUDA. Clase 1

Tamaño: px
Comenzar la demostración a partir de la página:

Download "Primeros pasos con CUDA. Clase 1"

Transcripción

1 Primeros pasos con CUDA Clase 1

2 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 + B i Esta operación suma cada elemento de A y B se almacena en C.

3 A a 0 a 1 a 2 a 3 a N-1 B b 0 b 1 b 2 b 3 b N-1

4 A a 0 a 1 a 2 a 3 a N-1 + B b 0 b 1 b 2 b 3 b N-1 = c 0 C

5 A a 0 a 1 a 2 a 3 a N B b 0 b 1 b 2 b 3 b N-1 = c 0 c 1 C

6 A a 0 a 1 a 2 a 3 a N B b 0 b 1 b 2 b 3 b N-1 = c 0 c 1 c 2 C

7 A a 0 a 1 a 2 a 3 a N B b 0 b 1 b 2 b 3 b N-1 = c 0 c 1 c 2 c 3 c N-1 C

8 solución I /* Suma de vectores secuencial */ /* Suma de vectores (inplace) */ int vector_ops_suma_sec(float *v1, float *v2, int dim) { for (int i = 0; i < dim; i++) { v1[i] = v1[i] + v2[i]; } vector_ops.cu } return 1; vector_ops.cu

9 solución I /* Suma de vectores secuencial */ /* Suma de vectores (inplace) */ int vector_ops_suma_sec(float *v1, float *v2, int dim) { for (int i = 0; i < dim; i++) { v1[i] = v1[i] + v2[i]; } vector_ops.cu } return 1; Complejidad computacional lineal: O(N) donde N es la dimensión de los arreglos. vector_ops.cu

10 solución I Tiene orden de complejidad lineal, al aumentar el número de elementos aumenta linealmente la cantidad de operaciones.

11 solución I Tiene orden de complejidad lineal, al aumentar el número de elementos aumenta linealmente la cantidad de operaciones. Para vectores pequeños la solución es correcta.

12 solución I Tiene orden de complejidad lineal, al aumentar el número de elementos aumenta linealmente la cantidad de operaciones. Para vectores pequeños la solución es correcta. Para vectores muy grandes este tipo de solución puede ocasionar penalizaciones en el tiempo de cómputo.

13 Cómo sería una solución paralela? Se puede paralelizar la suma el cálculo de cada elemento del vector resultante es independiente de los demás elementos del vector: A a 0 a 1 a 2 a 3 a N-1 B b 0 b 1 b 2 b 3 b N-1

14 Cómo sería una solución paralela? Se puede paralelizar la suma el cálculo de cada elemento del vector resultante es independiente de los demás elementos del vector: A B a 0 a 1 a 2 a 3 a N-1 b 0 b 1 b 2 b 3 b N-1 Si en vez de un único procesador disponemos P procesadores, dividimos los cálculos entre los P procesadores.

15 Cómo sería una solución paralela? Se puede paralelizar la suma, el cálculo de cada elemento del vector resultante es independiente de los demás elementos del vector: A B a 0 a 1 a 2 a 3 a N b 0 b 1 b 2 b 3 b N-1 Si contamos con N procesadores, realizamos todos los cálculos al mismo tiempo. = C = c 0 c 1 c 2 c 3 c N-1

16 Cómo sería una solución paralela? Se puede paralelizar la suma, el cálculo de cada elemento del vector resultante es independiente de los demás elementos del vector: A B = C a 0 a 1 a 2 a 3 a N b 0 b 1 b 2 b 3 b N-1 c 0 c 1 c 2 c 3 c N-1 Si contamos con N procesadores, realizamos todos los cálculos al mismo tiempo. Y se resuelve en paralelo todos los resultados del vector. De orden lineal a orden constante

17 Entonces... Tengo una PC re linda...

18 Entonces... Tengo una PC re linda... Tengo una GPU que me dicen que es re linda...

19 Entonces... Tengo una PC re linda... Tengo una GPU que me dicen que es re linda... Tengo dos vectores para sumar... A B

20 Entonces... Tengo una PC re linda... Tengo una GPU que me dicen que es re linda... Tengo dos vectores para sumar... A B Cómo utilizo estas arquitecturas para solucionar mi problema??

21 CUDA (Compute Unified Device Architecture) En Noviembre de 2006 NVIDIA introduce CUDA que hace referencia tanto a un compilador como a un conjunto de herramientas de desarrollo creadas por NVIDIA. CUDA es una arquitectura de software y hardware que permite a GPUs ejecutar programas escritos en C, C++, Fortran, DirectCompute y otros lenguajes.

22 CUDA (Compute Unified Device Architecture) Un programa CUDA es un programa híbrido: Código secuencial se ejecuta en CPU Código paralelo se ejecuta en GPU

23 CUDA (Compute Unified Device Architecture) Un programa CUDA es un programa híbrido: Código secuencial se ejecuta en CPU Código paralelo se ejecuta en GPU Código secuencial Inicializaciones Lectura de datos de entrada. Código paralelo Modelo SIMD - STMD Código secuencial Muestra de resultados Almacenamiento de resultados.

24 CUDA Cómo es la parte paralela de la aplicación? Un programa CUDA invoca a funciones paralelas llamadas kernels. En CUDA: Kernel = función. Un kernel se ejecuta en paralelo a través threads paralelos.

25 CUDA Cómo es la parte paralela de la aplicación? Un programa CUDA invoca a funciones paralelas llamadas kernels. En CUDA: Kernel = función. Un kernel se ejecuta en paralelo a través threads paralelos. El programador decide: el kernel A será ejecutado por n threads A B = C Con n threads que cada uno sume un elemento del vector resultante, consigo ejecutar la suma de vectores en un único paso!!

26 CUDA Un programa CUDA invoca a kernels paralelos. Un kernel se ejecuta en paralelo a través threads paralelos. A B = C Múltiples threads ejecutando el mismo kernel.

27 CUDA Tenemos programas CUDA híbridos, que se ejecutan en CPU y GPU. Tenemos dos arquitecturas que se conectan mediante un conector PCI-Express (no comparten espacio de direccionamiento)

28 Cómo lo hacemos con CUDA? Este problema ahora implica: Inicialización de arreglos en CPU Transferencia de datos CPU GPU

29 Cómo lo hacemos con CUDA? Este problema ahora implica: Inicialización de arreglos en CPU Transferencia de datos CPU GPU Cálculo de la suma en paralelo.

30 Cómo lo hacemos con CUDA? Este problema ahora implica: Inicialización de arreglos en CPU Transferencia de datos CPU GPU Cálculo de la suma en paralelo. Transferencia de datos GPU CPU.

31 Cómo lo hacemos con CUDA? Este problema ahora implica: Inicialización de arreglos en CPU Transferencia de datos CPU GPU Cálculo en GPU. Transferencia de datos GPU CPU. Modelo de programación CUDA

32 Modelo de programación CUDA CUDA extiende al lenguaje C/C++ incluyendo dos características principales: - Organización y manejo de threads concurrentes. - Manejo de jerarquía de memorias instaladas en la GPU.

33 CUDA extiende al lenguaje C/C++ incluyendo dos características principales: - Organización y manejo de threads concurrentes. thread Jerarquía de threads: thread,

34 CUDA extiende al lenguaje C/C++ incluyendo dos características principales: - organización y manejo de threads concurrentes. thread Jerarquía de threads: thread, bloque, bloque 1, 2 o 3 dimensiones

35 CUDA extiende al lenguaje C/C++ incluyendo dos características principales: - organización y manejo de threads concurrentes. thread Jerarquía de threads: bloque 1, 2 o 3 dimensiones thread, bloque Grid 1 grilla. grilla Block (0,0) Block (1,0) Block (2,0) Grid 2 grilla Block (0,0) Block (1,0) Block (0,1) Block (1,1) 1, 2 o 3 dimensiones

36 CUDA extiende al lenguaje C/C++ incluyendo dos características principales: - Manejo de jerarquía de memorias instaladas en la GPU Memoria local de thread Memorias: Privada de cada thread.

37 CUDA extiende al lenguaje C/C++ incluyendo dos características principales: - Manejo de jerarquía de memorias instaladas en la GPU Memoria local de thread Memoria compartida de bloque Memorias: Privada de cada thread. Compartida por bloque.

38 CUDA extiende al lenguaje C/C++ incluyendo dos características principales: - Manejo de jerarquía de memorias instaladas en la GPU Memoria local de thread Memoria compartida de bloque Grid 1 Block (0,0) Block (1,0) Block (2,0) Memorias: Privada de cada thread. Compartida por bloque. Grid 2 Memoria global Global de toda la aplicación Block (0,0) Block (0,1) Block (1,0) Block (1,1)

39 - Manejo de jerarquía de memorias instaladas en la GPU CUDA ofrece distintas memorias con distintas características: Registros Memoria compartida Memoria global Memoria constante. Algunas de ellas están en caché.

40 Memoria Global: es la más grande y la más lenta. Puede ser leída y escrita por la CPU y por los threads de GPU. Permite comunicar datos entre CPU y GPU. El patrón de acceso a memoria por los threads puede afectar el rendimiento. Memoria Constante: es parte de la memoria global. CPU puede leer y escribir, y es sólo de lectura para GPU threads. Ofrece mayor ancho de banda cuando grupos de threads acceden al mismo dato. Memoria compartida: es pequeña y muy rápida y es compartida por todos los threads de un bloque. Es de lectura/escritura por los threads. Puede comunicar datos entre threads del mismo bloque. Puede verse afectada por el patrón de acceso de los threads. Registros: cada thread utiliza su propio conjunto de registros. El programador no tiene control explícito de los registros, y son utilizados para la ejecución de programas de la misma forma que los registros de propósito general de CPU. Memoria local: es usada por el compilador automáticamente para alojar variables cuando hace falta. Memoria de textura: es controlada por el programador y puede beneficiar aplicaciones con localidad espacial donde el acceso a memoria global es un cuello de botella.

41 /* Main.cu: suma de vectores. Código que se ejecuta en host. */ main.cu int main() { /* alocacion de memoria en host */ float *h_a = (float *) malloc(n * sizeof(float)); float *h_b = (float *) malloc(n * sizeof(float)); float *h_aux = (float *) malloc(n * sizeof(float)); /* alocacion de memoria en device */ float *d_a, *d_b; cudamalloc((void**)&d_a, sizeof(float) * N); cudamalloc((void**)&d_b, sizeof(float) * N); /* chequeo de alocacion de memoria */ if (!h_a!h_b!d_a!d_b!h_aux) { printf("error alocando vectores \n"); exit(-1); } main.cu

42 /* Main.cu: suma de vectores. Código que se ejecuta en host. */ main.cu int main() { /* alocacion de memoria en host */ float *h_a = (float *) malloc(n * sizeof(float)); float *h_b = (float *) malloc(n * sizeof(float)); float *h_aux = (float *) malloc(n * sizeof(float)); Alocación de memoria dinámica en host /* alocacion de memoria en device */ float *d_a, *d_b; cudamalloc((void**)&d_a, sizeof(float) * N); cudamalloc((void**)&d_b, sizeof(float) * N); /* chequeo de alocacion de memoria */ if (!h_a!h_b!d_a!d_b!h_aux) { printf("error alocando vectores \n"); exit(-1); }

43 /* Main.cu: suma de vectores. Código que se ejecuta en host. */ main.cu int main() { /* alocacion de memoria en host */ float *h_a = (float *) malloc(n * sizeof(float)); float *h_b = (float *) malloc(n * sizeof(float)); float *h_aux = (float *) malloc(n * sizeof(float)); /* alocacion de memoria en device */ float *d_a, *d_b; cudamalloc((void**)&d_a, sizeof(float) * N); cudamalloc((void**)&d_b, sizeof(float) * N); /* chequeo de alocacion de memoria */ if (!h_a!h_b!d_a!d_b!h_aux) { printf("error alocando vectores \n"); exit(-1); } Alocación de memoria en device Aloca n bytes en memoria global del device los cuales serán apuntados por d_a (d_b respectivamente)

44 /* Main.cu: suma de vectores. Código que se ejecuta en host. */ main.cu int main() { /* alocacion de memoria en host */ float *h_a = (float *) malloc(n * sizeof(float)); float *h_b = (float *) malloc(n * sizeof(float)); float *h_aux = (float *) malloc(n * sizeof(float)); /* alocacion de memoria en device */ float *d_a, *d_b; cudamalloc((void**)&d_a, sizeof(float) * N); cudamalloc((void**)&d_b, sizeof(float) * N); /* chequeo de alocacion de memoria */ if (!h_a!h_b!d_a!d_b!h_aux) { printf("error alocando vectores \n"); exit(-1); }

45 /* Continuación del código anterior */ main.cu /* inicializacion de vectores */ printf("inicializacion vector A \n"); vector_io_initializernd(h_a, N); printf("inicializacion vector B \n"); vector_io_initializernd(h_b, N); /* transferencia de datos cpu -> gpu (host -> device) */ cudamemcpy(d_a, h_a, sizeof(float) * N, cudamemcpyhosttodevice); cudamemcpy(d_b, h_b, sizeof(float) * N, cudamemcpyhosttodevice);

46 /* Continúa código anterior */ main.cu /* inicializacion de vectores */ printf("inicializacion vector A \n"); vector_io_initializernd(h_a, N); printf("inicializacion vector B \n"); vector_io_initializernd(h_b, N); /* transferencia de datos cpu -> gpu (host -> device) */ cudamemcpy(d_a, h_a, sizeof(float) * N, cudamemcpyhosttodevice); cudamemcpy(d_b, h_b, sizeof(float) * N, cudamemcpyhosttodevice);

47 /* Continúa código anterior */ main.cu /* inicializacion de vectores */ printf("inicializacion vector A \n"); vector_io_initializernd(h_a, N); printf("inicializacion vector B \n"); vector_io_initializernd(h_b, N); /* transferencia de datos cpu -> gpu (host -> device) */ cudamemcpy(d_a, h_a, sizeof(float) * N, cudamemcpyhosttodevice); cudamemcpy(d_b, h_b, sizeof(float) * N, cudamemcpyhosttodevice); CPU I/O GPU Memoria principal Memoria global

48 /* Continúa código anterior */ main.cu /* inicializacion de vectores */ printf("inicializacion vector A \n"); vector_io_initializernd(h_a, N); printf("inicializacion vector B \n"); vector_io_initializernd(h_b, N); /* transferencia de datos cpu -> gpu (host -> device) */ cudamemcpy(d_a, h_a, sizeof(float) * N, cudamemcpyhosttodevice); cudamemcpy(d_b, h_b, sizeof(float) * N, cudamemcpyhosttodevice); CPU I/O GPU Memoria principal Memoria global

49 /* Main.cu: suma de vectores. Código que se ejecuta en host. */ main.cu /* inicializacion de vectores */ printf("inicializacion vector A \n"); vector_io_initializernd(h_a, N); printf("inicializacion vector B \n"); vector_io_initializernd(h_b, N); /* transferencia de datos cpu -> gpu (host -> device) */ cudamemcpy(d_a, h_a, sizeof(float) * N, cudamemcpyhosttodevice); cudamemcpy(d_b, h_b, sizeof(float) * N, cudamemcpyhosttodevice); Copia datos de host a device CPU I/O GPU Memoria principal Memoria global

50 /* Main.cu: suma de vectores. Código que se ejecuta en host. */ main.cu /* inicializacion de vectores */ printf("inicializacion vector A \n"); vector_io_initializernd(h_a, N); printf("inicializacion vector B \n"); vector_io_initializernd(h_b, N); /* transferencia de datos cpu -> gpu (host -> device) */ cudamemcpy(d_a, h_a, sizeof(float) * N, cudamemcpyhosttodevice); cudamemcpy(d_b, h_b, sizeof(float) * N, cudamemcpyhosttodevice); Copia datos de host a device cudamemcpy(destino, origen, size, DIRECCION_COPIA) Copia size bytes desde la dirección origen a la dirección destino en la memoria global. DIRECCION_COPIA indica el sentido de la copia: - cudamemcpyhosttohost. - cudamemcpyhosttodevice. - cudamemcpydevicetohost. - cudamemcpydevicetodevice.

51 /* Main.cu: suma de vectores. Código que se ejecuta en host. */ main.cu /* inicializacion de vectores */ printf("inicializacion vector A \n"); vector_io_initializernd(h_a, N); printf("inicializacion vector B \n"); vector_io_initializernd(h_b, N); /* transferencia de datos cpu -> gpu (host -> device) */ cudamemcpy(d_a, h_a, sizeof(float) * N, cudamemcpyhosttodevice); cudamemcpy(d_b, h_b, sizeof(float) * N, cudamemcpyhosttodevice); CPU I/O GPU Tenemos los datos alocados en memoria principal de la CPU y en memoria global de GPU. Estamos listos para operar en device. Memoria principal Memoria global

52 /* Main.cu: continuación del código. */ main.cu /* suma secuencial */ printf("suma secuencial (CPU)\n"); suma_secuencial(h_a, h_b, N); /* suma paralela */ printf("suma paralela (GPU) \n"); suma_paralela(d_a, d_b, N); /* traigo los datos desde GPU a CPU para testear la suma */ cudamemcpy(h_aux, d_a, sizeof(float) * N, cudamemcpydevicetohost); if(vector_ops_iguales(h_aux, h_a, N)) printf("test pasado! \n"); else printf("test no pasado! \n"); /* liberacion de memoria */ free(h_a); free(h_b); free(h_aux); cudafree(d_a); cudafree(d_b); } return 0;

53 /* Main.cu: continuación del código. */ main.cu /* suma secuencial */ printf("suma secuencial (CPU)\n"); suma_secuencial(h_a, h_b, N); Función secuencial, ya vista /* suma paralela */ printf("suma paralela (GPU) \n"); suma_paralela(d_a, d_b, N); /* traigo los datos desde GPU a CPU para testear la suma */ cudamemcpy(h_aux, d_a, sizeof(float) * N, cudamemcpydevicetohost); if(vector_ops_iguales(h_aux, h_a, N)) printf("test pasado! \n"); else printf("test no pasado! \n"); /* liberacion de memoria */ free(h_a); free(h_b); free(h_aux); cudafree(d_a); cudafree(d_b); } return 0;

54 /* Main.cu: continuación del código. */ main.cu /* suma secuencial */ printf("suma secuencial (CPU)\n"); suma_secuencial(h_a, h_b, N); /* suma paralela */ printf("suma paralela (GPU) \n"); suma_paralela(d_a, d_b, N); Función paralela /* traigo los datos desde GPU a CPU para testear la suma */ cudamemcpy(h_aux, d_a, sizeof(float) * N, cudamemcpydevicetohost); if(vector_ops_iguales(h_aux, h_a, N)) printf("test pasado! \n"); else printf("test no pasado! \n"); /* liberacion de memoria */ free(h_a); free(h_b); free(h_aux); cudafree(d_a); cudafree(d_b); } return 0;

55 /* Función que invoca al kernel (desde CPU se invoca a kernel (GPU)) */ /* Suma de vectores. Resultado queda en el primer argumento */ int vector_ops_suma_par(float *v1, float *v2, int dim) { dim3 nthreads(512); dim3 nblocks((dim / nthreads.x) + (dim % nthreads.x? 1 : 0)); vector_ops.c kernel_suma<<<nblocks, nthreads>>>(v1, v2, dim); cudadevicesynchronize(); } return 1;

56 /* Función que invoca al kernel (desde CPU se invoca a kernel (GPU)) */ /* Suma de vectores. Resultado queda en el primer argumento */ int vector_ops_suma_par(float *v1, float *v2, int dim) { dim3 nthreads(512); dim3 nblocks((dim / nthreads.x) + (dim % nthreads.x? 1 : 0)); vector_ops.c Configuración del grid kernel_suma<<<nblocks, nthreads>>>(v1, v2, dim); cudadevicesynchronize(); } return 1; Variables de tipo dim3: vector de 3 enteros que se usa para especificar dimensiones. Componentes x, y, z. Si algún componente no se inicializa 1.

57 /* Función que invoca al kernel (desde CPU se invoca a kernel (GPU)) */ /* Suma de vectores. Resultado queda en el primer argumento */ int vector_ops_suma_par(float *v1, float *v2, int dim) { dim3 nthreads(512); dim3 nblocks((dim / nthreads.x) + (dim % nthreads.x? 1 : 0)); vector_ops.c Configuración del grid kernel_suma<<<nblocks, nthreads>>>(v1, v2, dim); cudadevicesynchronize(); } return 1; Variables de tipo dim3: vector de 3 enteros que se usa para especificar dimensiones. Componentes x, y, z. Si algún componente no se inicializa 1. nthreads especificará cantidad de threads por bloque. nblocks especificará cantidad de bloques en el grid

58 /* Función que invoca al kernel (desde CPU se invoca a kernel (GPU)) */ /* Suma de vectores. Resultado queda en el primer argumento */ int vector_ops_suma_par(float *v1, float *v2, int dim) { dim3 nthreads(512); dim3 nblocks((dim / nthreads.x) + (dim % nthreads.x? 1 : 0)); vector_ops.c Configuración del grid kernel_suma<<<nblocks, nthreads>>>(v1, v2, dim); cudadevicesynchronize(); } return 1; Variables de tipo dim3: vector de 3 enteros que se usa para especificar dimensiones. Componentes x, y, z. Si algún componente no se inicializa 1. nthreads especificará cantidad de threads por bloque (bloques de 1, 2 o 3 dimensiones). nblocks especificará cantidad de bloques en el grid (grids de 1, 2 o 3 dimensiones) Cómo queda configurado el grid?

59 Kernel 1: dim3 dimgrid(3,2) dim3 dimblock(5,3) Kernel 2: dim3 dimgrid(4,3) Dim3 dimblock(?,?,?)

60 /* Función (se ejecuta en CPU) que invoca al kernel (se ejecuta en GPU) */ /* Suma de vectores. Resultado queda en el primer argumento */ int vector_ops_suma_par(float *v1, float *v2, int dim) { dim3 nthreads(512); dim3 nblocks((dim / nthreads.x) + (dim % nthreads.x? 1 : 0)); kernel_suma<<<nblocks, nthreads>>>(v1, v2, dim); cudadevicesynchronize(); vector_ops.c Lanzamiento del kernel } return 1;

61 /* Función (se ejecuta en CPU) que invoca al kernel (se ejecuta en GPU) */ /* Suma de vectores. Resultado queda en el primer argumento */ int vector_ops_suma_par(float *v1, float *v2, int dim) { dim3 nthreads(512); dim3 nblocks((dim / nthreads.x) + (dim % nthreads.x? 1 : 0)); kernel_suma<<<nblocks, nthreads>>>(v1, v2, dim); cudadevicesynchronize(); vector_ops.c Lanzamiento del kernel } return 1; nombre_kernel<<<número de bloques, threads por bloque>>>(parámetros actuales);

62 /* Función (se ejecuta en CPU) que invoca al kernel (se ejecuta en GPU) */ /* Suma de vectores. Resultado queda en el primer argumento */ int vector_ops_suma_par(float *v1, float *v2, int dim) { dim3 nthreads(512); dim3 nblocks((dim / nthreads.x) + (dim % nthreads.x? 1 : 0)); vector_ops.c kernel_suma<<<nblocks, nthreads>>>(v1, v2, dim); cudadevicesynchronize(); } return 1; /* suma de cada elemento del vector */ global void kernel_suma(float *v1, float *v2, int dim) { int id = threadidx.x + (blockidx.x * blockdim.x); } if (id < dim) { v1[id] = v1[id] + v2[id]; } Kernel

63 vector_ops.c /* Main.cu: continuación del código. */ /* Suma de vectores. Resultado queda en el primer argumento */ int vector_ops_suma_par(float *v1, float *v2, int dim) { dim3 nthreads(512); dim3 nblocks((dim / nthreads.x) + (dim % nthreads.x? 1 : 0)); kernel_suma<<<nblocks, nthreads>>>(v1, v2, dim); cudadevicesynchronize(); } return 1; /* suma de cada elemento del vector */ global void kernel_suma(float *v1, float *v2, int dim) { int id = threadidx.x + (blockidx.x * blockdim.x); } if (id < dim) { v1[id] = v1[id] + v2[id]; } global : calificador de función

64 Calificadores de funciones: global : determina que es una función kernel, se ejecuta en el dispositivo y sólo puede ser invocada desde el host. Su invocación genera un grid de bloques con número fijo e igual de threads. device : es una función del dispositivo, se ejecuta en él y sólo puede ser invocada desde un kernel u otra función del dispositivo. host : determina que es una función del host, o simplemente una función de C tradicional a ejecutarse en host y que puede ser invocada desde host. Por omisión.

65 /* Main.cu: continuación del código. */ /* Suma de vectores. Resultado queda en el primer argumento */ int vector_ops_suma_par(float *v1, float *v2, int dim) { dim3 nthreads(512); dim3 nblocks((dim / nthreads.x) + (dim % nthreads.x? 1 : 0)); vector_ops.c kernel_suma<<<nblocks, nthreads>>>(v1, v2, dim); cudadevicesynchronize(); } return 1; /* suma de cada elemento del vector */ global void kernel_suma(float *v1, float *v2, int dim) { int id = threadidx.x + (blockidx.x * blockdim.x); } if (id < dim) { v1[id] = v1[id] + v2[id]; }

66 Variables reservadas: griddim: contiene las dimensiones del grid. blockidx : contiene el identificador del bloque en un grid. blockdim: contiene las dimensiones del bloque. threadidx: contiene el identificador del thread dentro del bloque. Todas tienen componentes x,y,z. Grids y bloques de 1, 2 o 3 dimensiones.

67 /* Main.cu: continuación del código. */ /* Suma de vectores. Resultado queda en el primer argumento */ int vector_ops_suma_par(float *v1, float *v2, int dim) { dim3 nthreads(512); dim3 nblocks((dim / nthreads.x) + (dim % nthreads.x? 1 : 0)); vector_ops.c kernel_suma<<<nblocks, nthreads>>>(v1, v2, dim); cudadevicesynchronize(); } return 1; /* suma de cada elemento del vector */ global void kernel_suma(float *v1, float *v2, int dim) { int id = threadidx.x + (blockidx.x * blockdim.x); } if (id < dim) { v1[id] = v1[id] + v2[id]; }

68 /* Main.cu: continuación del código. */ /* Suma de vectores. Resultado queda en el primer argumento */ int vector_ops_suma_par(float *v1, float *v2, int dim) { dim3 nthreads(512); dim3 nblocks((dim / nthreads.x) + (dim % nthreads.x? 1 : 0)); vector_ops.c kernel_suma<<<nblocks, nthreads>>>(v1, v2, dim); cudadevicesynchronize(); } return 1; /* suma de cada elemento del vector */ global void kernel_suma(float *v1, float *v2, int dim) { int id = threadidx.x + (blockidx.x * blockdim.x); } if (id < dim) { v1[id] = v1[id] + v2[id]; } Cada thread resuelve un único elemento del vector.

69 /* Main.cu: continuación del código. */ main.cu /* suma secuencial */ printf("suma secuencial (CPU)\n"); suma_secuencial(h_a, h_b, N); /* suma paralela */ printf("suma paralela (GPU) \n"); suma_paralela(d_a, d_b, N); /* traigo los datos desde GPU a CPU para testear la suma */ cudamemcpy(h_aux, d_a, sizeof(float) * N, cudamemcpydevicetohost); if(vector_ops_iguales(h_aux, h_a, N)) printf("test pasado! \n"); else printf("test no pasado! \n"); /* liberacion de memoria */ free(h_a); free(h_b); free(h_aux); cudafree(d_a); cudafree(d_b); } return 0;

70 /* Main.cu: continuación del código. */ main.cu /* suma secuencial */ printf("suma secuencial (CPU)\n"); suma_secuencial(h_a, h_b, N); /* suma paralela */ printf("suma paralela (GPU) \n"); suma_paralela(d_a, d_b, N); /* traigo los datos desde GPU a CPU para testear la suma */ cudamemcpy(h_aux, d_a, sizeof(float) * N, cudamemcpydevicetohost); if(vector_ops_iguales(h_aux, h_a, N)) printf("test pasado! \n"); else printf("test no pasado! \n"); /* liberacion de memoria */ free(h_a); free(h_b); free(h_aux); cudafree(d_a); cudafree(d_b); } return 0;

71 /* Main.cu: continuación del código. */ main.cu /* suma secuencial */ printf("suma secuencial (CPU)\n"); suma_secuencial(h_a, h_b, N); /* suma paralela */ printf("suma paralela (GPU) \n"); suma_paralela(d_a, d_b, N); /* traigo los datos desde GPU a CPU para testear la suma */ cudamemcpy(h_aux, d_a, sizeof(float) * N, cudamemcpydevicetohost); if(vector_ops_iguales(h_aux, h_a, N)) printf("test pasado! \n"); else printf("test no pasado! \n"); /* liberacion de memoria */ free(h_a); free(h_b); free(h_aux); cudafree(d_a); cudafree(d_b); } return 0;

72 /* Main.cu: continuación del código. */ main.cu /* suma secuencial */ printf("suma secuencial (CPU)\n"); suma_secuencial(h_a, h_b, N); /* suma paralela */ printf("suma paralela (GPU) \n"); suma_paralela(d_a, d_b, N); /* traigo los datos desde GPU a CPU para testear la suma */ cudamemcpy(h_aux, d_a, sizeof(float) * N, cudamemcpydevicetohost); if(vector_ops_iguales(h_aux, h_a, N)) printf("test pasado! \n"); else printf("test no pasado! \n"); /* liberacion de memoria */ free(h_a); free(h_b); free(h_aux); cudafree(d_a); cudafree(d_b); } return 0;

73 th 0 th 1 th 2 th 3 th N-1 A B a 0 a 1 a 2 a 3 a N b 0 b 1 b 2 b 3 b N-1 Y se resuelve en paralelo todos los resultados del vector. De orden lineal a orden constante!! = C c 0 c 1 c 2 c 3 c N-1

74 Modelo de programación CUDA No todos los problemas pueden ser resueltos usando placas de tipo GPU. Los más adecuados son los que aplican la misma secuencia de código a los datos de entrada.

75 Modelo de programación CUDA Ganaremos con GPU si: El algoritmo tiene orden de ejecución cuadrático o superior: compensar el tiempo de transferencia de datos CPU GPU. Gran carga de cálculo en cada thread (por lo mismo que el item anterior). Poca dependencia de datos. Independencia de cómputo. Puede llevar a acceso a su memoria local o compartida y evita acceder a la global (costosa). Mínima transferencia de datos CPU-GPU: óptimo: principio y final. Evitar tranferencias intermedias, ya sean para resultados parciales o datos de entrada intermedios. No existan secciones críticas: lecturas paralelas a datos, pero no escrituras: necesitamos mecanismos de acceso seguro secuencialización de accesos.

76 Resumen Hemos visto: - Alocación de memoria en device. - Transferencia de memoria host device. - Configuración de grid. - Lanzamiento de kernels. Todas estas operaciones las ofrece CUDA como una librería que extiende al lenguaje C (en este caso).

77 Probando el código 1) Copiar la carpeta /share/apps/codigos/suma-vectores a la carpeta personal: [mdenham@gpgpu-fisica ~]$ cp -a /share/apps/codigos/suma-vectores/. 2) Para compilar: los paquetes de compiladores/ bibliotecas se usan via el comando module. Para compilar con CUDA debemos cargar el módulo: [mdenham@gpgpu-fisica SUMA-Vectores]$ module load cuda Entrar a la carpeta local SUMA-Vectores y compilar: [mdenham@gpgpu-fisica SUMA-Vectores]$ cd SUMA-Vectores [mdenham@gpgpu-fisica SUMA-Vectores]$ make

78 Probando el código 3) Ejecutar la aplicación: encolamos el ejecutable main usando el script submit_gpuh.sh: ~]$ qsub submit_gpuh.sh 4) Para consultar el estado de los trabajos lanzados: SUMA-Vectores]$ qstat -f SUMA-Vectores]$ qstat -u '*' 5) Verificar resultados: ver los resultados en submit_gpuh.sh.o***** SUMA-Vectores]$ cat submit_gpuh.sh.o***

Modelo de aplicaciones CUDA

Modelo 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 detalles

CUDA: MODELO DE PROGRAMACIÓN

CUDA: MODELO DE PROGRAMACIÓN CUDA: MODELO DE PROGRAMACIÓN Autor: Andrés Rondán Tema: GPUGP: nvidia CUDA. Introducción En Noviembre de 2006, NVIDIA crea CUDA, una arquitectura de procesamiento paralelo de propósito general, con un

Más detalles

Introducción a Cómputo Paralelo con CUDA C/C++

Introducción a Cómputo Paralelo con CUDA C/C++ UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de Ingeniería Introducción a Cómputo Paralelo con CUDA C/C++ Laboratorio de Intel y Cómputo de alto desempeño Elaboran: Revisión: Ing. Laura Sandoval Montaño

Más detalles

CUDA (Compute Unified Device Architecture)

CUDA (Compute Unified Device Architecture) CUDA (Compute Unified Device Architecture) Alvaro Cuno 23/01/2010 1 CUDA Arquitectura de computación paralela de propósito general La programación para la arquitectura CUDA puede hacerse usando lenguaje

Más detalles

SUMA de Vectores: Hands-on

SUMA 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 detalles

INTRODUCCIÓN A LA PROGRAMACIÓN DE GPUS CON CUDA

INTRODUCCIÓN A LA PROGRAMACIÓN DE GPUS CON CUDA INTRODUCCIÓN A LA PROGRAMACIÓN DE GPUS CON CUDA Francisco Igual Peña León, 10 de mayo de 2011 PLANIFICACIÓN 1. Miércoles: Conceptos introductorios 1. Breve presentación de conceptos básicos 2. Ejercicios

Más detalles

Alejandro Molina Zarca

Alejandro Molina Zarca Compute Unified Device Architecture (CUDA) Que es CUDA? Por qué CUDA? Dónde se usa CUDA? El Modelo CUDA Escalabilidad Modelo de programación Programación Heterogenea Memoria Compartida Alejandro Molina

Más detalles

Francisco J. Hernández López

Francisco J. Hernández López Francisco J. Hernández López fcoj23@cimat.mx 2 Procesadores flexibles de procesamiento general Se pueden resolver problemas de diversas áreas: Finanzas, Gráficos, Procesamiento de Imágenes y Video, Algebra

Más detalles

GPGPU ( GENERAL PURPOSE COMPUTING ON GRAPHICS PROCESSING UNITS)

GPGPU ( GENERAL PURPOSE COMPUTING ON GRAPHICS PROCESSING UNITS) 26 GPGPU ( GENERAL PURPOSE COMPUTING ON GRAPHICS PROCESSING UNITS) Técnica GPGPU consiste en el uso de las GPU para resolver problemas computacionales de todo tipo aparte de los relacionados con el procesamiento

Más detalles

Computación de Propósito General en Unidades de Procesamiento Gráfico GPGPU

Computació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 detalles

INTRODUCCIÓN A LA PROGRAMACIÓN EN CUDA. Francisco Javier Hernández López

INTRODUCCIÓN A LA PROGRAMACIÓN EN CUDA. Francisco Javier Hernández López INTRODUCCIÓN A LA PROGRAMACIÓN EN CUDA Francisco Javier Hernández López http://www.cimat.mx/~fcoj23 Guanajuato, Gto. Noviembre de 2012 Introducción a la Programación en CUDA 2 Qué es el Cómputo Paralelo

Más detalles

DESARROLLO DE APLICACIONES EN CUDA

DESARROLLO 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 detalles

PROGRAMACIÓN AVANZADA DE GPUs PARA APLICACIONES CIENTÍFICAS

PROGRAMACIÓ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 detalles

Computación de Propósito General en Unidades de Procesamiento Gráfico GPGPU

Computació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 detalles

Introducción a la Arquitectura y Plataforma de Programación de Cómputo Paralelo CUDA (36 hrs) Instructor M. en C. Cristhian Alejandro Ávila-Sánchez

Introducción a la Arquitectura y Plataforma de Programación de Cómputo Paralelo CUDA (36 hrs) Instructor M. en C. Cristhian Alejandro Ávila-Sánchez Introducción a la Arquitectura y Plataforma de Programación de Cómputo Paralelo CUDA (36 hrs) I Presentación: Instructor M. en C. Cristhian Alejandro Ávila-Sánchez CUDA (Compute Unified Device Architecture)

Más detalles

CÓMPUTO DE ALTO RENDIMIENTO EN MEMORIA COMPARTIDA Y PROCESADORES GRÁFICOS

CÓMPUTO DE ALTO RENDIMIENTO EN MEMORIA COMPARTIDA Y PROCESADORES GRÁFICOS CÓMPUTO DE ALTO RENDIMIENTO EN MEMORIA COMPARTIDA Y PROCESADORES GRÁFICOS Leopoldo N. Gaxiola, Juan J. Tapia Centro de Investigación y Desarrollo de Tecnología Digital Instituto Politécnico Nacional Avenida

Más detalles

CUDA Overview and Programming model

CUDA 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 detalles

Programación de una GPU con CUDA

Programación de una GPU con CUDA Programación de una GPU con CUDA Programación de Arquitecturas Multinúcleo Universidad de Murcia. Contenidos Introducción Arquitectura y programación de CUDA Optimización y depuración de código Librerías

Más detalles

GPU-Ejemplo CUDA. Carlos García Sánchez

GPU-Ejemplo CUDA. Carlos García Sánchez Carlos García Sánchez 1 2 Contenidos Motivación GPU vs. CPU GPU vs. Vectoriales CUDA Sintaxis Ejemplo 2 3 Motivación Computación altas prestaciones: www.top500.org 1º: Titan (300mil AMD-Opteron + 19mil

Más detalles

Francisco Javier Hernández López

Francisco Javier Hernández López Francisco Javier Hernández López fcoj23@cimat.mx http://www.cimat.mx/~fcoj23 Ejecución de más de un cómputo (cálculo) al mismo tiempo o en paralelo, utilizando más de un procesador. Arquitecturas que hay

Más detalles

Introducción a Cómputo Paralelo con CUDA C/C++

Introducción a Cómputo Paralelo con CUDA C/C++ UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO Facultad de Ingeniería Introducción a Cómputo Paralelo con CUDA C/C++ Laboratorio de Intel para la Academia y Cómputo de alto desempeño Elaboran: Revisión: Ing.

Más detalles

Computación en procesadores gráficos

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 detalles

Computación en procesadores gráficos

Computación en procesadores gráficos Programación con CUDA Ejercicio 8 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

Más detalles

Francisco J. Hernández López

Francisco J. Hernández López Francisco J. Hernández López fcoj23@cimat.mx Ejecución de más de un cómputo (cálculo) al mismo tiempo o en paralelo, utilizando más de un procesador. Sistema de Cómputo Paralelo Hardware Parallel programming:

Más detalles

Introducción a GPGPU y CUDA Doctorado en Tecnologías de la Información y las Telecomunicaciones

Introducción a GPGPU y CUDA Doctorado en Tecnologías de la Información y las Telecomunicaciones Introducción a GPGPU y CUDA Doctorado en Tecnologías de la Información y las Telecomunicaciones ETSI Telecomunicación Universidad de Valladolid Mario Martínez-Zarzuela Febrero de 2015 Introducción CONTENIDO

Más detalles

Sistemas Operativos Practica 1: procesos y concurrencia.

Sistemas Operativos Practica 1: procesos y concurrencia. Sistemas Operativos Practica 1: procesos y concurrencia. Objetivos: Introducir al alumno a los conceptos de programa, concurrencia, paralelismo y proceso o tarea. Manejo del concepto de concurrencia haciendo

Más detalles

Preparación y Adaptación de Códigos Científicos para su Ejecución Paralela TICAL 2018

Preparación y Adaptación de Códigos Científicos para su Ejecución Paralela TICAL 2018 Preparación y Adaptación de Códigos Científicos para su Ejecución Paralela TICAL 2018 Gilberto Díaz gilberto.diaz@uis.edu.co Universidad Industrial de Santander Centro de Súper Computación y Cálculo Científico

Más detalles

Librerí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 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 detalles

Memorias, opciones del compilador y otras yerbas. Clase 3

Memorias, 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 detalles

ENTRADA-SALIDA. 2. Dispositivos de Carácter: Envía o recibe un flujo de caracteres No es direccionable, no tiene operación de búsqueda

ENTRADA-SALIDA. 2. Dispositivos de Carácter: Envía o recibe un flujo de caracteres No es direccionable, no tiene operación de búsqueda Tipos de Dispositivos ENTRADA-SALIDA 1. Dispositivos de Bloque: Almacena información en bloques de tamaño fijo (512b hasta 32Kb) Se puede leer o escribir un bloque en forma independiente 2. Dispositivos

Más detalles

FLAG/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í 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 detalles

Procesamiento Paralelo

Procesamiento Paralelo Procesamiento Paralelo OpenCL - Introducción Javier Iparraguirre Universidad Tecnológica Nacional, Facultad Regional Bahía Blanca 11 de Abril 461, Bahía Blanca, Argentina jiparraguirre@frbb.utn.edu.ar

Más detalles

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria

Sistema 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 detalles

48 ContactoS 84, (2012)

48 ContactoS 84, (2012) 48 ContactoS 84, 47 55 (2012) Recibido: 31 de enero de 2012. Aceptado: 03 de mayo de 2012. Resumen En los últimos años la tecnología de las unidades de procesamiento de gráficos (GPU-Graphics Processsing

Más detalles

FUNDAMENTOS DE COMPUTACIÓN PARA CIENTÍFICOS. CNCA Abril 2013

FUNDAMENTOS 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 detalles

INTRODUCCIÓN A LA COMPUTACIÓN PARALELA CON GPUS

INTRODUCCIÓ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 detalles

CUDA 5.5 y Visual Studio Express 2012 para Escritorio. Primeros pasos.

CUDA 5.5 y Visual Studio Express 2012 para Escritorio. Primeros pasos. CUDA 5.5 y Visual Studio Express 2012 para Escritorio. Primeros pasos. La nueva versión de CUDA 5.5 es completamente compatible con la plataforma de desarrollo Visual Studio Express 2012 para escritorio

Más detalles

Arquitecturas GPU v. 2015

Arquitecturas GPU v. 2015 v. 2015 http://en.wikipedia.org/wiki/graphics_processing_unit http://en.wikipedia.org/wiki/stream_processing http://en.wikipedia.org/wiki/general-purpose_computing_on_graphics_processing_ units http://www.nvidia.com/object/what-is-gpu-computing.html

Más detalles

Velocidades Típicas de transferencia en Dispositivos I/O

Velocidades Típicas de transferencia en Dispositivos I/O Entradas Salidas Velocidades Típicas de transferencia en Dispositivos I/O Entradas/Salidas: Problemas Amplia variedad de periféricos Entrega de diferentes cantidades de datos Diferentes velocidades Variedad

Más detalles

1 Primitivas básicas de OpenMP

1 Primitivas básicas de OpenMP 1 Primitivas básicas de OpenMP Consultar la página oficial de la plataforma OpenMP http://www.openmp.org/drupal/ Pragmas Es una directiva para el compilador que permite la definición de nuevas directivas

Más detalles

Sistemas Operativos. Procesos

Sistemas Operativos. Procesos Sistemas Operativos Procesos Agenda Proceso. Definición de proceso. Contador de programa. Memoria de los procesos. Estados de los procesos. Transiciones entre los estados. Bloque descriptor de proceso

Más detalles

Kepler. 1. Presentación de la arquitectura. Índice de contenidos [25 diapositivas] Kepler, Johannes (1571-1630)

Kepler. 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 detalles

Tema 3. Estructuras de control

Tema 3. Estructuras de control Tema 3. Estructuras de control 3.1. Secuencial 3.2. Selección 3.3. Repetición 2 Objetivos Objetivos del tema: Conocer y saber la utilidad de las tres estructuras de control (secuencial, alternativa y repetitiva)

Más detalles

PROGRAMACIÓN E IMPLEMENTACIÓN DE UN CLÚSTER

PROGRAMACIÓN E IMPLEMENTACIÓN DE UN CLÚSTER Universidad Autónoma Metropolitana Unidad Iztapalapa PROGRAMACIÓN E IMPLEMENTACIÓN DE UN CLÚSTER DE GPU'S Autores Regalado Orocio Luis Armando Bolaños Palacios Julio Cesar Asesores M. en C. Quiroz Fabián

Más detalles

Sist s em e a m s s O per e ativos o. s Unidad V Entrada Sali l d i a.

Sist s em e a m s s O per e ativos o. s Unidad V Entrada Sali l d i a. Sistemas Operativos. Unidad V Entrada Salida. Programación de Entrada y Salida Introducción. Comunicación de los procesos con el mundo externo : Mecanismo de E/S de información. Aspectos que diferencian

Más detalles

V. OPTIMIZACIÓN PARA COMPUTACIÓN GPU EN CUDA

V. OPTIMIZACIÓN PARA COMPUTACIÓN GPU EN CUDA V. OPTIMIZACIÓN PARA COMPUTACIÓN GPU EN CUDA La arquitectura de una GPU es básicamente distinta a la de una CPU. Las GPUs están estructuradas de manera paralela y disponen de un acceso a memoria interna

Más detalles

Informática Electrónica Manejadores de Dispositivos (Device Drivers)

Informática Electrónica Manejadores de Dispositivos (Device Drivers) Informática Electrónica Manejadores de Dispositivos (Device Drivers) DSI-EIE-FCEIA 2015 Que es un DD? Es una pieza de software que interactúa con (entre) el sistema operativo y con uno o mas dispositivos

Más detalles

Segunda Parte: TECNOLOGÍA CUDA

Segunda Parte: TECNOLOGÍA CUDA Segunda Parte: (compute unified device architecture) 12 I. CUDA CUDA es una arquitectura de cálculo paralelo de NVIDIA que aprovecha la potencia de la GPU (unidad de procesamiento gráfico) para proporcionar

Más detalles

Procesamiento Paralelo

Procesamiento Paralelo Procesamiento Paralelo OpenCL - Introducción Javier Iparraguirre Universidad Tecnológica Nacional, Facultad Regional Bahía Blanca 11 de Abril 461, Bahía Blanca, Argentina http://www.frbb.utn.edu.ar/hpc/

Más detalles

Procesos e Hilos en C

Procesos 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 detalles

Arquitecturas 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. 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 detalles

Ejemplos de optimización para Kepler. 1. Balanceo dinámico de la carga. Contenidos de la charla [18 diapositivas]

Ejemplos 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 detalles

Paralelización sobre GPU del Algoritmo de Eliminación de Gauss-Jordan para la Solución de Sistemas de Ecuaciones Lineales

Paralelización sobre GPU del Algoritmo de Eliminación de Gauss-Jordan para la Solución de Sistemas de Ecuaciones Lineales Paralelización sobre GPU del Algoritmo de Eliminación de Gauss-Jordan para la Solución de Sistemas de Ecuaciones Lineales Edgar Quispe Ccapacca edgar.edqc@gmail.com Escuela Profesional de Ingeniería de

Más detalles

ALGORITMO DE CÁLCULO DE CÁPSULAS CONVEXAS

ALGORITMO DE CÁLCULO DE CÁPSULAS CONVEXAS ALGORITMO DE CÁLCULO DE CÁPSULAS CONVEXAS Trabajo Final de Licenciatura en Ciencias de la Computación Universidad Nacional de Córdoba Facultad de Matemática, Astronomía y Física (Córdoba - Argentina) Autor:

Más detalles

PARTE II PROGRAMACION CON THREADS EN C

PARTE II PROGRAMACION CON THREADS EN C PARTE II PROGRAMACION CON THREADS EN C II.1 INTRODUCCION Una librería o paquete de threads permite escribir programas con varios puntos simultáneos de ejecución, sincronizados a través de memoria compartida.

Más detalles

Ejemplos de optimización para Kepler Contenidos de la charla [18 diapositivas]

Ejemplos de optimización para Kepler Contenidos de la charla [18 diapositivas] Ejemplos de optimización para Kepler Contenidos de la charla [18 diapositivas] RIO 2014 Río Cuarto (Argentina), 20 de Febrero, 2014 1. 2. 3. 4. 5. 6. Balanceo dinámico de la carga. [2] Mejorando el paralelismo

Más detalles

06. GESTIÓN DE PROCESOS Y RECURSOS

06. GESTIÓN DE PROCESOS Y RECURSOS 06. GESTIÓN DE PROCESOS Y RECURSOS MENSAJES Y AVISOS DEL SISTEMA Y EVENTOS DEL SISTEMA Todos estos mensajes, avisos y eventos del sistema, los podemos ver en la herramienta Visor de eventos. Para acceder

Más detalles

UNIVERSIDAD DE BURGOS Área de Tecnología Electrónica INTRODUCCIÓN A LA PROGRAMACIÓN EN CUDA

UNIVERSIDAD DE BURGOS Área de Tecnología Electrónica INTRODUCCIÓN A LA PROGRAMACIÓN EN CUDA UNIVERSIDAD DE BURGOS Área de Tecnología Electrónica INTRODUCCIÓN A LA PROGRAMACIÓN EN CUDA César Represa Pérez José María Cámara Nebreda Pedro Luis Sánchez Ortega Introducción a la programación en CUDA

Más detalles

Programación Concurrente y Paralela. Unidad 1 Introducción

Programación Concurrente y Paralela. Unidad 1 Introducción Programación Concurrente y Paralela Unidad 1 Introducción Contenido 1.1 Concepto de Concurrencia 1.2 Exclusión Mutua y Sincronización 1.3 Corrección en Sistemas Concurrentes 1.4 Consideraciones sobre el

Más detalles

PARTES DE UN PROGRAMA EN C/C++

PARTES DE UN PROGRAMA EN C/C++ 1 PARTES DE UN PROGRAMA EN C/C++ 2 Un Programa Sencillo Considérese el programa transcrito a continuación: 1: #include 2: void main () 3: { 4: cout

Más detalles

Programación Gráfica de Altas Prestaciones

Programación Gráfica de Altas Prestaciones rogramación Gráfica de Altas restaciones lataformas de altas prestaciones para Infomática Gráfica. Máster de Desarrollo de Software Depto. de Lenguajes y Sistemas Informáticos lsi.ugr.es/~jmantas/ga 1.

Más detalles

Tema II. Unidad de memoria

Tema II. Unidad de memoria Tema II Unidad de memoria 2 Unidad de memoria 2.1 Definiciones y conceptos básicos 2.1.1 Localización 2.1.2 Capacidad 2.1.3 Unidad de transferencia 2.1.4 Método de acceso 2.1.5 Tipos físicos 2.1.6 Características

Más detalles

SISTEMAS 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 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 detalles

FUNCIONES. Identificador valido. Tipo-Funcion Identificador_de_la_funcion (Tipo par1,tipo par2 )

FUNCIONES. Identificador valido. Tipo-Funcion Identificador_de_la_funcion (Tipo par1,tipo par2 ) FUNCIONES Las funciones son el medio básico de que se vale C para construir programas. Un Programa es, básicamente, una colección de funciones entre las que se incluye una especial llamada main(), la función

Más detalles

Sistemas con Microprocesadores I

Sistemas con Microprocesadores I Sistemas con Microprocesadores I 1 Microcontroladores Introducción Harvard vs. von-neumann Clasificación del procesador Segmentado o Pipeline Ortogonal vs. No ortogonal 2 Microcontroladores PIC Siglas

Más detalles

Tema 3 SUBRUTINAS. Estructura de Computadores OCW_2015 Nekane Azkona Estefanía

Tema 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 detalles

Evolución del software y su situación actual

Evolución del software y su situación actual Evolución del software y su situación actual El software es el conjunto de programas que permite emplear la PC, es decir, es el medio de comunicación con la computadora, el control de sus funciones y su

Más detalles

Ejercicios del Tema 3. Fundamentos de la programación en ensamblador

Ejercicios del Tema 3. Fundamentos de la programación en ensamblador Ejercicios del Tema 3. Fundamentos de la programación en ensamblador Ejercicio 1. Dada la siguiente expresión de un lenguaje de alto nivel int a = 6; int b = 7; int c = 3; int d; d = (a+b) * (a+b); Indique

Más detalles

Dep. Ingeniería de Sistemas y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla

Dep. Ingeniería de Sistemas y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Trabajo Fin de Grado Grado en Ingeniería de las Tecnologías Industriales Implementación de Control Predictivo Basado en CUDA Autor: Andrés Álvarez Cía Tutor: José María Maestre Torreblanca Equation Chapter

Más detalles

Introducción a la Computación. Capítulo 7 Entrada/Salida

Introducción a la Computación. Capítulo 7 Entrada/Salida Introducción a la Computación Capítulo 7 Entrada/Salida Problemas Entrada/Salida Existe una amplia variedad periféricos Se les entrega distintas cantidades de datos Funcionan a distintas velocidades Tienen

Más detalles

Tema 2 Introducción a la Programación en C.

Tema 2 Introducción a la Programación en C. Tema 2 Introducción a la Programación en C. Contenidos 1. Conceptos Básicos 1.1 Definiciones. 1.2 El Proceso de Desarrollo de Software. 2. Lenguajes de Programación. 2.1 Definición y Tipos de Lenguajes

Más detalles

Paralelización de algoritmos para el procesado de imágenes de teledetección

Paralelización de algoritmos para el procesado de imágenes de teledetección UNIVERSIDAD DE ALCALÁ Escuela Politécnica Superior INGENIERÍA DE TELECOMUNICACIÓN Trabajo Fin de Carrera Paralelización de algoritmos para el procesado de imágenes de teledetección Alberto Monescillo Álvarez

Más detalles

Guillermo Román Díez

Guillermo Román Díez Concurrencia Creación de Procesos en Java Guillermo Román Díez groman@fi.upm.es Universidad Politécnica de Madrid Curso 2016-2017 Guillermo Román, UPM CC: Creación de Procesos en Java 1/18 Concurrencia

Más detalles

El nivel ISA (II)! Conjunto de Instrucciones

El 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 detalles

Introducción a la programación de códigos paralelos con CUDA y su ejecución en un GPU multi-hilos

Introducción a la programación de códigos paralelos con CUDA y su ejecución en un GPU multi-hilos Introducción a la programación de códigos paralelos con CUDA y su ejecución en un GPU multi-hilos Gerardo A. Laguna-Sánchez *, Mauricio Olguín-Carbajal **, Ricardo Barrón-Fernández *** Recibido: 02 de

Más detalles

USO DE SUBRUTINAS, TRANSMISIÓN DE PARÁMETROS Y COMPILACIÓN CONDICIONAL EN C++

USO DE SUBRUTINAS, TRANSMISIÓN DE PARÁMETROS Y COMPILACIÓN CONDICIONAL EN C++ USO DE SUBRUTINAS, TRANSMISIÓN DE PARÁMETROS Y COMPILACIÓN CONDICIONAL EN C++ Bruno López Takeyas Instituto Tecnológico de Nuevo Laredo Reforma Sur 2007, C.P. 88250, Nuevo Laredo, Tamps. México http://www.itnuevolaredo.edu.mx/takeyas

Más detalles

EVOLUCIÓN HISTÓRICA DE LOS µp

EVOLUCIÓN HISTÓRICA DE LOS µp EVOLUCIÓN HISTÓRICA DE LOS µp El primer procesador fue inventado por los Babilonios en el año 500 ac En 1642 se perfeccionó la primera calculadora por Blas Pascal A mediados del siglo pasado se inventaron

Más detalles

PROBLEMAS TEMA 1: Estructuras de interconexión de un computador

PROBLEMAS TEMA 1: Estructuras de interconexión de un computador PROBLEMAS TEMA 1: Estructuras de interconexión de un computador Problemas propuestos en examen 1.1 Una CPU que emplea un tamaño de palabra de 16 bits tiene un repertorio de 16 instrucciones con un formato

Más detalles

Organización de Computadoras

Organización de Computadoras Organización de Computadoras SEMANA 10 UNIVERSIDAD NACIONAL DE QUILMES Qué vimos? Mascaras Repeticiones controladas Arreglos Modo indirecto Q5 Hoy! Memorias: Características Memorias ROM Jerarquía de memorias

Más detalles

INSTITUTO POLITÉCNICO NACIONAL OPERADORES LINEALES EN GPUS APLICADOS A LA EVALUACIÓN DE ENERGÍA POTENCIAL PARA PROTEÍNAS T E S I S

INSTITUTO POLITÉCNICO NACIONAL OPERADORES LINEALES EN GPUS APLICADOS A LA EVALUACIÓN DE ENERGÍA POTENCIAL PARA PROTEÍNAS T E S I S INSTITUTO POLITÉCNICO NACIONAL CENTRO DE INVESTIGACIÓN EN COMPUTACIÓN OPERADORES LINEALES EN GPUS APLICADOS A LA EVALUACIÓN DE ENERGÍA POTENCIAL PARA PROTEÍNAS T E S I S QUE PARA OBTENER EL GRADO DE MAESTRA

Más detalles

Programando 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. 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 detalles

Programación imperativa. Algoritmos y Estructuras de Datos I. Ciclos

Programación imperativa. Algoritmos y Estructuras de Datos I. Ciclos Programación imperativa Algoritmos y Estructuras de Datos I Segundo cuatrimestre de 2014 Departamento de Computación - FCEyN - UBA Programación imperativa - clase 6 Ciclos y arreglos Entidad fundamental:

Más detalles

UNIDAD TEM ATICA 3: ACELERACI ON DEL ACCESO A MEMORIA.

UNIDAD TEM ATICA 3: ACELERACI ON DEL ACCESO A MEMORIA. UNIDAD TEMÁTICA 3: ACELERACIÓN DEL ACCESO A MEMORIA. 10. Evaluación de las prestaciones del subsistema de memoria. 11. Mejora de las prestaciones de las antememorias. 12. Mejora de las prestaciones de

Más detalles

Elementos constituyentes de la ejecución de un programa

Elementos constituyentes de la ejecución de un programa Micro-Operaciones En la ejecución de un programa en una computadora, se ejecutan instrucciones, que pueden subdividirse en ciclos: Búsqueda/Ejecución Cada ciclo se compone a su vez de una serie de operaciones

Más detalles

Sistemas Operativos Tema 5. Procesos. 1998-2012 José Miguel Santos Alexis Quesada Francisco Santana

Sistemas Operativos Tema 5. Procesos. 1998-2012 José Miguel Santos Alexis Quesada Francisco Santana Sistemas Operativos Tema 5. Procesos 1998-2012 José Miguel Santos Alexis Quesada Francisco Santana 1 Contenidos Concepto de proceso Estructuras de datos: BCP y colas de procesos Niveles de planificación

Más detalles

Nombre alumno: Ventajas: Inconvenientes:

Nombre alumno: Ventajas: Inconvenientes: Preguntas cortas (justifica todas las respuestas) (2 puntos) 1. Define qué es la buffer cache, qué tipo de información encontramos y cuál es su objetivo 2. Explica qué ventajas e inconvenientes tendría

Más detalles

Funciones Definición de función

Funciones Definición de función Funciones Definición de función Una función es un bloque de código que realiza una tarea específica. Una función es una porción de programa, identificable mediante un nombre, que realiza determinadas tareas

Más detalles

UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA FACULTAD DE CIENCIAS PRACTICA DE PROCESOS HERRAMIENTAS

UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA FACULTAD DE CIENCIAS PRACTICA DE PROCESOS HERRAMIENTAS UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA FACULTAD DE CIENCIAS PRACTICA DE PROCESOS HERRAMIENTAS Caso 1: 1.- Necesitamos un cd o Dvd para grabar alguna de las versiones de livecd de Linux. 2.- Liga de una

Más detalles

Procesos y Threads Procesos y Threads. Concurrencia Concurrencia Ventajas Ventajas. Rendimiento Rendimiento (paralelismo) (paralelismo)

Procesos y Threads Procesos y Threads. Concurrencia Concurrencia Ventajas Ventajas. Rendimiento Rendimiento (paralelismo) (paralelismo) Procesos y Threads Procesos y Threads Procesos Procesos Threads Threads Concurrencia Concurrencia Ventajas Ventajas Modelos Modelos Información Información adicional () adicional () Preparado Preparado

Más detalles

Programando la GPU con CUDA

Programando 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 detalles

Universidad Complutense de Madrid FACULTAD DE INFORMÁTICA

Universidad 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 detalles

Introducción a Java. Dr. (c) Noé Alejandro Castro Sánchez

Introducción a Java. Dr. (c) Noé Alejandro Castro Sánchez Introducción a Java Dr. (c) Noé Alejandro Castro Sánchez Programas Java Applets Pueden correr en navegadores Web Agregan funcionalidad a páginas Web Se llega a restringir su funcionalidad (e. g., no pueden:

Más detalles

Programación en Entornos Paralelos: MPI

Programación en Entornos Paralelos: MPI 1-11 Marzo de 2017 FACET -UNT Programación en Entornos Paralelos: MPI Graciela Molina mgracielamolina@gmailcom TRADICIONALMENTE Procesamiento secuencial 2 TRADICIONALMENTE Procesamiento secuencial Si ya

Más detalles

Message Passing Interface (MPI)

Message Passing Interface (MPI) Message Passing Interface (MPI) INTRODUCCIÓN MPI (Message Passing Interface) como es un interfaz estandarizada para la realización de aplicaciones paralelas basadas en pasaje de mensajes. El modelo de

Más detalles

Paradigmas de lenguajes de programación. Introducción a la programación imperativa. Lenguaje C. Programación imperativa

Paradigmas de lenguajes de programación. Introducción a la programación imperativa. Lenguaje C. Programación imperativa Paradigmas de lenguajes de programación Introducción a la programación imperativa Algoritmos y Estructuras de Datos I Paradigma: Definición del modo en el que se especifica el cómputo (que luego es implementado

Más detalles

TEMA 5: Subprogramas, programación modular

TEMA 5: Subprogramas, programación modular TEMA 5: Subprogramas, programación modular 5.1.-Definición de módulo. Programación modular La programación modular está basada en la técnica de diseño descendente, que como ya vimos consiste en dividir

Más detalles