Programmation GPU

Un programme qui lance des milliers de fois de suite des noyaux très petits est lent. Quelle amélioration est la plus appropriée ?

  1. ARéduire le nombre de lancements, par exemple en regroupant (fusionnant) plusieurs petits noyaux en un seul
  2. BInsérer des temps d'attente entre les lancements de noyaux
  3. CFixer à 1 le nombre de threads par bloc
Afficher la réponse et l'explication

Réponse : A. Réduire le nombre de lancements, par exemple en regroupant (fusionnant) plusieurs petits noyaux en un seul

Un lancement de noyau entraîne un coût fixe de quelques microsecondes pour le traitement côté CPU et la préparation du GPU. Si le contenu du noyau est plus court, le coût de lancement prédomine. Regrouper plusieurs traitements dans un noyau réduit le nombre de lancements et évite en outre d'écrire puis relire les résultats intermédiaires en mémoire. Des mécanismes enregistrant une séquence de lancements pour l'envoyer en une fois (CUDA Graphs, etc.) sont aussi utilisés.

S'entraîner sur ce thème Retour au thème

Autres questions sur Programmation GPU

  1. Quelle est la définition de la mémoire unifiée (unified memory) de CUDA ?
  2. Lors de l'addition élément par élément de deux grands tableaux sur GPU (c[i] = a[i] + b[i]), qu'est-ce qui détermine principalement les performances ?
  3. Pourquoi, sur de nombreux GPU grand public pour le jeu, les performances en double précision (FP64) sont-elles bien inférieures (par exemple quelques dizaines de fois) à celles en simple précision (FP32) ?
  4. Quelle est la caractéristique des Tensor Cores (unités de calcul matriciel) des GPU récents ?
  5. En calcul en précision mixte sur GPU, pourquoi effectue-t-on souvent les multiplications en faible précision (FP16, etc.) et l'accumulation en FP32 ?

Comparatifs sur ce thème