Developpez.com - Rubrique HPC

Le Club des Développeurs et IT Pro

Sortie de CUDA 10

L'API de calcul sur processeur graphique de NVIDIA, avec la possibilité de définir ses calculs comme un graphe de dépendances

Le 2018-10-01 05:26:26, par dourouc05, Responsable Qt & Livres
]Dans le mois de l’annonce de CUDA 10, NVIDIA lance effectivement la nouvelle version de son API de calcul sur processeur graphique. Outre la gestion de la nouvelle architecture Turing, cette version 10 apporte bon nombre de nouveautés, partiellement déjà annoncées.

Une grande nouveauté de CUDA 10 facilitera l’expression de programmes de calcul compliqués, où certaines opérations ne peuvent être lancées que quand d’autres sont terminées : par exemple, on ne peut copier les résultats d’un calcul sur le processeur central que quand il a fini de s’exécuter sur la carte graphique. CUDA disposait déjà de la notion de flux, mais elle n’autorisait pas une grande flexibilité : le processeur central doit toujours gérer l’ordonnancement des tâches, par exemple. Lancer un noyau de calcul prend toujours un certain temps, non négligeable quand le noyau est assez petit.

L’idée des graphes de calcul est donc d’indiquer à CUDA les tâches à exécuter et leurs dépendances, de telle sorte que la carte graphique ou le pilote puisse décider, sans attendre l’application, des tâches à exécuter par la suite. Dans le cas de noyaux très rapides à l’exécution dans un processus plus long, les coûts de lancement sont en grande partie éliminés. Également, CUDA peut réordonner les tâches afin d’améliorer les temps d’exécution, notamment en réduisant les mouvements de données : la carte graphique sait quand des données seront réutilisées, par exemple.
Code :
1
2
3
4
5
6
7
8
9
10
cudaGraphCreate(&graph);
cudaGraphAddNode(graph, kernel_a, {}, ...);
cudaGraphAddNode(graph, kernel_b, { kernel_a }, ...);
cudaGraphAddNode(graph, kernel_c, { kernel_a }, ...);
cudaGraphAddNode(graph, kernel_d, { kernel_b, kernel_c }, ...);

cudaGraphInstantiate(&instance, graph);

for(int i = 0; i < 100; i++)
      cudaGraphLaunch(instance, stream);

Une API spécifique permet de mélanger un code à base de flux et de graphe, en enregistrant les flux et en indiquant les moments où les flux doivent s’attendre.

Source : CUDA 10 Features Revealed: Turing, CUDA Graphs and More.

Et vous ?

Qu'en pensez-vous ?
  Discussion forum
6 commentaires
  • Matthieu76
    Membre éclairé
    Ça a l'air vraiment cool ce système de graph, ça me donne presque envie de me remettre au CUDA, malheureusement je n'ai pas le temps ...
    En tout cas cela semble beaucoup plus simple pour tout ce qui est calculs de graph, réseaux de neurones, et autres algorithmes. D'autant plus que la plupart des algos peuvent être représenter sous forme de graph.
  • BPStA
    Futur Membre du Club
    Bonjour,

    J'utilise Visual studio 2015 et CUDA. Passer à Visual Studio 2017 community et CUDA, annoncé récemment comme enfin possible, est tout sauf simple. Je n'ai pas encore réussi à les faire fonctionner ensemble. Existe-t-il une note détaillée d'installation ?
  • Matthieu76
    Membre éclairé
    Je ne sais pas trop mais au début j'avais eu des problème d’installation, j'avais du repasser à MSVC2015. C'était il y a un peu plus d'un an et à l'époque j'utilisait QtCreator comme IDE. Je suis dispo pour d'aider si tu veux. C'est quoi ton problème exactement ?