Prenez contact avec nous

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.
 8 Heures

Nombre de participants


Prix par participant

Nos clients témoignent (3)

Cours à venir

Catégories Similaires