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 frente a CUDA frente a SYCL
- Visió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 del proyecto y los archivos
- Compilación y ejecución del programa
- Visualización de la salida mediante printf y fprintf
API de OpenCL
- Comprensión del papel de la API de OpenCL en el programa host
- Uso de la API de OpenCL para consultar información y capacidades del dispositivo
- Uso de la API de OpenCL para crear contextos, colas de comandos, búferes, núcleos (kernels) y eventos
- Uso de la API de OpenCL para encolar comandos, como leer, escribir, copiar, mapear, desmapear, ejecutar y esperar
- Uso de la API de OpenCL para gestionar errores y excepciones
OpenCL C
- Comprensión del papel de OpenCL C en el programa del dispositivo
- Uso de OpenCL C para escribir núcleos (kernels) que se ejecuten en el dispositivo y manipulen datos
- Uso de tipos de datos, calificadores, operadores y expresiones de OpenCL C
- Empleo de funciones integradas de OpenCL C, como las 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 privado
- Empleo de objetos de memoria de OpenCL, como búferes, imágenes y tuberías (pipes)
- Uso de los modos de acceso a la memoria de OpenCL, como solo lectura, solo escritura, lectura-escritura, etc.
- Aplicación del modelo de consistencia de memoria y 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 work-items, work-groups y rangos ND de OpenCL para definir el paralelismo
- Empleo de funciones de work-item de OpenCL, como get_global_id, get_local_id, get_group_id, etc.
- Uso de funciones de work-group de OpenCL, como barrier, work_group_reduce, work_group_scan, etc.
- Empleo 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 fallos comunes en programas de OpenCL
- Uso del depurador de Visual Studio Code para inspeccionar variables, puntos de interrupción, pila de llamadas, etc.
- Empleo de CodeXL para depurar y analizar programas de OpenCL en dispositivos AMD
- Uso de Intel VTune para depurar y analizar programas de OpenCL en dispositivos Intel
- Empleo 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
- Uso de tipos de datos vectoriales y técnicas de vectorización de OpenCL para mejorar la capacidad de procesamiento aritmético
- Empleo de técnicas de desenrollado de bucles (loop unrolling) y segmentación de bucles (loop tiling) en OpenCL para reducir la sobrecarga del control y aumentar la localidad
- Uso de memoria local y funciones de memoria local en OpenCL para optimizar los accesos a la memoria y el ancho de banda
- Empleo de la profilación de OpenCL y herramientas de perfilado 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 informática 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 usar OpenCL para programar dispositivos heterogéneos y explotar su paralelismo.
- Desarrolladores que quieran escribir código portátil y escalable, capaz de ejecutarse en distintas 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