Chapter 10.4 : Dans un GPU (WIP)

L'unité de calcul graphique GPU (Graphical Processing Unit) était à l'origine un composant dédier à l'affichage mais qui peut-être particulièrement efficace pour effectuer certains calculs...

Dans ce chapitre, nous ne nous intéresserons qu'au composants liés au calcul et à la mémoire d'un GPU. Le chapitre 11.7 traite plus en détail d'autres aspects pratique de l'utilisation de GPU pour le calcul scientifique.

La vidéo suivante montre les différents niveaux de calcul et de mémoire d'un GPU :



wip
  • SM c'est de la terminologie NVidia, chaque fabricant de GPU a la sienne. Peut-être utiliser la terminologie OpenCL (Compute Unit) qui est ce qui se rapproche le plus d'un standard?
  • Cette Compute Unit si on l'appelle ainsi n'est pas une entité élémentaire, il y a plusieurs granularités à l'intérieur :
    • La granularité scalaire (thread en CUDA, work-item en OpenCL) -> registres (private memory).
    • La granularité SIMD (non exposé dans les APIs, et généralement on n'a pas besoin de s'en soucier en tant que programmeur)
    • La granularité d'exécution (warp, wavefront, sub-group en OpenCL...) => Potentiellement différente de la granularité SIMD, cf GPUs AMD actuels.
    • Entre ces différents grains d'exécution, on a du parallélisme d'instruction et du multi-threading matériel (très indirectement exposé dans les APIs via la notion de block CUDA / work-group OpenCL).
    • Peut-être mentionner à un moment que la synchronisation interne au GPU ne peut se faire qu'à la granularité des CUs, pour synchroniser entre CUs il faut passer par le CPU (synchronisation kernels / queue).


Dans les granularités mémoire, outre la shared memory (local memory en OpenCL) et la mémoire globale (idem en OpenCL), tu peux aussi mentionner la mémoire constante (quelques Ko globalement accessibles, plus rapides que la mémoire globale).

  • Si tu voulais raffiner, tu pourrais même mentionner la mémoire des textures (en général distincte du circuit mémoire ordinaire parce que l'archi matérielle des GPUs c'est le royaume du WTF) et la mémoire virtuelle (qui permet de faire fonctionner des choses comme CUDA UVM / OpenCL SVM, ou le GPU AMD Radeon SSG avec son cache SSD).
  • Si tu voulais raffiner encore plus, tu pourrais sortir du cadre OpenCL et aller dans le cadre Vulkan, où entre choses l'on distingue la portion de la mémoire GPU qui est visible par l'hôte (via le "trou PCI" de 256 Mo max) de la portion du GPU qui n'est pas visible par l'hôte (mais qui du coup est potentiellement plus rapide).


Peut-être parler de la notion de command queue de Vulkan (plus ou moins équivalent aux streams en CUDA), qui représente la capacité d'un GPU d'effectuer certaines opérations en parallèle. Typiquement, tous les GPUs sérieux permettent d'exécuter du calcul et des transferts de données en même temps, et certains (plutôt du côté AMD historiquement, mais NVidia s'y sont mis plus récemment) permettent d'exécuter de la rasterization et des compute shaders (= l'implème typique de CUDA/OpenCL) en même temps.