5 points par GN⁺ 2023-10-22 | 1 commentaires | Partager sur WhatsApp
  • Une compréhension de base du GPU computing est essentielle pour tout ingénieur logiciel
  • Cet article se concentre principalement sur les GPU Nvidia et utilise la terminologie de Nvidia
  • Les GPU sont conçus pour le traitement massivement parallèle et un haut débit dans les domaines du graphisme, du calcul numérique, du deep learning, etc.

Comparaison entre CPU et GPU

  • Les CPU sont conçus pour l’exécution séquentielle d’instructions et intègrent diverses fonctionnalités visant à réduire la latence d’exécution des instructions.
  • Les GPU sont conçus pour le traitement massivement parallèle et un haut débit, avec une latence d’exécution des instructions moyenne à élevée.
  • Les GPU peuvent traiter un bien plus grand nombre d’opérations bien plus rapidement que les CPU.

# Architecture GPU

Architecture de calcul des GPU

  • Un GPU est composé d’un ensemble de streaming multiprocessors (SM).
  • Chaque SM contient plusieurs streaming processors (cœurs ou threads).
  • Un SM dispose d’une quantité limitée de mémoire on-chip (mémoire partagée ou scratchpad), partagée par tous les cœurs.

Architecture mémoire des GPU

  • Un GPU possède plusieurs types de mémoire organisés en différentes couches.
  • Chaque SM dispose d’un grand nombre de registres, partagés entre les cœurs.
  • Le cache de constantes est utilisé pour mettre en cache les données constantes utilisées lors de l’exécution du code.
  • La mémoire partagée est une mémoire SRAM on-chip rapide, à faible latence et programmable.
  • Le cache L1 met en cache les données fréquemment accédées depuis le cache L2.
  • Le cache L2 est partagé par tous les SM et met en cache les données fréquemment accédées depuis la mémoire globale.
  • La mémoire globale est une DRAM de grande capacité et à large bande passante, éloignée des SM, avec une latence élevée.

# Comprendre le modèle d’exécution des GPU

Brève introduction aux kernels CUDA et aux blocs de threads

  • CUDA est une interface de programmation pour écrire des programmes destinés aux GPU Nvidia.
  • Un kernel est un calcul exprimé sous une forme similaire à une fonction C/C++ exécutée en parallèle sur le GPU.
  • Pour exécuter un kernel, on lance un ensemble de threads appelé grille.

Étapes d’exécution d’un kernel sur un GPU

  1. Copier les données de l’hôte vers le device
  2. Planifier les blocs de threads sur les SM
  3. Single Instruction Multiple Threads (SIMT) et warps
  4. Ordonnancement des warps et masquage de la latence
  5. Copier les données de résultat du device vers la mémoire de l’hôte

# Partitionnement des ressources et notion d’occupation

  • L’utilisation des ressources GPU se mesure à l’aide d’un indicateur appelé « occupation », qui représente le ratio entre le nombre de warps alloués et le nombre maximal de warps qu’un SM peut prendre en charge.
  • L’occupation est limitée par les ressources d’exécution du SM, les registres, la mémoire partagée, les slots de blocs de threads et les slots de threads.
  • Il est important de minimiser la latence tout en maintenant une occupation élevée grâce à l’optimisation du code.

# Résumé

  • Un GPU est composé de plusieurs SM, chacun contenant plusieurs cœurs de traitement.
  • La mémoire globale est éloignée de la puce et présente une latence élevée.
  • Les caches L1 et L2 fonctionnent de manière similaire aux caches L1/L2 des CPU.
  • Chaque SM possède une mémoire partagée, commune aux cœurs.
  • Pour exécuter un kernel sur un GPU, on lance une grille de threads.
  • Le GPU alloue les blocs à exécuter sur les SM, et tous les threads d’un bloc s’exécutent sur le même SM.
  • Les threads alloués à un SM sont ensuite regroupés en unités de 32 appelées warps.
  • Le GPU effectue un partitionnement dynamique des ressources entre les threads selon leurs besoins et les limites du SM.

# Conclusion

  • Les GPU sont aujourd’hui largement utilisés, et leur architecture ainsi que leur modèle d’exécution diffèrent fondamentalement de ceux des CPU.
  • Cet article aborde différents aspects des GPU et donne des clés pour comprendre pourquoi ils sont si largement utilisés et comment ils fonctionnent.

L’avis de GN⁺

  • Les GPU sont une technologie essentielle pour le deep learning et les calculs numériques complexes, et cet article aide à comprendre leur architecture de base et leur modèle d’exécution.
  • Le contenu est particulièrement important pour les ingénieurs logiciel débutants intéressés par le traitement parallèle et le calcul haute performance.
  • Cet article fournit des bases en programmation GPU et constitue une ressource intéressante pour éveiller la curiosité sur ce domaine.

1 commentaires

 
GN⁺ 2023-10-22
Avis Hacker News
  • Cet article est critiqué pour être centré sur Nvidia et ignorer d'autres alternatives valables comme Sycl, Sapphire Rapids et le MI300 d'AMD.
  • Certains reprochent l'absence de mention des copies asynchrones, qui évitent que le GPU reste inactif pendant les transferts de données.
  • L'article est salué comme une bonne introduction à la programmation GPU, tout en suggérant d'explorer des techniques plus avancées.
  • Certains lecteurs mettent en doute l'exactitude de l'affirmation selon laquelle la loi de Little, issue de la théorie des files d'attente, s'applique aux GPU.
  • L'explication de l'architecture mémoire est critiquée pour ne pas préciser que les caches ne garantissent pas la cohérence entre les threads.
  • Il est proposé de renommer les GPU en PPU (Parallel Processing Units) afin de mieux refléter leurs capacités.
  • L'article est salué comme l'une des meilleures explications de la programmation GPU et recommandé pour le mentorat.
  • La programmation SIMD est décrite comme « sauvage », avec des calculs simples sur tous les pixels mais des difficultés dès qu'il y a des branchements conditionnels.
  • Des questions sont soulevées sur l'efficacité de l'utilisation du GPU pour certains calculs sur des tableaux, en tenant compte de la nécessité d'y transférer les données puis de les en récupérer.