Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Sortie de CUDA 7.5 RC
Découvrez les nouveautés.

Le , par dourouc05

20PARTAGES

2  0 
La première préversion publique de CUDA 7.5 est disponible pour tous les développeurs CUDA enregistrés auprès de NVIDIA. La principale nouveauté est la gestion des nombres à virgule flottante codés sur seize bits, c’est-à-dire la moitié de l’encodage traditionnel (float sur trente-deux bits). Cette format est principalement utilisée pour du stockage de données quand la précision requise n’est pas très importante, mais aussi pour des calculs sous la même hypothèse.

Calculs sur seize bits

L’effet sur la performance du code peut être énorme : la bande passante requise est divisée par deux, ce qui permet de transmettre deux fois plus de nombres par unité de temps sur les bus existants, d’en stocker deux fois plus sur la même quantité de mémoire. Ils pourront donc se révéler très utiles pour les applications où ces éléments sont limitatifs, comme l’apprentissage de réseaux neuronaux de grande taille ou le filtrage de signaux en temps réel.

L’avantage en temps de calcul n’est disponible que sur les GPU ayant une partie prévue pour l’arithmétique sur seize bits, ce qui n’est pas le cas pour la majorité des processeurs disponibles, sauf sur Tegra. La prochaine architecture de GPU de NVIDIA, connue sous le nom de Pascal, aura des transistors alloués pour les calculs sur seize bits : le nombre de calculs effectués par seconde doublera entre les précisions FP16 et FP32 (le même rapport qu’entre FP32 et FP64). Entre temps, les calculs seront effectués en interne sur les mêmes circuits que précédemment, avec une précision bien plus élevée que des circuits dédiés (bien qu’elle soit en grande partie perdue lors de l’arrondi vers les seize bits).

Réseaux neuronaux

L’un des chevaux de bataille actuels de NVIDIA est l’apprentissage automatique, en particulier par réseaux neuronaux, plus spécifiquement profonds, par exemple pour une utilisation dans les voitures intelligentes. Ils ont par exemple développé la bibliothèque cuDNN (CUDA deep neural network), qui accélère les calculs par un GPU. La troisième version de cette bibliothèque a été optimisée, particulièrement au niveau des convolutions (FFT et 2D), ce qui améliore la performance lors de l’entraînement de réseaux neuronaux (gain d’un facteur deux pour l’apprentissage sur des GPU Maxwell). Elle gère également les nombres en virgule flottante sur seize bits, ce qui est utile pour des réseaux très grands, mais n’améliore pas (encore) les temps de calcul.



NVIDIA a aussi développé l’outil DIGITS, un logiciel de bien plus haut niveau que cuDNN pour les mêmes réseaux neuronaux, prévu pour des profils plus scientifiques que pour des programmeurs. L’une des nouveautés est l’apprentissage distribué sur plusieurs GPU : ajouter un deuxième GPU aide à réduire fortement les temps de calcul (d’un facteur légèrement inférieur à deux), nettement moins impressionnant en ajoutant deux autres (facteur de deux et demi). Le gain sera probablement plus important avec les prochaines architectures de GPU, Pascal devant utiliser la technologie NVLink au lieu du bus PCI Express (partagé) pour la communication entre cartes.



Algèbre linéaire creuse

CUDA vient également avec la bibliothèque cuSPARSE pour l’algèbre linéaire sur des matrices creuses accélérée sur GPU. Une nouvelle opération vient d’y être ajoutée, nommée GEMVI, utilisée pour la multiplication entre une matrice pleine et un vecteur creux — la sortie étant évidemment un vecteur plein. Ce genre d’opérations est très utile pour l’apprentissage automatique, plus particulièrement dans le cas du traitement des langues. En effet, dans ce cas, un document rédigé dans une langue quelconque (français, anglais, allemand…) peut être représenté comme un comptage des occurrences de mots d’un dictionnaire ; bien évidemment, tous les mots du dictionnaire (même partiel) ne sont pas présents dans le texte, sa représentation vectorielle contient donc un grand nombre de zéros, il est donc creux. Une fois le dictionnaire défini, pour améliorer l’efficacité des traitements, le dictionnaire peut être réduit en taille pour n’en garder qu’un sous-espace vectoriel qui préserve la sémantique des textes : la transformation de la représentation du texte demande justement un produit entre le vecteur creux initial et une matrice de transformation.

C++11 et fonctions anonymes

