Voici la seconde partie de mon article sur les GPU.
Celui-ci vous permettra de découvrir CUDA de NVIDIA
1     Présentation
CUDA ou Computer Unified Device Architecture est une librairie de dĂ©veloppement créée par NVIDIA en 2007. Celle-ci associĂ©e Ă une carte graphique compatible, permet dâutiliser la puissance de calculs des GPU dâarchitectureG80 et plus de NVidia (Ă partir des GeForce 8800 et dĂ©clinaisons).
Par abus de langage nous parlerons aussi de langage CUDA.
CUDA est aussi le premier langage Ă exploiter lâunification des shaders : les processeurs de la carte ne sont pas diffĂ©rentiĂ©s en unitĂ©s pour le traitement des vertex ou des fragments, chacun de ceux-ci peut ĂȘtre assignĂ© Ă nâimporte quelle tĂąche.
LâAPI CUDA supporte plusieurs langages tels que le C, le C++ et le Fortran.
Ces trois langages peuvent ĂȘtre utilisĂ©s simultanĂ©ment pour Ă©crire diverses fonctions exĂ©cutĂ©es par le GPU.
Il existe cependant des « wrapper », des passerelles, servant de liaison entre ces langages bas-niveau et des langages de plus haut niveaux tels que Python, Java et .Net.
CUDA est constituĂ© dâun pilote (driver), dĂ©jĂ intĂ©grĂ© aux drivers les plus rĂ©cents, dâun runtime, et de quelques librairies.

Il existe 3 niveaux de programmation pour CUDA, chacune disposant de sa propre APIÂ :
–Â Â Â Â Â Â Utilisation dâune librairie externe.
Celle-ci, possÚde le code de toute les fonctions à exécuter par le GPU, et sert de liaison entre le programme et le GPU.
Le développeur ne peut utiliser que certaines fonctions prédéfinies, et ne peut contrÎler directement le GPU.
Les deux librairies les plus connues sont CUBLAS qui offre un ensemble dâĂ©lĂ©ments pour rĂ©aliser des calculs dâalgĂšbre linĂ©aires sur le GPU, ainsi que CUFFT qui permet le calcul de transformĂ©e de Fourrier.
–      lâAPI de haut niveau : lâAPI CUDA Runtime ou appelĂ©e plus communĂ©ment C for CUDA.
Cette API est implĂ©mentĂ©e « au dessus » de lâAPI bas niveau. Chaque appel Ă une fonction du runtime est dĂ©composĂ© en instructions plus basiques gĂ©rĂ©es par lâAPI driver.
Ces 2 API sont exclusives : le programmeur doit utiliser soit lâune soit lâautre. Il est impossible de mĂ©langer des appels de fonctions de lâune et de lâautre.
Lorsque lâon parle dâAPI de haut niveau, il convient de relativiser : lâAPI runtime reste ce que beaucoup considĂšreraient comme dĂ©jĂ de trĂšs bas niveau. Cependant elle offre des fonctions bien pratiques pour lâinitialisation ou la gestion des contextes.
Cette API sera la plus couramment utilisée.
–      lâAPI de bas niveau : lâAPI CUDA Driver.
Cette API est plus complexe à gérer, elle demande plus de travail pour lancer un traitement sur le GPU, mais en contrepartie elle est plus flexible, offrant un contrÎle supplémentaire au programmeur qui le désire.
Cette API a lâavantage de pouvoir charger des portions de code en tant que module Ă partir de code binaires CUDA ou de code assembleur, et permet aussi dâinspecter les paramĂštres, âŠ
Cette API est beaucoup plus difficile à écrire, à débugger et nécessite beaucoup plus de lignes de code à écrire, mais elle offre de meilleure performances.
Les API Runtime et Driver sont capables toutes les deux de communiquer avec des ressources OpenGL ou Direct3D. LâutilitĂ© est Ă©vidente : CUDA pourrait ĂȘtre utilisĂ© pour gĂ©nĂ©rer des ressources (gĂ©omĂ©trie, textures procĂ©durales, etc.) qui seraient ensuite passĂ©es Ă lâAPI graphique ou Ă lâinverse on pourrait imaginer que lâAPI 3D pourrait envoyer le rĂ©sultat du rendu Ă CUDA qui serait dans ce cas utilisĂ© pour effectuer un post traitement. Les exemples dâinteractions sont nombreux et lâavantage est que les ressources restent stockĂ©es dans la mĂ©moire RAM du GPU sans avoir Ă passer par le goulot dâĂ©tranglement du bus PCI-Express.
CUDA est fourni avec un « émulateur » : le code devant sâexĂ©cuter sur le GPU est en fait exĂ©cutĂ© sur le GPU. Les performances sont alors bien moindres, mais permettent de dĂ©bugger lâapplication et de tester celle-ci lorsquâon ne dispose pas de GPU compatible.