EA2014 GPGPU



= Présentation =


 * Enseignants : Georges-Pierre Bonneau, Didier Donsez (EA2014)
 * Sujet : GPGPU
 * Date : 17 octobre 2014
 * Auteur : William Bobo 
 * Lien vers les slides de la présentation : [Transparents]

= Résumé = GPGPU ou General-purpose Processing on Graphics Processing Units. C'est une méthode permettant l’exécution de calculs hautes performances sur des GPU. Ces calculs peuvent ne pas être des calculs graphique pour lesquels ont été conçu les GPU à l'origine. Nous prenons OpenCL comme exemple pour l’exécution de calcul sur le GPU.

Mots Clés
GPGPU, GPU, calculs hautes performances, OpenCL

= Abstract = GPGPU or General-purpose Processing on Graphics Processing Units. It's a methodology for high-performance computing that uses graphics processing. Accelerated algorithms can be others than graphics algorithms that have enabled the development of GPU. We will use OpenCL to run algorithms on a GPU.

Key Words
GPGPU, GPU, HPC, OpenCL

= Synthèse =

Introduction
Les GPU ont été à l'origine concu pour les calculs graphiques permettant l'affichage sur un écran. Leur architecture est différente des CPU, les GPU contiennent beaucoup plus de cœurs permettant la parallélisation d'une même tache. Les écrans se modernisant, les besoins en calcul ont aussi augmenté et avec leur nombre de coeur, les GPU ont gagné en puissance brut comparé aux CPU. En 2002, une importante avancée dans la flexibilité de la programmation des GPU facilite les calculs autres que graphiques sur ces circuits. C'est la naissance de la méthode GPGPU.

Motivations
De nombreux domaines nécessitent des calculs à hautes performances. Le fait d'utiliser GPGPU pour une application est appelé acceleration GPU. Les principaux domaines sont : Les calculs hautes performances peuvent aussi être fait sur des CPU à l'aide de cluster mais le coût est incomparable. Le rapport prix/puissance baisse régulièrement grâce aux jeux vidéos qui démocratisent l'utilisation de GPU.
 * Le traitement de l'image
 * Les simulations (Météorologique, simulation neuronal, simulation de fluide etc )
 * Les outils scientifiques tel que Matlab
 * Tout ce qui calcul sur de grands ensembles de données (Moteur physique etc..)

Pre-conditions
Les algorithmes exécutés sur les GPU ne sont pas les même que ceux sur les CPU. Les algorithmes doivent être re-écris pour une exécution parallèle. Ce type d’exécution rend très efficace le traitement de grands ensembles de données dans le cas où le traitement est identique pour chacun de ces éléments.

Solutions
Il y a trois grandes solutions.

La plus ancienne est celle des shaders qui semblera familière aux utilisateurs d'OpenGL.

La second méthode est conçu par les constructeurs de GPU. Nvidia a fait CUDA et AMD FireStream par exemple.

La dernière méthode est celle présenté : OpenCL.

OpenCl
OpenCl ou Open Computing Langage est un standard proposé par le Khronos Group. C'est un consortium industriel dont font parti entre autres Nvidia, ATI, AMD, ARM et Intel.

OpenCL spécifie une API et un langage. Le langage est un dérivé du C et permet d’écrire les algorithme à exécuter dans des fichiers ".cl". L'API permet de gérer les entré sorties de l'algorithme, la synchronisation et l’exécution. OpenCL permet d'utiliser GPGPU mais va au delà. Ce standard est conçu pour qu'avec le même code, l’exécution puisse être faite sur un GPU ou un CPU.

Principes
Les programmes crées dans le langage OpenCl sont compilé à l’exécution à l'aide de l'API OpenCl. Cela rappel l'utilisation des shader dans OpenGl. Il est possible de créer un pont entre OpenCl et OpenGl pour échanger des objets tel que des buffers.

Le CUDA se basait sur l'unité "Thread" pour exprimé l’exécution parallèle. Pour OpenCl, l'unité est le work-item. Pour chaque work-item, une execution de l'algorithme est invoqué. Chaque work-item a une memoire privée. Les work-item sont rassemblé dans es work-group. Chaque work-item d'un work-group partagent une mémoire local. Le nombre total de work-item est specifié par la taille des données à traiter. Il y a une memoire constante et une memoire globale partagé par tout les work-item.

OpenCl utilise la notion de dimension. Les work-item et les work-group peuvent être déclaré avec des indices dimensionnel plutôt qu'un entier simple.

L'API bien qu'initialement prevu en C est aussi decliné en C++. Le diagramme de classe associé permet de mieux comprendre la construction de l'API.
 * Platform : Versions d'OpenCL exécutables sur cette machines
 * Device : Les GPU ou CPU supportant la plateformes.
 * Program : Un fichier .cl une fois compilé.
 * Kernel : L'un des points d'entré du programme.
 * Command Queue : La serie de command que devra executer un "device".

Conclusion
L'un des principaux problème de accélération GPU et qu'ils étaient soit difficile à utiliser (au travers des shader) soit limité à certaines machine de par l’implémentation propre à chaque propriétaire. OpenCl résout ce problème partiellement en offrant un standard inter-constructeur. OpenCl est maintenant disponible dans plusieurs langages, permet à toutes les cartes compatibles d'utiliser GPGPU et d'effectuer des calculs hautes performances. CUDA reste tout d même le plus utilisé pour l'acceleration GPU.

= Notes et références =
 * Alexandre Chariot, Quelques Applications de la Programmation des Processeurs Graphiques à la Simulation Neuronale et à la Vision par Ordinateur, Thèse,


 * https://software.intel.com/en-us/intel-opencl

Permet de comprendre le fonctionnement des ID dans OpenCl
 * http://jorudolph.wordpress.com/2012/02/03/opencl-work-item-ids-globalgrouplocal/


 * http://gpgpu.org/


 * OpenCl specification


 * https://www.khronos.org/