26.06.2013 Views

Utilisation avancée des processeurs graphiques avec Qt

Utilisation avancée des processeurs graphiques avec Qt

Utilisation avancée des processeurs graphiques avec Qt

SHOW MORE
SHOW LESS

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/

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!