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.

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

Version C<br />

cl_kernel kernel = clCreateKernel(program, "kernel", &err);<br />

Version C++<br />

cl::Kernel kernel(program, "kernel", &err);<br />

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

QCLKernel kernel = program.createKernel("kernel");<br />

Le kernel est une fonction précédée du mot clé __kernel <strong>avec</strong> un langage proche du C.<br />

5.1-G.2 - Passer <strong>des</strong> arguments au kernel<br />

Les kernels peuvent prendre <strong>des</strong> arguments<br />

Version C<br />

clSetKernelArg(kernel, 0, sizeof(cl_mem), (void*)&dev_A);<br />

clSetKernelArg(kernel, 1, sizeof(cl_mem), (void*)&dev_B);<br />

clSetKernelArg(kernel, 2, sizeof(cl_mem), (void*)&dev_C);<br />

Version C++<br />

err = kernel.setArg(0, A);<br />

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

// <strong>Utilisation</strong> de la fonction setArg<br />

kernel.setArg(0, A);<br />

5.1-G.3 - Exécuter le kernel<br />

Le kernel est executé grâce à la fonction clEnqueueNDRangeKernel(). Size threads exécuteront simultanément le<br />

kernel, chacun se chargeant d'additionner une composante. Les kernels sont lancé en utilisant <strong>des</strong> index 1D, 2D ou<br />

3D (en pratique, c'est du 3D mais <strong>avec</strong> y=1 et z=1 pour le 1D et z=1 pour le 2D). Le nombre total d'éléments lancés<br />

(kernels ou work item) est appelé le global work size. Les éléments (work item) peuvent être regroupé en work group.<br />

Chaque work group est définit par un index local local work size et chaque éléments dans un groupe est définit par<br />

un index dans ce groupe. TODO : <strong>des</strong>sins représentant <strong>des</strong> éléments 1d, 2D, 3D, <strong>des</strong> work groupes, etc.<br />

Version C<br />

size_t GlobalWorkSize[1] = { size };<br />

clEnqueueNDRangeKernel(commands, kernel, 1, 0, GlobalWorkSize, 0, 0, 0, 0);<br />

Version C++<br />

err = commands.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(hw.length()+1), cl::NDRange(1,<br />

1), NULL, NULL);<br />

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

kernel.setGlobalWorkSize(100, 100);<br />

kernel.run();<br />

// Passer <strong>des</strong> arguments et lancer le kernel<br />

kernel(A, B);<br />

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