Merci d'avoir envoyé votre demande ! Un membre de notre équipe vous contactera sous peu.
Merci d'avoir envoyé votre réservation ! Un membre de notre équipe vous contactera sous peu.
Durée 28 heures
Plan du cours
Introduction
- Qu'est-ce qu'OpenCL ?
- OpenCL vs CUDA vs SYCL
- Aperçu des fonctionnalités et de l'architecture d'OpenCL
- Configuration de l'environnement de développement
Premiers pas
- Création d'un nouveau projet OpenCL avec Visual Studio Code
- Exploration de la structure du projet et des fichiers
- Compilation et exécution du programme
- Affichage de la sortie en utilisant printf et fprintf
API OpenCL
- Comprendre le rôle de l'API OpenCL dans le programme hôte
- Utiliser l'API OpenCL pour interroger les informations et les capacités de l'appareil
- Utiliser l'API OpenCL pour créer des contextes, des files de commandes, des tampons, des noyaux et des événements
- Utiliser l'API OpenCL pour empiler des commandes, telles que lecture, écriture, copie, mappage, démaillage, exécution et attente
- Utiliser l'API OpenCL pour gérer les erreurs et les exceptions
OpenCL C
- Comprendre le rôle d'OpenCL C dans le programme de l'appareil
- Utiliser OpenCL C pour écrire des noyaux qui s'exécutent sur l'appareil et manipulent les données
- Utiliser les types de données, les qualificatifs, les opérateurs et les expressions d'OpenCL C
- Utiliser les fonctions intégrées d'OpenCL C, telles que les fonctions mathématiques, géométriques, relationnelles, etc.
- Utiliser les extensions et les bibliothèques OpenCL C, telles que atomique, image, cl_khr_fp16, etc.
Modèle de mémoire OpenCL
- Comprendre la différence entre les modèles de mémoire hôte et appareil
- Utiliser les espaces mémoire OpenCL, tels que global, local, constant et privé
- Utiliser les objets mémoire OpenCL, tels que tampons, images et tuyaux (pipes)
- Utiliser les modes d'accès mémoire OpenCL, tels que lecture seule, écriture seule, lecture-écriture, etc.
- Utiliser le modèle de cohérence mémoire OpenCL et les mécanismes de synchronisation
Modèle d'exécution OpenCL
- Comprendre la différence entre les modèles d'exécution hôte et appareil
- Utiliser les éléments de travail, les groupes de travail et les plages ND d'OpenCL pour définir le parallélisme
- Utiliser les fonctions d'éléments de travail d'OpenCL, telles que get_global_id, get_local_id, get_group_id, etc.
- Utiliser les fonctions de groupes de travail d'OpenCL, telles que barrier, work_group_reduce, work_group_scan, etc.
- Utiliser les fonctions d'appareil d'OpenCL, telles que get_num_groups, get_global_size, get_local_size, etc.
Débogage
- Comprendre les erreurs et les bogues courants dans les programmes OpenCL
- Utiliser le débogueur Visual Studio Code pour inspecter les variables, les points d'arrêt, la pile d'appels, etc.
- Utiliser CodeXL pour déboguer et analyser les programmes OpenCL sur des appareils AMD
- Utiliser Intel VTune pour déboguer et analyser les programmes OpenCL sur des appareils Intel
- Utiliser NVIDIA Nsight pour déboguer et analyser les programmes OpenCL sur des appareils NVIDIA
Optimisation
- Comprendre les facteurs qui affectent les performances des programmes OpenCL
- Utiliser les types de données vectoriels OpenCL et les techniques de vectorisation pour améliorer le débit arithmétique
- Utiliser les techniques de développement des boucles (loop unrolling) et de tuilage des boucles (loop tiling) OpenCL pour réduire les surcoûts de contrôle et augmenter la localité
- Utiliser la mémoire locale OpenCL et les fonctions de mémoire locale pour optimiser les accès à la mémoire et la bande passante
- Utiliser l'analyse de performances (profiling) et les outils d'analyse OpenCL pour mesurer et améliorer le temps d'exécution et l'utilisation des ressources
Pré requis
- Une compréhension du langage C/C++ et des concepts de programmation parallèle
- Des connaissances de base en architecture informatique et hiérarchie de la mémoire
- Une expérience avec les outils en ligne de commande et les éditeurs de code
Audience cible
- Développeurs souhaitant apprendre à utiliser OpenCL pour programmer des appareils hétérogènes et exploiter leur parallélisme
- Développeurs souhaitant écrire du code portable et évolutif pouvant s'exécuter sur différentes plateformes et appareils
- Programmeurs souhaitant explorer les aspects bas niveau de la programmation hétérogène et optimiser les performances de leur code