NVIDIA annonce la nouvelle version de CUDA, l'API de calcul sur processeur graphique
S'enrichit d'une bibliothèque de décodage d'images JPEG

Le , par dourouc05, Responsable Qt & Livres
En même temps que la sortie de sa nouvelle génération de cartes graphiques (Turing), NVIDIA annonce la prochaine version de sa suite logicielle pour l’exécution de codes de calcul sur ses processeurs graphiques : CUDA 10. Cette API est loin d’être remplacée par OpenCL et NVIDIA s’efforce de garder une certaine avance par rapport à l’API concurrente (mais librement implémentable). CUDA 10 n’est pas encore disponible au téléchargement, mais sa version finale sortira en 2018.

La version 10, outre la gestion des cartes Turing, apporte des améliorations habituelles de performance dans ses bibliothèques de calcul : la transformée de Fourier rapide (FFT) s’exécute plus vite sur plusieurs GPU (NVIDIA parle même de mise à l’échelle forte sur seize cartes), les routines d’algèbre linéaire dense (factorisation de Cholesky et valeurs propres) sont plus rapides, certains noyaux ont été optimisés pour les spécificités de gestion des précisions multiples de Turing.

Une nouvelle bibliothèque fait son apparition : nvJPEG, pour le décodage d’images au format JPEG (une par une ou bien en lot) et la conversion d’espaces colorimétriques. Le décodeur peut fonctionner tant uniquement sur la carte graphique qu’en mode hybride, en exploitant aussi le CPU. Les avantages sont un meilleur débit et une latence diminuée : nvJPEG peut décoder plus d’images par seconde qu’un CPU, mais prend aussi moins de temps par image. Ses applications prévues sont la vision par ordinateur, notamment par apprentissage profond : la plupart des images utilisées sont au format JPEG, qui prend relativement peu de place sur le disque. En sus, nvJPEG peut effectuer certaines opérations directement au même moment que le chargement, comme des translations, une mise à l’échelle, etc. Une préversion est déjà disponible.


Dans les nouvelles fonctionnalités, on compte aussi un nouveau mécanisme d’interopérabilité avec les API de rendu comme DirectX 12 et Vulkan, à destination principalement des applications en temps réel comme les jeux. La famille d’outils de développement Nsight s’enrichit de Systems (pour l’analyse de performance à l’échelle d’un système complet) et de Compute (plus spécifiquement pour les noyaux de calcul, avec une collection de données rapide et une interface entièrement programmable).


La microarchitecture de Turing promet également des modifications au niveau des capacités de calcul (Compute Capability). Par exemple, les cœurs tensoriels peuvent fonctionner avec d’autres précisions : jusqu’à présent, ils étaient limités à des nombres à virgule flottante sur demi-précision (seize bits) ; avec Turing, ils pourront descendre jusque des entiers sur huit et même quatre bits (avec des calculs respectivement deux et quatre fois plus rapides). Sur certaines applications, ces quelques modifications seront probablement très utiles à NVIDIA pour garantir une performance excellente — mais seulement sur quelques niches : avec quatre bits, on ne peut représenter que seize valeurs différentes…


Les multiprocesseurs de flux (SM) évoluent également, dans les cœurs de calcul (CUDA). Notamment, Volta avait séparé les parties effectuant des calculs sur des entiers, de telle sorte qu’il devient possible de travailler, exactement en même temps, sur des entiers et des nombres à virgule flottante. Ceci permet d’accélérer grandement des opérations de génération d’adresse, notamment.

Les unités arithmétiques et logiques de ces multiprocesseurs voient aussi la gestion des précisions inférieures de manière plus générale : toutes les opérations autrefois exclusivement FP32 peuvent être effectuées avec une précision moindre (FP16), à une vitesse double. Ceci était utile pour les réseaux neuronaux, mais l’est tout autant pour certains jeux.


Sources : Announcing CUDA Toolkit 10, NVIDIA Reveals Next-Gen Turing GPU Architecture: NVIDIA Doubles-Down on Ray Tracing, GDDR6, & More.


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse Signaler un problème

Avatar de dourouc05 dourouc05 - Responsable Qt & Livres https://www.developpez.com
le 01/10/2018 à 5:26
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

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 : Sélectionner tout
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 ?
Avatar de Matthieu76 Matthieu76 - Membre éclairé https://www.developpez.com
le 01/10/2018 à 10:12
Ç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.
Avatar de BPStA BPStA - Futur Membre du Club https://www.developpez.com
le 10/10/2018 à 12:41
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 ?
Avatar de Matthieu76 Matthieu76 - Membre éclairé https://www.developpez.com
le 11/10/2018 à 12:57
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 ?

 
Responsable bénévole de la rubrique HPC : Thibaut Cuvelier -