La version précédente de CUDA a commencé à comprendre C++11, la dernière itération du langage de programmation. Les fonctions anonymes (lambdas) en font partie et servent notamment à écrire du code plus concis. CUDA 7.0 ne les tolérait que dans le code exécuté côté client, pas encore sur le GPU : ce point est corrigé, mais seulement comme fonctionnalité expérimentale. Par exemple, un code comptant les fréquences de quatre lettres dans une chaîne de caractères pourra s’écrire comme ceci :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
void xyzw_frequency_thrust_device(int *count, char *text, int n) { 
  using namespace thrust; 
  
  *count = count_if(device, text, text+n, [] __device__ (char c) { 
    for (const auto x : { 'x','y','z','w' }) 
      if (c == x) return true; 
    return false; 
  }); 
}

La même fonctionnalité permet d’écrire des boucles for pour une exécution en parallèle, avec une syntaxe similaire à OpenMP, par exemple une somme de deux vecteurs (SAXPY pour BLAS) :
Code c++ : Sélectionner tout
1
2
3
4
5
6
7
void saxpy(float *x, float *y, float a, int N) { 
    using namespace thrust; 
    auto r = counting_iterator(0); 
    for_each(device, r, r+N, [=] __device__ (int i) { 
        y[i] = a * x[i] + y[i]; 
    }); 
}

Profilage

La dernière nouveauté annoncée concerne le profilage de code, nécessaire pour déterminer les endroits où les efforts d’amélioration de la performance doivent être investis en priorité. CUDA 7.5 améliore les outils NVIDIA Visual Profiler et NSight Eclipse Edition en proposant un profilage au niveau de l’instruction PTX (uniquement sur les GPU Maxwell GM200 et plus récents), pour détermines les lignes précises dans le code qui causent un ralentissement. Précédemment, le profilage ne pouvait se faire qu’au niveau d’un noyau, équivalent d’une fonction pour la programmation sur GPU (temps pris par le noyau à l’exécution, importance relative par rapport à l’exécution complète).

CUDA 6 avait déjà amélioré la situation en affichant une corrélation entre les lignes de code et le nombre d’instructions correspondantes. Cependant, un grand nombre d’instructions n’indique pas forcément que le noyau correspondant prendra beaucoup de temps à l’exécution. Pour remonter jusqu’à la source du problème, ces informations sont certes utiles, mais pas suffisantes, à moins d’avoir une grande expérience. Grâce à CUDA 7.5, le profilage se fait de manière beaucoup plus traditionnelle, avec un échantillonnage de l’exécution du programme, pour trouver les lignes qui prennent le plus de temps.



Sources et crédit des images et du code source : New Features in CUDA 7.5, NVIDIA @ ICML 2015: CUDA 7.5, cuDNN 3, & DIGITS 2 Announced.

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de spyserver
Membre averti https://www.developpez.com
Le 16/07/2015 à 16:44
Le problème des virgules flottantes et de leur précision est un problème tellement bas niveau pour un développeur qu'ils ont tout simplement sous-estimé l'impact d'une utilisation sur 16 bits, sachant qu'effectivement cela reduit mécaniquement la taille mémoire par 2 et donc pour des traitements de gros volumes à précision moindre, ça se ressent, c'est un peu un cas d'école en fait ...
1  0 
Avatar de ToTo13
Modérateur https://www.developpez.com
Le 09/07/2015 à 1:28
Cuda a vraiment l'air merveilleux, mais il ne fonctionne que sur des GPUs NVIDIA, ce qui limite trop son utilisation. Je suis donc forcé de me tourner vers OpenCL qui est beaucoup plus limité :-(
0  0 
Avatar de steel-finger
Membre actif https://www.developpez.com
Le 15/07/2015 à 21:49
Citation Envoyé par ToTo13 Voir le message
Cuda a vraiment l'air merveilleux, mais il ne fonctionne que sur des GPUs NVIDIA, ce qui limite trop son utilisation. Je suis donc forcé de me tourner vers OpenCL qui est beaucoup plus limité :-(
Exactement, je trouve ça dommage qu'il ne tourne que sur des gpu Nvidia, car Cuda est vraiment merveilleux comme tu dis
0  0 
Avatar de dourouc05
Responsable Qt & Livres https://www.developpez.com
Le 15/07/2015 à 23:29
Il faut quand même noter un début d'ouverture pour l'exécution par les pilotes libres, bien que toujours sur GPU NVIDIA : http://www.developpez.net/forums/d15...-s-ouvre-cuda/. Après cette étape, le portage de CUDA sur d'autres architectures devrait être simplifié.

