Primeros pasos con CUDA. Clase 1
|
|
- Tomás Soriano Lucero
- hace 8 años
- Vistas:
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 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: 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 detallesIntroducció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 detallesCUDA (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 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 detallesINTRODUCCIÓ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 detallesAlejandro 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 detallesFrancisco 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 detallesGPGPU ( 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 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 detallesINTRODUCCIÓ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 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 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 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 detallesIntroducció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 detallesCÓ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 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 detallesProgramació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 detallesGPU-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 detallesFrancisco 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 detallesIntroducció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 detallesComputació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 detallesComputació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 detallesFrancisco 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 detallesIntroducció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 detallesSistemas 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 detallesPreparació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 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 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 detallesENTRADA-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 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 detallesProcesamiento 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 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 detalles48 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 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 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 detallesCUDA 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 detallesArquitecturas 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 detallesVelocidades 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 detalles1 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 detallesSistemas 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 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 detallesTema 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 detallesPROGRAMACIÓ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 detallesSist 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 detallesV. 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 detallesInformá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 detallesSegunda 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 detallesProcesamiento 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 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 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 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 detallesParalelizació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 detallesALGORITMO 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 detallesPARTE 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 detallesEjemplos 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 detalles06. 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 detallesUNIVERSIDAD 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 detallesProgramació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 detallesPARTES 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 detallesProgramació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 detallesTema 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 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 detallesFUNCIONES. 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 detallesSistemas 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 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 detallesEvolució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 detallesEjercicios 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 detallesDep. 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 detallesIntroducció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 detallesTema 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 detallesParalelizació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 detallesGuillermo 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 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 detallesIntroducció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 detallesUSO 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 detallesEVOLUCIÓ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 detallesPROBLEMAS 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 detallesOrganizació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 detallesINSTITUTO 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 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 detallesProgramació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 detallesUNIDAD 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 detallesElementos 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 detallesSistemas 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 detallesNombre 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 detallesFunciones 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 detallesUNIVERSIDAD 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 detallesProcesos 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 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 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 detallesIntroducció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 detallesProgramació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 detallesMessage 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 detallesParadigmas 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 detallesTEMA 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