Utilisation avancée des processeurs graphiques avec Qt
Utilisation avancée des processeurs graphiques avec Qt
Utilisation avancée des processeurs graphiques avec Qt
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Utilisation</strong> <strong>avancée</strong> <strong>des</strong> <strong>processeurs</strong> <strong>graphiques</strong> <strong>avec</strong> <strong>Qt</strong> par Rémi Achard Guillaume Belz<br />
5.0 - Introduction au GPU computing<br />
La programmation sur GPU présente <strong>des</strong> difficultés spécifiques qui nécessite en général<br />
<strong>des</strong> connaissances <strong>avancée</strong>s en programmation parallèle. Son utilisation n'est pas<br />
forcement triviale et elle n'est pas intéressante pour tous types de problématique. Une<br />
mauvaise utilisation peut aboutir à <strong>des</strong> performances médiocres, voir plus mauvaises que<br />
la version CPU.<br />
On observe régulièrement <strong>des</strong> personnes qui souhaitent utiliser le calcul sur GPU pour<br />
accélerer un algorithme qui est relativement couteux en terme de temps. Or, il apparait<br />
souvent que les problèmes de performances proviennent avant tout d'un problème de<br />
choix conceptuel et non d'une limitation <strong>des</strong> capacités du CPU. Et, il apparait souvent<br />
aussi que le passage au calcul GPU n'améliore pas les performances dans ce cas : le<br />
problème se situe bien en amont de l'implémentation et le recourt au GPU ne corrigera<br />
pas le problème.<br />
Il est donc nécessaire de bien comprendre les spécificités du GPU Computing, les<br />
contraintes en terme de transfert de données, d'accès mémoire, de parallélisation <strong>des</strong><br />
tâches, etc. pour espérer obtenir une amélioration <strong>des</strong> performances.<br />
Le calcul sur cartes <strong>graphiques</strong> (GPU Computing ou anciennement GPGPU pour General-Purpose Processing on<br />
Graphics Processing Units) est une technique permettant de réaliser <strong>des</strong> calculs parallèles à l'aide de la carte<br />
graphique. Partant du constat qu'un grand nombre de calculs habituellement reservés au CPU étaient facilement<br />
parallélisables, les fabriquants de carte <strong>graphiques</strong> ont modifié l'architecture de leur puces et developpé <strong>des</strong> API<br />
permettant aux développeurs de réaliser <strong>des</strong> calculs genériques sur carte graphique.<br />
Plusieurs API sont nées, la plus connue étant probablement celle de NVIDIA : CUDA (pour Compute Unified Device<br />
Architecture). AMD propose également une API dédiée au GPU computing : ATI Stream SDK. Dans ce tutoriel nous<br />
allons utiliser une autre API proposée par le groupe Khronos (qui propose également OpenGL) : OpenCL (pour<br />
Open Computing Language). Le travail du groupe Khronos consiste à proposer une API standard pour OpenCL,<br />
multiplatforme et open-source, qui sera ensuite implémentée par les différents constructeurs de puces <strong>graphiques</strong> sur<br />
différents types de <strong>processeurs</strong> parallèles (CPU multicores, GPU, Digital Signal Processor, Cell, etc). Cette API dérive<br />
du C (version C89) mais les spécifications pour le portage C++ sont données dans OpenCL 1.1. Il est également<br />
possible de regarder les sources de la version C++ pour voir comment est pris en charge la version C.<br />
OpenCL définit un langage équivalent au C permettant d'exécuter du code sur <strong>des</strong> périphériques de calcul (CPU,<br />
GPU, accélrateur, etc.) Le code à exécuter est envoyé au runtime OpenCL sous forme de chaîne de caractères char*.<br />
Ce code est donc compilé à l'exécution (contrairement à CUDA par exemple, qui est compilé avant l'exécution). Cela<br />
permet de gagner en flexibilité et en portabilité mais implique de prendre les précautions nécessaires pour que le<br />
programme reste performant et robuste sur différentes plateformes. OpenCL accepte les modèles de parallélisation<br />
<strong>des</strong> données et <strong>des</strong> tâches.<br />
Pour présenter les notions de base du GPU Computing et d'OpenCL, nous allons introduire un nouvel exemple :<br />
l'addition de deux vecteurs, qui sera repris tout au long de cette partie sur le GPU Computing.<br />
5.0.1 - Le calcul parallèle<br />
Observons le travail effectué par le processeur lorsque l'on additionne deux vecteurs. La méthode consiste à parcourir<br />
les deux tableaux, d'additionner deux éléments entre eux puis de mettre le résultat dans un tableau résutlat. Le code<br />
C++ est relativement simple :<br />
#include <br />
int main(int, char**)<br />
{<br />
// declarations<br />
const int N = 100000;<br />
std::vector v1(N);<br />
- 55 -<br />
http://gbelz.developpez.com/remi-achard/gpu-avance-<strong>avec</strong>-qt/modified/