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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

5.1 - Le platform layer API<br />

<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 />

Le fonctionnement d'une application utilisant OpenCL peut se résumer en trois étapes de base : le transfert <strong>des</strong><br />

données entre l'hôte (CPU, qui sera nommé host dans le code) et le périphérique (GPU, qui sera nommé device dans<br />

le code), le calcul sur la carte graphique proprement dit puis le transfert du résultat entre le périphérique et l'hôte. À ces<br />

trois étapes, il faut ajouter <strong>des</strong> étapes d'initialisation et d'affichage. Au final, il faudra donc suivre le processus suivant :<br />

• initialisation <strong>des</strong> données ;<br />

• initialisation du contexte OpenCL ;<br />

• transfert <strong>des</strong> données de l'hôte vers le périphérique ;<br />

• calcul proprement dit ;<br />

• transfert <strong>des</strong> données du périphérique vers l'hôte ;<br />

• affichage du résultat.<br />

5.1.1 - Gérer les erreurs<br />

Pour utiliser les routines OpenCL, il faut inclure dans les en-tête correspondant à la librairie utilisée (à adapter en<br />

fonction de l'installation, voir les manuels d'installation spécifique pour chaque implémentation d'OpenCL).<br />

cpp<br />

#include <br />

cpp<br />

#include <br />

cpp<br />

#include <br />

La gestion <strong>des</strong> erreurs dans OpenCL utilise un paramètre de type cl_int, soit en paramètre de retour de fonction, soit<br />

en passant une variable en référence non constante comme paramètre, selon la fonction utilisée. Par exemple pour<br />

les fonctions clGetPlatforms et clCreateContext (ces fonctions sont expliquées juste après) :<br />

cl_int err;<br />

err = clGetPlatformIDs(1, &cpPlatform, NULL); // code d'erreur en paramètre de retour<br />

gpuContext = clCreateContext(0, 1, &cdDevice, NULL, NULL, &err); // code d'erreur passé par référence<br />

Lorsqu'aucune erreur n'a été trouvée, le code de retour vaut CL_SUCCESS. Pour connaître la liste <strong>des</strong> co<strong>des</strong> d'erreur<br />

et le nom <strong>des</strong> constantes correspondantes, il est possible de regarder dans le fichier CL/cl.h. Pour faciliter le débogage<br />

du code, on utilise souvent une fonction qui affichera le code d'erreur uniquement s'il est différent de CL_SUCCESS :<br />

inline void checkError(const char* msg, cl_int err)<br />

{<br />

if (err != CL_SUCCESS)<br />

{<br />

std::cerr

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

Saved successfully!

Ooh no, something went wrong!