VT2016 GPGPU


 * Contexte

Le CPU fait des opérations diverses et variées et est historiquement la première unité de calcul créée. Le CPU est très bon pour effectuer des opérations séquentielles ce qui le rend très versatile. Au niveau du traitement des données, les accès mémoire peuvent être aléatoires (ça peut taper dans le disque dur ce qui est très lent). Les CPUs ont l'avantages d'être facilement programmables.

En opposition, les GPUs effectuent des opérations spécialisées (produit de matrices, de vecteurs, math …) et sont intrinsèquement parallèles et utilisés dans la 3D essentiellement, avec de la meilleure mémoire (plus chère), matériel plus spécialisé. Les GPUs sont néanmoins peu programmables (difficile) mais offrent des possibilités de parallélisme poussé.


 * GPGPU

GPGPU concerne le fait de distribuer de la charge du CPU vers le GPU. Initialement c'est le CPU qui se charge de certains traitements lourds (simulations, encodages vidéo / audio, modèles météorologiques, …). Ces traitements ont la particularité de pouvoir être massivement parallélisés, d'où la volonté de fournir ce genre de tâches aux GPUs (étant intrinsèquement parallèles).

Les avantages sont multiples : excellentes performances, coûts moindres, consommation énergétique moindres (du fait du fonctionnement d'horloge des GPUs à basse fréquence). Néanmoins, programmer des GPUs et leurs interactions couplées aux CPUs est initialement à la charge du développeur (c'est long et difficile).

Beaucoup d'entreprises ayant adopté le GPGPU ont obtenus des gains de performances impressionnants. Par exemple, la société SciComp a amélioré son produit star SciFinance pour fournir des modèles de prix de produits dérivés avec CUDA qui tournent entre 20 et 100 fois plus rapidement qu’avec un code séquentiel (source Nvidia). En France, BNP Paribas a implémenté une architecture GPU pour réduire sa consommation électrique et accélérer le temps de calcul. Leur plateforme contient deux modules Tesla S1070, consommant 2kW qui remplacent environ 500 coeurs CPU consommant 25kW


 * OpenCL

OpenCL (Open Computing Language) est la combinaison d'une API et d'un langage de programmation dérivé du C, proposé comme un standard ouvert par le Khronos Group. OpenCL arrive sur le marché fin 2008 en proposant un framework standardisé permettant l'exploitation des architectures parallèles hétérogènes. OpenCL procure au développeur une abstraction basée sur le paradigme des tâches et des données permettant de décrire des graphes de calculs à effectuer, qui seront dispatchés sur les unités de calcul, simplifiant considérablement le travail du développeur en s'abstrayant également du matériel utilisé.

Beaucoup de constructeurs (Intel, Apple, Nvidia, AMD, et bien d'autres) ont adopté ce standard, proposant une implémentation d'OpenCL sur leur matériel.

Les calculs sont écrits en OpenCL C, un langage basé sur C99. En 2015, OpenCL++ arrive, permettant de programmer des GPUs (mais pas que) en C++14 (classes, templates, fonctions lambda).

OpenCL est concurrencé par CUDA (2007), le framework propriétaire de Nvidia permettant d'exploiter le matériel de Nvidia (GeForce / GTX series)