Gracias por enviar su consulta! Uno de los miembros de nuestro equipo se pondrá en contacto con usted en breve.
Gracias por enviar su reserva! Uno de los miembros de nuestro equipo se pondrá en contacto con usted en breve.
Temario del curso
Introducción
- ¿Qué es OpenCL?
- OpenCL vs CUDA vs SYCL
- Descripción general de las características y arquitectura de OpenCL
- Configuración del entorno de desarrollo
Primeros Pasos
- Creación de un nuevo proyecto de OpenCL utilizando Visual Studio Code
- Exploración de la estructura y archivos del proyecto
- Compilación y ejecución del programa
- Visualización de la salida utilizando printf y fprintf
API de OpenCL
- Comprensión del papel de la API de OpenCL en el programa del host
- Uso de la API de OpenCL para consultar la información y capacidades del dispositivo
- Uso de la API de OpenCL para crear contextos, colas de comandos, buffers, kernels y eventos
- Uso de la API de OpenCL para encolar comandos, como lectura, escritura, copia, mapeo, desmapeo, ejecución y espera
- Manejo de errores y excepciones mediante la API de OpenCL
OpenCL C
- Comprensión del papel de OpenCL C en el programa del dispositivo
- Uso de OpenCL C para escribir kernels que se ejecuten en el dispositivo y manipulen datos
- Empleo de tipos de datos, calificadores, operadores y expresiones en OpenCL C
- Utilización de funciones integradas de OpenCL C, como matemáticas, geométricas, relacionales, etc.
- Uso de extensiones y bibliotecas de OpenCL C, como atomic, image, cl_khr_fp16, etc.
Modelo de Memoria de OpenCL
- Comprensión de las diferencias entre los modelos de memoria del host y del dispositivo
- Uso de los espacios de memoria de OpenCL, como global, local, constante y privada
- Utilización de objetos de memoria de OpenCL, como buffers, imágenes y tuberías (pipes)
- Empleo de modos de acceso a la memoria en OpenCL, como solo lectura, solo escritura, lectura-escritura, etc.
- Aplicación del modelo de consistencia de memoria y los mecanismos de sincronización de OpenCL
Modelo de Ejecución de OpenCL
- Comprensión de las diferencias entre los modelos de ejecución del host y del dispositivo
- Uso de elementos de trabajo (work-items), grupos de trabajo (work-groups) y rangos multidimensionales (ND-ranges) de OpenCL para definir el paralelismo
- Utilización de funciones de elementos de trabajo en OpenCL, como get_global_id, get_local_id, get_group_id, etc.
- Empleo de funciones de grupos de trabajo en OpenCL, como barrier, work_group_reduce, work_group_scan, etc.
- Uso de funciones del dispositivo en OpenCL, como get_num_groups, get_global_size, get_local_size, etc.
Depuración
- Comprensión de los errores y bugs comunes en programas de OpenCL
- Uso del depurador de Visual Studio Code para inspeccionar variables, puntos de interrupción, pila de llamadas, etc.
- Utilización de CodeXL para depurar y analizar programas de OpenCL en dispositivos AMD
- Empleo de Intel VTune para depurar y analizar programas de OpenCL en dispositivos Intel
- Uso de NVIDIA Nsight para depurar y analizar programas de OpenCL en dispositivos NVIDIA
Optimización
- Comprensión de los factores que afectan el rendimiento de los programas de OpenCL
- Utilización de tipos de datos vectoriales y técnicas de vectorización en OpenCL para mejorar el rendimiento aritmético
- Empleo de técnicas de desenrollado de bucles y tiling de bucles en OpenCL para reducir la sobrecarga de control y aumentar la localidad
- Uso de memoria local y funciones de memoria local en OpenCL para optimizar los accesos a memoria y el ancho de banda
- Aplicación de perfilado y herramientas de perfilado en OpenCL para medir y mejorar el tiempo de ejecución y la utilización de recursos
Resumen y Próximos Pasos
Requerimientos
- Comprensión del lenguaje C/C++ y de los conceptos de programación paralela
- Conocimientos básicos de arquitectura de computadoras y jerarquía de memoria
- Experiencia con herramientas de línea de comandos y editores de código
Público Objetivo
- Desarrolladores que deseen aprender a utilizar OpenCL para programar dispositivos heterogéneos y aprovechar su paralelismo
- Desarrolladores que busquen escribir código portátil y escalable que pueda ejecutarse en diferentes plataformas y dispositivos
- Programadores interesados en explorar los aspectos de bajo nivel de la programación heterogénea y optimizar el rendimiento de su código
28 Horas