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.

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/

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

Saved successfully!

Ooh no, something went wrong!