CUDA: MODELO DE PROGRAMACIÓN

Documentos relacionados
Alejandro Molina Zarca

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

Primeros pasos con CUDA. Clase 1

CUDA (Compute Unified Device Architecture)

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

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

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

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

PROGRAMACIÓN AVANZADA DE GPUs PARA APLICACIONES CIENTÍFICAS

Programación de una GPU con CUDA

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

Arquitecturas y programación de procesadores gráficos. Nicolás Guil Mata Dpto. de Arquitectura de Computadores Universidad de Málaga

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

SUMA de Vectores: Hands-on

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

DESARROLLO DE APLICACIONES EN CUDA

CUDA Overview and Programming model

Iniciación a la Programación de GPU

INTRODUCCIÓN A LA COMPUTACIÓN PARALELA CON GPUS

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

Librería Thrust. Clase 4.

Computación en procesadores gráficos

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

Modelo de aplicaciones CUDA

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

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

reactivision en CUDA:

Arquitecturas GPU v. 2013

Programando la GPU con CUDA RIO 2014 Río Cuarto (Argentina), 17 y 18 de Febrero, Agradecimientos. Prerrequisitos para este tutorial

Programando la GPU con CUDA

Computación en procesadores gráficos

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

Sistemas Operativos. Procesos

Taller: Introducción a GPU's y Programación CUDA para HPC

GPGPU Avanzado. Sistemas Complejos en Máquinas Paralelas. Esteban E. Mocskos 5/6/2012

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

Universidad Complutense de Madrid FACULTAD DE INFORMÁTICA

ALGORITMO DE CÁLCULO DE CÁPSULAS CONVEXAS

Programación en Intel Xeon Phi

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

Extracción paralela de valores propios en matrices Toeplitz simétricas usando hardware gráfico

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

CDI Arquitecturas que soportan la concurrencia. granularidad

Introducción a OpenGL Shading Language (GLSL)

Bloque IV. Prácticas de programación en CUDA. David Miraut Marcos García Ricardo Suárez

Computación de Propósito General en Unidades de Procesamiento Gráfico GPGPU. Clase 1 Introducción

Seminario II: Introducción a la Computación GPU

Utilización de la programación paralela en procesadores gráficos para el cálculo científico.

IMPLEMENTACIÓN Y EVALUACIÓN DE UN ALGORITMO ABC EN GPU

MAGMA. Matrix Algebra on GPU and Multicore Architecture. Ginés David Guerrero Hernández

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

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

Radio Observatorio de Jicamarca Instituto Geofísico del Perú

Qué es un programa informático?

Descubriendo Kepler. 1. Presentación de la arquitectura. Agradecimientos. Indice de contenidos [46 diapositivas]

Hilos. Módulo 4. Departamento de Informática Facultad de Ingeniería Universidad Nacional de la Patagonia San Juan Bosco. Hilos

PROCESOS E HILOS - Hilo

Computación en procesadores gráficos Programación con CUDA

CUDA + OpenGL. Alvaro Cuno 23/01/2010

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

Transcripció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 nuevo modelo de programación paralela. Compute Unified Device Architecture Pequeña curva de aprendizaje. Escalable a 100s cores y a 1000s hilos paralelos. Empezó como una pequeña extensión de C, pero ya es soportada por OpenCL, Fortran...

Introducción

DEFINICIONES En el ámbito CUDA: Device = GPU Host = CPU Kernel = Función llamada desde el Host que se ejecuta en Device Array de hilos paralelos: 1 CUDA Kernel se ejecuta mediante un array de Threads. Todos los Threads ejecutan el mismo código. Cada Thread tiene un ID que se usa para direccionar la memoria y tomar las decisiones de control.

Jerarquía de hilos Unidad básica de operación es el thread. Los hilos están organizados en bloques de threads.(blocks) Los bloques están organizados en mallas de bloques. (Grids). Un Grid solo puede ejecutar un Kernel.

Jerarquía de hilos (II)

Jerarquía de hilos (y III) Hilos identificados mediante threadidx: vector de elementos 3D ( tiene 3 componentes, x, y y z). Cada hilo puede venir identificado por un índice 1, 2 ó 3 dimensiones. Los hilos de un bloque pueden cooperar entre sí mediante el uso de memoria compartida dentro del bloque y sincronizando su ejecución para coordinar los accesos a memoria. Los grids pueden ser de 1 o 2 dimensiones, luego cada block dentro de un grid puede ser direccionado por un índice de 1 o 2 dimensiones mediante blockidx. Asimismo, la dimensión del bloque también se puede obtener desde dentro del kernel mediante blockdim.

