Cool Stack

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