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.
Version C++<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 />
err = queue.enqueueReadBuffer(C, CL_TRUE, 0, size, outH);<br />
Version <strong>Qt</strong>OpenCL<br />
// Fonctions bloquantes<br />
event = buffer.write(C, size);<br />
event = buffer.read(C, size);<br />
// Fonctions non bloquante<br />
event = buffer.writeAsync(0, C, size);<br />
event = buffer.readAsync(0, C, size);<br />
5.1-h.3 - Libérer un buffer<br />
Enfin, les buffers alloués sur le GPU sont libérés. Pour les version C++ et <strong>Qt</strong>OpenCL, la libération <strong>des</strong> buffers est<br />
automatique lors de la <strong>des</strong>truction <strong>des</strong> objets.<br />
Version C<br />
clReleaseMemObject(dev_A);<br />
clReleaseMemObject(dev_B);<br />
clReleaseMemObject(dev_C);<br />
5.1-I - Les évènements<br />
Les évènements permettent de connaître le status de la tâche auquels ils sont associés. Cela permet de connaitre<br />
en particulier si une tâche est terminée et de mesurer le temps d'exécution de cette tâche.<br />
Version C<br />
cl_event event;<br />
clEnqueueNDRangeKernel(commands, kernel, 1, 0, GlobalWorkSize, NULL, NULL, NULL, &event);<br />
Version C++<br />
cl::Event event;<br />
err = commands.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(size), cl::NDRange(1, 1), NULL,<br />
&event);<br />
Version <strong>Qt</strong>OpenCL<br />
QCLEvent event = kernel.run();<br />
Les évènements possède la fonction wait qui permet de bloquer la fonction en attendant que la tâche soit terminée.<br />
Cela permet par exemple d'être sur que le kernel est finit de s'exécuter avant de lire les données.<br />
<strong>Qt</strong>OpenCL permet également d'utiliser les fonctions de <strong>Qt</strong>Concurrent pour lancer un kernel. Celui-ci est alors lancé<br />
dans un thread séparé et de suivre les evènements <strong>avec</strong> QFutur. Il est alors possible de connecter <strong>des</strong> signaux et<br />
slots en passant par QFutureWatcher. voir http://doc.qt.nokia.com/opencl-snapshot/concurrent.html<br />
Version <strong>Qt</strong>OpenCL<br />
// Avec QFutur<br />
kernel.setGlobalWorkSize(100, 100);<br />
QFuture future = <strong>Qt</strong>Concurrent::run(kernel, A, B);<br />
future.waitForFinished();<br />
// Avec QFuturWatcher<br />
- 67 -<br />
http://gbelz.developpez.com/remi-achard/gpu-avance-<strong>avec</strong>-qt/modified/