Jerarquía de memoria Cuda threads pueden acceder a los datos de múltiples espacios de memoria durante su ejecución. Cada thread posee su propia memoria local. Cada block su propia memoria compartida por todos los threads del bloque y con el mismo tiempo de vida que los threads que lo componen. Todos los hilos tienen acceso a la memoria global. Existen además otros 2 espacios de memoria adicionales de sólo lectura: constant y texture memory.

Jerarqía de memoria

Modelo Hardware

Cooperación CPU - GPU El modelo de programación de CUDA asume que los CUDA threads se ejecutan en un device que actúa como coprocesador de un host que ejecuta un programa. También asume que host y device poseen su propia DRAM, host memory y device memory. Cuda proporciona instrucciones para reservar, liberar, copiar memoria en la memoria del device, así como transferir datos entre el host y el device.

CUDA: EXTENSIÓN DE C.

Kernel // Kernel definition global void VecAdd(float* A, float* B, float* C) {... } int main() { // Kernel invocation VecAdd<<<1, N>>>(A, B, C); } Se define un kernel con la Primitiva global. Debe devolver void. Al invocarlo se le indica <<tamaño grid, tamaño bloque>>

Escalabilidad Los índices del elemento de la matriz que se va a procesar se definirán pues en función del tamaño del bloque, del id el hilo dentro del bloque actual y del tamaño del id del bloque actual. // Kernel definition global void MatAdd(float A[N][N], float B[N][N],float C[N][N]) { int i = blockidx.x * blockdim.x + threadidx.x; int j = blockidx.y * blockdim.y + threadidx.y; if (i < N && j < N) C[i][j] = A[i][j] + B[i][j]; } int main() {... // Kernel invocation dim3 dimblock(16, 16); } Cada hilo realiza la operación correspondiente. En este caso, es posible que el número de threads supere al número de elementos: controlar Se define la dimensión del Bloque. Puede ser de 1 o 2 dimensiones. Le estamos diciendo que cada bloque Va a tener 16x16=256 threads dim3 dimgrid((n + dimblock.x 1) / dimblock.x,(n + dimblock.y 1) / dimblock.y); MatAdd<<<dimGrid, dimblock>>>(a, B, C); Se define la dimensión del Grid. También puede ser de 1 o 2 y depende del tamaño del bloque y del tamaño del array.

Escalabilidad (II) El tamaño del block es elegido aparentemente de forma arbitraria, y el grid es creado con suficientes blocks para tener un thread por un elemento de la matriz. Todos los Threads de un block se ejecutan dentro del mismo core. El número de threads por block está limitado por los recursos de memoria del core: En la misma GPU, actualmente un block puede contener 512 threads.

Escalabilidad (y III) El tamaño de los datos suele ser más grande que el de los hilos: Independencia de ejecución entre bloques: debe dar igual el orden, y si se ejecutan en paralelo o en serie. Si no: syncthreads(). Blocks necearios para permitir la escalabilidad a diferentes números de core

Memoria CUDA asume que device y host tienen su propia memoria. En principio, device trabaja con la host memory. Para que trabaje con su propia memoria, CUDA proporciona, entre otros: cudamalloc(void **, size_t); cudamemcpy(void *,void *, size_t,cudamemcpyhosttodevice cudamemcpydevicetohost); cudafree(void *);

COMPILACIÓN Tenemos código que se va a ejecutar en el host y código que se va a ejecutar en el device. Nvcc se va a encargar de separarlos. Una vez separados, el código del host se compilará con su compilador habitual, pej. Cc, y el código del device lo transformará en código binario (cubin) o ensamblador (PTX) Por último, para cargarlo y ejecutarlo en el device la aplicación se ayuda de las APIS proporcinadas por los drivers de CUDA

Apéndice Interoperatividad con Directx y OpenGL. Versión 2.3.1 (26/08/2009) Muy extendido: Resultados google del orden de 1 M en nvidia cuda y de 1 K en nvidia cuda programming guide. Arquitectura actual: nvidia FERMI: 512 cuda cores. 228 universidades enseñan cuda actualmente. (4 de ellas Españolas)

Documentación http://www.nvidia.com/object/cuda_home.html# http://es.wikipedia.org/wiki/cuda