Les processeurs graphiques sont de plus en plus utilisés pour des applications qui n'ont rien à voir avec les graphismes. Au début, ces GPU servaient à effectuer des calculs particuliers pour afficher des images à l'écran. Avec le temps, notamment pour les besoins des jeux vidéo et autres applications 3D, ils sont devenus de plus en plus programmables, jusqu'à pouvoir exécuter n'importe quel programme -- mais de manière efficace seulement si on y passe assez de temps d'optimisation.
Plusieurs technologies pour programmer ces GPU sont apparues, comme Sh ou Brook au tout début. Certaines de ces technologies sont restées et ont évolué, comme NVIDIA CUDA (uniquement utilisable sur processeurs NVIDIA, sauf couche d'émulation comme HIP d'AMD), d'autres sont tombées en désuétude, comme C++ AMP ou Cilk Plus. Les organisations de normalisation sont aussi passées par là : OpenCL est une alternative normalisée à CUDA, par exemple. Microsoft a proposé sa version de l'API, DirectCompute, puis Intel son extension de C++, DPC++ (une partie de oneAPI).
Pendant ce temps, d'autres développeurs ont cherché des manières de rendre le calcul sur GPU plus accessible au grand public, sans nécessairement utiliser des technologies complexes. Par exemple, on peut compiler du code Python pour GPU avec Numba. ArrayFire offre une API unifiée pour effectuer des traitements sur des tableaux, que ce soit sur CPU ou GPU, pour une série d'applications courantes (algèbre linéaire, vision par ordinateur, etc.).
Dans le cadre du développement d'une nouvelle application qui effectue ses calculs sur GPU (que ce soit un entraînement de réseau neuronal ou du traitement de signal, dans une application à part ou à l'intérieur d'un jeu vidéo), quelle technologie conseilleriez-vous ?
Serait-ce une API propriétaire, de bas niveau ou une solution de bien plus haut niveau ?
Et dans quel langage de programmation ?
Surtout : pourquoi poseriez-vous ces choix ?
Partager