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.8 - Les buffers<br />

5.1-H.1 - Allouer un buffer<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 />

En général, les cartes <strong>graphiques</strong> ont une mémoire dédiée, différentes de la mémoire centrale utilisée par le CPU. Il<br />

faut donc copier les données à traiter dans le mémoire vidéo avant de lancer le calcul sur GPU.<br />

Pour envoyer <strong>des</strong> données au GPU, il est possible d'utiliser deux métho<strong>des</strong>. Soit d'allouer un tampon mémoire (buffer)<br />

et de copier les données, soit de passer <strong>des</strong> données en paramètres lors du lancement du kernel. Cette second<br />

méthode sera expliquée dans le chapitre suivant, en même temps que le lancement <strong>des</strong> kernels.<br />

Pour allouer un bloc de données en mémoire vidéo, il faut juste connaitre la taille du bloc à allouer en octets. Lorsque<br />

l'on travaille sur un tableau de données, la taille est obtenue simplement en multiplier la taille du tableau par la taille<br />

<strong>des</strong> éléments du tableau en octets.<br />

TODO : buffer = 1D, image = 2D et 3D.<br />

TODO : bloquante ou non ?<br />

TODO : paramètre de clCreateBuffer + transfert <strong>des</strong> données dans clCreateBuffer ou séparément<br />

Version C<br />

// Version C<br />

cl_mem dev_A = clCreateBuffer(gpuContext, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, size *<br />

sizeof(cl_float), A, &err);<br />

cl_mem dev_B = clCreateBuffer(gpuContext, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, size *<br />

sizeof(cl_float), B, &err);<br />

cl_mem dev_C = clCreateBuffer(gpuContext, CL_MEM_WRITE_ONLY , size * sizeof(cl_float), 0 , &err);<br />

Version C++<br />

cl::Buffer gpuA(gpuContext, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, size * sizeof(cl_float), A,<br />

&err);<br />

cl::Buffer gpuB(gpuContext, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, size * sizeof(cl_float), B,<br />

&err);<br />

cl::Buffer gpuC(gpuContext, CL_MEM_WRITE_ONLY , size * sizeof(cl_float), 0 , 0);<br />

Version <strong>Qt</strong>OpenCL<br />

QCLBuffer -> création d'un buffer à partir d'un vector<br />

<strong>Qt</strong>OpenCL fournit la classe QCLVector pour simplifier la gestion mémoire d'un vecteur de données. QCLVector alloue<br />

le vecteur dans les deux mémoires (centrale et vidéo) et se charge de synchroniser les données.<br />

Version <strong>Qt</strong>OpenCL<br />

QCLVector input1 = context.createVector(2048);<br />

5.1-H.2 - Envoyer et recevoir <strong>des</strong> données depuis un buffer<br />

Le résultat étant stocké sur le GPU, on recopie son contenu dans le pointeur C à l'aide de la fonction<br />

clEnqueueReadBuffer().<br />

Version C<br />

err = clEnqueueReadBuffer(commands, C, CL_TRUE, 0, size * sizeof(cl_float), C, NULL, NULL, NULL);<br />

- 66 -<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!