OpenCL en C++
Une interface officielle OpenCL pour C++ existe (C++ Bindings for OpenCL). Cela permet de simplifier les appels à l'API OpenCL par rapport à l'utilisation de l'API C. Voici un rapide description de l'utilisation de cette API.
Téléchargez le C++ Bindings for OpenCL : http://www.khronos.org/registry/cl/ Sous Linux (Ubuntu 9.10) avec Gcc 4.4.1, l'exemple fournit dans la doc ne compile pas. Il suffit d'inclure iostream avant CL/cl.hpp.
#include <iostream>
#include <CL/cl.hpp>
Les librairies à inclure et les flags
#define __CL_ENABLE_EXCEPTIONS
#define __NO_STD_VECTOR
#define __NO_STD_STRING
#include <cstdio>
#include <cstdlib>
#include <iostream>
#if defined(__APPLE__) || defined(__MACOSX)
#include <OpenCL/cl.hpp>
#else
#include <CL/cl.hpp>
#endif
Les flags __NO_STD_VECTOR et __NO_STD_STRING sont présent pour utiliser la version de String et Vector développer dans cl.hpp. Cette implémentation est plus adapté pour une mise en production et s'utilise de la même manière que la version STD.
Créer un context et recuperer les devices associées
cl::Context context(CL_DEVICE_TYPE_CPU, 0, NULL, NULL, &err);
cl::vector devices = context.getInfo();
C'est quand même plus simple qu'en C.
Associer une Queue de commande à un device
cl::CommandQueue queue(context, devices[0], 0, &err);
Créer, compiler un programme et le mettre dans un kernel
cl::Program::Sources source(1, std::make_pair(helloStr, strlen(helloStr) ) );
cl::Program program_ = cl::Program(context, source);
program_.build(devices);
cl::Kernel kernel(program_, "hello", &err);
Lancer le kernel
pour passer un argument: kernel::setArg et ensuite Kernel::bind ou Queue::enqueueNDRangeKernel
err = kernel.setArg(0, outCL);
cl::KernelFunctor func = kernel.bind(queue,cl::NDRange(4, 4),cl::NDRange(2, 2));
func().wait();
ou
cl::Event event;
err = queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(4, 4), cl::NDRange(2,2), NULL, &event);
event.wait();
Récupérer le resultat
err = queue.enqueueReadBuffer(outCL,CL_TRUE,0,hw.length()+1,outH);
Posted Jeu 31 décembre 2009 by Stéphane Planquart in programmation graphique