Plan du cours
Introduction au calcul accéléré par GPU
- Informatique hétérogène et architecture CPU-GPU.
- Espaces d'exécution et de mémoire CUDA.
- Compilation du code CUDA C++ avec nvcc et CMake.
- Vérification de l'environnement de développement GPU.
Algorithmes parallèles avec Thrust et CUB
- Trie, réduction et transformation accélérés par GPU.
- Refonte des algorithmes STL pour une exécution sur GPU.
- Vecteurs périphériques (device vectors) Thrust et politiques d'exécution.
- Primitives CUB à l'échelle du dispositif pour pipelines personnalisés.
Architecture et gestion de la mémoire GPU
- Types de mémoire globale, constante et texture.
- Allocation explicite de mémoire périphérique et transferts.
- Mémoire unifiée pour simplifier l'accès aux données.
- Regroupement de la mémoire (memory coalescing) et optimisation des motifs d'accès.
Exécution asynchrone avec les flux CUDA
- Création et gestion des flux CUDA.
- Superposition de l'exécution des kernels avec les transferts de données.
- Événements CUDA pour la gestion des dépendances.
- Priorités des flux et réglage de la concurrence.
Rédaction de kernels CUDA personnalisés
- Le modèle de programmation SIMT et l'exécution par warp.
- Configuration du lancement des kernels et boucles d'adresse grille (grid-stride loops).
- Indexation des threads et grilles multidimensionnelles.
- Gestion des erreurs et vérifications de l'API runtime CUDA.
Hiérarchie des threads et modèle d'exécution
- Grilles, blocs et threads dans le code périphérique.
- Primitives au niveau du warp et opérations de scrutin (ballot).
- Synchronisation au niveau du bloc et barrières.
- Analyse de l'occupation et de l'utilisation des ressources.
Groupe coopératif pour une parallélisation flexible
- L'API cooperative_groups et les types de groupes.
- Carreaux de blocs de threads et tiled_partition.
- Lancements coopératifs à l'échelle de la grille.
- Schémas de synchronisation multi-grille.
Techniques d'optimisation de la mémoire partagée
- Banques de mémoire partagée et évitement des conflits de banque.
- Stratégies de carrelage (tiling) pour les opérations matricielles.
- Mémoire partagée comme cache géré par l'utilisateur.
- cuda::shared_memory_mdspan pour les vues multidimensionnelles.
Fusion de kernels et modèles de parallélisme avancés
- Fusion de plusieurs kernels pour réduire la surcharge de lancement.
- Algorithmes par scan, réduction par clé et segmentés.
- Opérations atomiques et structures de données sans verrouillage.
- Atomics agrégés au niveau du warp pour améliorer le débit.
Profilage et optimisation avec Nsight Systems
- Analyse chronologique de l'activité CPU et GPU.
- Identification des goulots d'étranglement liés aux transferts mémoire.
- Profilage de la performance et de l'occupation des kernels.
- Optimisation itérative avec Nsight Compute.
Fonctionnalités C++ modernes dans le code périphérique CUDA
- Lambdas, constexpr et auto dans les kernels.
- Algorithmes parallèles C++17 et politiques d'exécution.
- Concepts et étendues (ranges) C++20 sur le dispositif.
- Support C++23 dans nvcc et CCCL 3.x.
Graphes CUDA et asynchronisme avancé
- Définition et lancement de graphes CUDA.
- Capture de graphe à partir de l'exécution des flux.
- Mise à jour du graphe et nœuds d'exécution conditionnelle.
- Réduction de la latence de lancement pour les charges de travail itératives.
Modèles d'intégration pour applications existantes
- Mise en enveloppe du code GPU derrière des interfaces C++.
- Gestion des systèmes multi-GPU et NUMA.
- Intégration aux systèmes de build avec CMake et CUDA.
- Débogage du code périphérique avec cuda-gdb.
Résumé et bonnes pratiques
- Choix entre Thrust, CUB et kernels personnalisés.
- Portabilité des performances sur différentes architectures GPU.
- Organisation du code et RAII pour les ressources CUDA.
- Prochaines étapes et parcours d'apprentissage avancé en CUDA.
Pré requis
- Compétences de base en C++, incluant les expressions lambda, les templates et la STL.
- Connaissance des algorithmes standards, des conteneurs et des itérateurs.
- Aisance avec les boucles, les conditions et les fonctions.
- Pas de connaissances préalables en CUDA ou en programmation GPU requises.
Public cible
- Développeurs C++ cherchant à accélérer des applications intensives en calcul avec des GPU.
- Ingénieurs logiciel passant d'une programmation exclusivement sur CPU à une programmation parallèle hétérogène.
- Ingénieurs performance et développeurs quantitatifs travaillant avec de grands volumes de données.
Nos clients témoignent (3)
Explication détaillée, répétition des points de manière subtile qui a vraiment bien ancré les connaissances. La volonté de Rod de vérifier à double tour les questions obscures que nous avons posées pour s'assurer que ses réponses étaient 100% correctes. De plus, son intérêt pour la discussion sur les avantages et les inconvénients des styles de codage alternatifs, afin que nous apprenions non seulement comment utiliser C++ selon nos intentions, mais aussi pourquoi il convient de le faire ainsi.
Nick Dillon - cellxica Ltd
Formation - Using C++ in Embedded Systems - Applying C++11/C++14
Traduction automatique
Le partage d'expérience, c'est le savoir-faire et la valeur de l'enseignant.
Carey Fan - Logitech
Formation - C/C++ Secure Coding
Traduction automatique
Le fait que cela se déroule en ligne nous a permis de gagner beaucoup de temps, ce qui était très apprécié. De plus, le formateur connaissait à la fois C# et C++, ce qui a été un grand avantage car il pouvait expliquer tout par rapport aux connaissances que nous avions déjà.
Gabor - Rheinmetall Electronics Hungary Kft
Formation - Advanced C++
Traduction automatique