J'avais certes entendu parler de http://gpuocelot.gatech.edu/, à voir ce qu'il vaut en pratique. Ça m'étonnerait néanmoins que les outils de développement puissent être aussi poussés que ceux que propose NVIDIA (probablement en utilisant les spécificités de son matériel, vu les fonctionnalités limitées aux GM200 par exemple).
0  0 
Avatar de DonQuiche
Expert confirmé https://www.developpez.com
Le 16/07/2015 à 8:39
Citation Envoyé par ToTo13 Voir le message
Cuda a vraiment l'air merveilleux, mais il ne fonctionne que sur des GPUs NVIDIA, ce qui limite trop son utilisation. Je suis donc forcé de me tourner vers OpenCL qui est beaucoup plus limité :-(
C'est surtout sur l'outillage qu'il fait la différence, non ? Je n'ai pas d'expérience avec CUDA mais en termes de fonctionnalités proprement dîtes il ne m'avait pas semblé supérieur à OpenCL, au contraire.
0  0 
Avatar de
https://www.developpez.com
Le 16/07/2015 à 9:50
L'avantage c'est interopérable avec de multiple systèmes d’exploitations pour ne pas dire seulement deux noyaux (sans compter UNIX), Microsoft Windows et Linux.
L'usage imposé de carte avec architecture de Processors Units NVIDIA ou plutôt technologies breveté NVIDIA est l'équilibre entre le gratuit et le payant je suppose.
L'appréciable serait de savoir la différence de performance entre les noyaux.
Sacré OpenGL vs DirectX.

Je me demande bien pourquoi certaines personnes pensent que OpenAL et les DSP vont trouver preneur avec PhysX et OpenCL?
0  0 
Avatar de MichaelREMY
Membre confirmé https://www.developpez.com
Le 16/07/2015 à 16:26
ce qui me fascine est à quel point on arrive encore en 2015 à avoir des performances accrues de manières flagrantes juste en changeant de version de librairie ou de drivers.
Si au moins c'était un firmware dans le GPU (voire le CPU) qu'on mettait à jour, je comprendrais; mais là non, c'est de la programmation pure, du logiciel, qui apporte un gains incroyable.

je reste à me demander si je dois me contenter d'être content d'avoir ce gain de perf gratuitement ou de ne pas être content pour ne pas l'avoir eu avec les premiers drivers (forcément inachevés) de la carte 3D achetée...
Si Audi venait vous voir 10ans après votre achat en vous disant "on a trouvé pour 0€ le moyen de réduire de 50% la consommation d'essence de votre voiture en changeant une valeur dans les paramètres de l'ordinateur de bord...vous réagiriez comment ?

Ce sont les acheteurs récents de carte nvidia qui doivent être les plus contents d'avoir des perfs optimales dès l'achat et non pas des années après....

Enfin bon, réjouissons-nous, on va gagner qq secondes dans les rendus 3D ou calculs de math scientifiques prévisionnels... Et quelques secondes dans une renderfarm ça compte énormément.
0  0 
Avatar de Aiekick
Membre extrêmement actif https://www.developpez.com
Le 16/07/2015 à 16:55
c'est toujours pareil on code facilement maintenable et pas performant parce que les pc sont sur-puissants. donc pas étonnant de gagner du fps en faisant le boulot plus finement qu'a l'habitué.

Oepncv par ex sans et avec la libraire de primitive intel ( fonctions matricielle et autres codées en assembleur ). dans un cas tu es quasi temps réel, dans l'autre cas complètement...
0  0 
Avatar de dourouc05
Responsable Qt & Livres https://www.developpez.com
Le 16/07/2015 à 21:16
Citation Envoyé par MichaelREMY Voir le message
Ce sont les acheteurs récents de carte nvidia qui doivent être les plus contents d'avoir des perfs optimales dès l'achat et non pas des années après....
Oui, mais non. Diminuer la précision par deux, ça fait beaucoup moins de données… mais ça fait aussi beaucoup moins de précision ! Selon les applications, une grande précision est importante ou pas — ça peut faire la différence entre un algorithme itératif qui converge ou pas du tout, ces affaires de précision. C'est donc à chaque développeur de se demander s'il a besoin d'une grande précision ou pas : si non, alors il peut gagner en performance.

Pour reprendre ton exemple, ça serait plutôt réduire la consommation de 50 % en te disant que ta voiture sera à peu près sur la route — et pas juste parce que tu bois trop, aussi parce que la direction est nettement moins précise.
0  0 
Avatar de dourouc05
Responsable Qt & Livres https://www.developpez.com
Le 09/09/2015 à 9:02
La version finale est maintenant disponible : https://developer.nvidia.com/cuda-toolkit
0  0