Procesadores Gráficos: para programadores de CUDA Curso 2011/12 David Miraut david.miraut@urjc.es Universidad Rey Juan Carlos April 24, 2013
Indice Estándar Modelo de de El lenguaje programa de Inicialización de 58 Estándar Modelo de de El lenguaje programa de Inicialización de Universidad Rey Juan Carlos
Interfaces de programación GPU A lo largo del tiempo han surgido muchas soluciones: GPGPU Vertex / pixel shaders Muy limitada por las características del cauce gráfico Brook Después Brook+ Despúes CAL/IL (Compute Abstraction Layer) / (Intermediate Language) CUDA Muy extendido Con un modelo de programación sencillo Todas ellas requieren de un conocimiento profundo de la arquitectura utilizada Los detalles que hacen posible un gran rendimiento minan la posibilidad de tener portabilidad entre arquitecturas 3 Estándar Modelo de de El lenguaje programa de Inicialización de
Nos movemos hacia un futuro masivamente paralelo Y esto parece la torre de Babel HMPP StarSS Unified Parallel C NEPAL Cilk ATI Stream Sequoia RapidMind IntelCt Close to Metal Microsoft accelerator Direct Compute CUDA... 58 4 Estándar Modelo de de El lenguaje programa de Inicialización de Universidad Rey Juan Carlos
Nuevo estándar de Khronos para la computación heterogénea la versión 1.0 salió en Dic. 2008 Ha sido muy promocionado por Apple Tienen la marca registrada y Khronos tiene una licencia El chair del grupo de trabajo es Neil Trevett, vicepresidente de nvidia y Presidente del Khronos Group Abierto y libre de royalties Multi-fabricante y multiplataforma Hace uso de todas las entidades / unidades de proceso CPUs, GPUs, APUs y otras Us Facilita la computación heterogénea en sistemas manycore Escala desde soluciones empotradas a HPC Hay un profile especial para el desarrollo en teléfonos móviles, coches... 58 5 Estándar Modelo de de El lenguaje programa de Inicialización de Universidad Rey Juan Carlos
Punto de vista del HW de Un host y múltiples devices Cada device tiene varias unidades de cómputo Cada unidad de cómputo tiene varios elementos de proceso Ejemplo: nvidia Tesla C1060 30 Unidades de Cómputo 8 elementos de proceso = 240 elementos de proceso 6 Estándar Modelo de de El lenguaje programa de Inicialización de
Estructura de la Capa de plataforma (se llama desde el host) Capa de abstracción para los recusos computacionales de distintas fuentes Permite hacer solicitud, selección e inicialización de los recursos computacionales Crea los contextos y colas de trabajo para la computación Runtime (se llama desde el host) Lanza kernels de computación Establece la configuración de la ejecución Gestiona la planificación, cómputo y uso de recursos de Language Sirve para escribir los kernels que se ejecutarán en los dispositivos de computación Basado en C con una interfaz de programación de "plataforma cruzada" Subconjunto de ISO C99 con extensiones del lenguaje Incluye un rico conjunto de funciones built-in, además de operadores estándar de C Puede ser compilado al vuelo (JIT/Online) u offline 58 7 Estándar Modelo de de El lenguaje programa de Inicialización de Universidad Rey Juan Carlos
Ejecución del kernel de vs. CUDA 8 Estándar Modelo de de El lenguaje programa de Inicialización de Grid = NDRange Block = Work-Group Thread = Work-Item
Ejecución del kernel de vs. CUDA 9 Estándar Modelo de de El lenguaje programa de Inicialización de Número total de work groups = G x G y Tamaño de cada work group = S x S y El ID global se puede calcular a partir del Work Group ID y el Local ID
Estándar 10 Modelo de de El lenguaje programa de Inicialización de
Modelo de de Private memory accesible sólo por el work-item en un elemento de proceso. Local memory accesible por cada work-item en un work-group Constant Memory accesible por cada work-group (sólo lectura) Global memory accesible por cada work-group, persistente El programador se encarga de las copias entre del host y la global 58 Estándar 10 Modelo de de El lenguaje programa de Inicialización de Universidad Rey Juan Carlos
Modelo de de Global = Global Memoria accesible a nivel de device ( de vídeo) Shared = Local Memoria accesible a nivel de work-group ( compartida) Local = Private Memoria accesible a nivel de work-item Estándar 11 Modelo de de El lenguaje programa de Inicialización de
Primer ejemplo de código en Estándar 12 Modelo de de El lenguaje programa de Inicialización de
Kernel Equivalente a la función de C ejecutada en el Device Punto de entrada, argumentos, no devuelve valores Programa Colección de kernels y funciones Es equivalente una librería cargada dinámicamente Cola de (Command Queue) Contiene las invocaciones del kernel y otros de (como la copia/mapeo/... de ) Se encola en orden Se ejecuta fuera de orden (opcionalmente, depende de la implementación) Evento Sincroniza la ejecución dentro de una cola y entre colas en un contexto 58 Estándar Modelo de de 13 El lenguaje programa de Inicialización de Universidad Rey Juan Carlos
NDRange Ejecución paralela con un modelo orientado a partición por datos Los kernels se ejecutan a través de 1, 2 ó 3 dimensiones de un espacio indexado en dos niveles llamado NDRange Los kernels se instancian como work-items (hebras de CUDA) y son agrupados en work-groups No hay sincronización entre work-groups, son independientes Las barreras de sincronizan work-items dentro de un work-group El programador elige el NDRange apropiado para el tamaño del problema Estándar Modelo de de 14 El lenguaje programa de Inicialización de
Ejemplo NDRange Procesamos una imagen de 256x256, 1 pixel por work-item Estándar Modelo de de 15 El lenguaje programa de Inicialización de
Ejemplo NDRange Procesamos una imagen de 256x256, 1 pixel por work-item Estándar Modelo de de 16 El lenguaje programa de Inicialización de
Ejemplo NDRange Procesamos una imagen de 256x256, 1 pixel por work-item Estándar Modelo de de 17 El lenguaje programa de Inicialización de
NDRange A cada work-item se le da el mismo argumento, pero tiene un identificador local distinto para cada uno dentro del grupo y un identificador global único Cada work-group tiene también un identificador único Los IDs y los tamaños se pueden obtener mediante funciones get_() El tamaño global es múltiplo del tamaño local Estándar Modelo de de 18 El lenguaje programa de Inicialización de
El lenguaje de Estándar Está basado en C99 con limitaciones y extensiones Limitaciones: no hay recursión, no hay cabeceras tipo C99, no hay campos de bits, no hay funciones a punteros, no hay arrays de tamaño variable, no hay stores accesibles con palabra de tamaño byte : tipos vector, work-items y work-groups, sincronización, funciones de acceso a imágenes, conversiones... Modelo de de El lenguaje 19 programa de Inicialización de
Memoria y sincronización La privada se comporta como una pila de almacenamiento para las hebras La local es compartida y accedida por todos items de un work-group Sincronización a través de barrier(clk_local_mem_fence CLK_GLOBAL_MEM_FENCE); Nos puede servir como en el caso de CUDA para asegurar que se han hecho todas las operaciones entre mem. local y global antes del procesado Estándar Modelo de de El lenguaje 20 programa de Inicialización de
Ejemplo Estándar Modelo de de El lenguaje 21 programa de Inicialización de
Ejemplo Estándar Los bucles (anidados) que recorren los elementos se convierten en el NDRange La parte interna del bucle se convierte en el kernel Modelo de de El lenguaje 22 programa de Inicialización de
Ejemplo Los bucles (anidados) que recorren los elementos se convierten en el NDRange La parte interna del bucle se convierte en el kernel Estándar Modelo de de El lenguaje 23 programa de Inicialización de -
: plataformas, devices y contextos Estándar Modelo de de La runtime library de puede dar soporte a varias plataformas (de diferentes fabricantes) Los devices son consultados desde la plataforma Los contextos se crean para uno o más devices El resto de objetos se crean en el contexto 24 El lenguaje programa de Inicialización de
: Memoria y programas Estándar Modelo de de Los espacios de (bufferes e imágenes) se crean y replican en todos los devices en el contexto Se inicializa y accede utilizando el puntero de host y las operaciones soportadas de map/unmap y read/write/copy Los programas se pueden crear a partir de fuentes o de binarios compilados para los devices 25 El lenguaje programa de Inicialización de
: colas,, eventos y sincronización Estándar Los se mandan a los devices a través de las colas de Casi todos los en la cola esperan por una lista de eventos y producen un evento a su vez Los eventos sólo se pueden utilizar en el contexto en el que son creados Eventos de flush, finish, espera... Eventos barrera, marker... Modelo de de 26 El lenguaje programa de Inicialización de
Estructura básica de un programa Programa en el host Crea objetos de asociados a contextos (1) Compila y crea los kernels (código objeto) (1) Envia los a la cola (1) Sincroniza los (1) Libera los recursos de (1) Se comunica y pregunta a los dispositivos de computación (2) Crea contextos (2) Kernel de computación (se ejecuta en el device) Código C con algunas restricciones y extensiones (3) (1) Capa de plataforma (2) Runtime (3) Lenguaje Estándar Modelo de de El lenguaje 27 programa de Inicialización de
Objetos de de Objetos tipo buffer Colección 1D de objetos (como los arrays de C) Tipos escalar y vectorial, y estructuras definidas por el usuario Se accede via punteros en el kernel Objetos tipo imagen Texturas 2D o 3D, frame-buffer, o imágenes Se accede únicamente a través de funciones built-in Objetos de muestreo Describen cómo se muestrea una imagen en el kernel modos de direccionamiento modos de filtrado Estándar Modelo de de El lenguaje 28 programa de Inicialización de
Highlights del lenguaje qualifiers tipo función kernel declara una función como kernel qualifiers relacionados con espacio de direccionamiento global, local, constant, private funciones de los Work-item get_work_dim() get_global_id(), get_local_id(), get_group_id(), get_local_size() Funciones de imagen Deben ser accedidas a través de las funciones built-in Las lecturas y escrituras se llevan a cabo a través de los objetos de muestreo desde el host ó en el device Funciones de sincronización Barreras Todos los Work Items dentro de un Work Group deben ejecutar la función de barrera antes de que ninguno de ellos pueda continuar 58 Estándar Modelo de de El lenguaje 29 programa de Inicialización de Universidad Rey Juan Carlos
Ejemplo de programa paso a paso 1. Enumerar las plataformas y dispositivos (devices) 2. Crear el contexto 3. Crear la cola de 4. Crear el programa 5. Reservar e inicializar la 6. Poner los argumentos y poner el kernel en la cola 7. Sincronizar 8. Leer los resultados 9. Limpiar Estándar Modelo de de El lenguaje 30 programa de Inicialización de
Enumerar las plataformas Estándar Los dispositivos pueden ser : CL_DEVICE_TYPE_CPU CL_DEVICE_TYPE_GPU CL_DEVICE_TYPE_ACCELERATOR Modelo de de El lenguaje 31 programa de Inicialización de
Creación del contexto de Estándar Modelo de de El lenguaje programa de 32 Inicialización de
Creación de la cola de Estándar Modelo de de El lenguaje programa de 33 Inicialización de
Creación del programa y el kernel Estándar Modelo de de El lenguaje programa de 34 Inicialización de
Creación del programa y el kernel Estándar Modelo de de El lenguaje programa de 35 Inicialización de
Reservar e inicializar Estándar Modelo de de El lenguaje programa de 36 Inicialización de
Reservar e inicializar Estándar Modelo de de El lenguaje programa de 37 Inicialización de
Otras formas de inicializar la Estándar Modelo de de El lenguaje programa de 38 Inicialización de
Estándar Modelo de de El lenguaje programa de Inicialización de 39
Estándar Modelo de de El lenguaje programa de Inicialización de 40
Estándar Modelo de de El lenguaje programa de Inicialización de 41
Estándar Modelo de de El lenguaje programa de Inicialización de 42
Estándar Modelo de de El lenguaje programa de Inicialización de 43
Estándar Modelo de de El lenguaje programa de Inicialización de 44
Estándar Modelo de de El lenguaje programa de Inicialización de 45
Suma de dos vectores (muy grandes) en coma flotante c[i] = a[i] + b[i] Equivalente al bucle de C Estándar Modelo de de El lenguaje programa de El ejemplo oclvectoradd del NVIDIA SDK da más detalles Aquí se ha quitado el código de gestión de errores, salida por consola y comparación con la ejecución en el host Inicialización de 46
Suma Vectores: Secuencia de ejecución Set Up Set work sizes for kernel execution Allocate and init host data buffers Create context for GPU device Query compute devices (in the context) Create command queue (in the context) Create buffers on the GPU device (in the context) Create and build a program (in the context) Create kernel Set kernel arguments Core sequence Copy (write) data from host to GPU Launch kernel in command-queue Copy (read) data from GPU to host... block Clean up Estándar Modelo de de El lenguaje programa de Inicialización de 47
Suma Vectores: Codigo del Kernel Estándar Modelo de de El lenguaje programa de Inicialización de 48
Suma Vectores: Host declaraciones Estándar Modelo de de El lenguaje programa de Inicialización de 49
Suma Vectores: Host setup Estándar Modelo de de El lenguaje programa de Inicialización de 50
Suma Vectores: Contexto, Device & Colas Estándar Modelo de de El lenguaje programa de Inicialización de 51
Suma Vectores: Creación de objetos de Estándar Modelo de de El lenguaje programa de Inicialización de 52
Suma Vectores: Programa & Kernel Estándar Modelo de de El lenguaje programa de Inicialización de 53
Suma Vectores: Core Sequence Estándar Modelo de de El lenguaje programa de Inicialización de 54
Suma Vectores: Cleanup Estándar Modelo de de El lenguaje programa de Inicialización de 55
Suma Vectores: Salida de consola Estándar Modelo de de El lenguaje programa de Inicialización de 56
Estándar Modelo de de Experimentar con el SDK La especificaión de es muy interesante aunque no todos los vendors la implementan al completo Los foros de Khronos y nvidia son especialmente útiles El lenguaje programa de Inicialización de 57
Estándar Modelo de de El lenguaje programa de Inicialización de 58