Kernel OpenCL ne fonctionne qu'une seule fois
Salut tout le monde,
Je bute sur un problème avec mon (très simple) kernel OpenCL : il semble fonctionner comme je le désire la première fois que j'exécute le programme host mais les fois suivantes, il ne se comporte plus comme il le devrait et je n'arrive pas à comprendre ce qui cloche avec le code, j'espère que quelqu'un sera en mesure de m'aider !
Voilà le code host :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| int SomeClass::someFunction() {
cl_int err = CL_SUCCESS;
try {
vector<cl::Platform> platforms;
cl::Platform::get(&platforms);
if (platforms.size() == 0) {
cout << "Platform size 0\n";
return -1;
}
cl_context_properties properties[] = { CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0};
cl::Context context(CL_DEVICE_TYPE_CPU, properties);
vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>();
cout << "Max compute units : " << devices[0].getInfo<CL_DEVICE_MAX_COMPUTE_UNITS>() << endl;
cl::Program::Sources source;
ifstream inputFile("kernel.cl");
string *prog = new string(istreambuf_iterator<char>(inputFile),(istreambuf_iterator<char>()));
source.push_back(make_pair(prog->c_str(), prog->length()));
cl::Program program_ = cl::Program(context, source);
program_.build(devices);
cl::Kernel kernel(program_, "SimpleKernel", &err);
int tab[10] = {0};
cl::Buffer buffer(context, CL_MEM_READ_WRITE|CL_MEM_USE_HOST_PTR, size_t(10), tab);
kernel.setArg(0,buffer);
cl::Event event;
cl::CommandQueue queue(context, devices[0], 0, &err);
queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(8), cl::NDRange(2), NULL, &event);
event.wait();
for (int i=0 ; i<10 ; i++)
cout << endl << tab[i];
cout << endl;
}
catch (cl::Error err) {
cerr << "ERROR: " << err.what() << "(" << err.err() << ")" << endl;
}
return EXIT_SUCCESS;
} |
et le code kernel (kernel.cl) :
Code:
1 2 3 4
| __kernel void SimpleKernel(__global int *output) {
output[get_global_id(0)] = get_global_id(0);
printf("%d %d\n", get_local_id(0), get_global_id(0));
} |
Mon but était de remplir un tableau d'int appelé "tab" à l'aide de la fonction get_global_id() : la taille du tableau est 10 et il est initialisé avec des 0.
Après l'exécution du kernel, tab devrait ressembler à ceci : tab[0] = 0, tab[1] = 1, tab[2] = 2, etc... et ÇA MARCHE mais seulement la première fois que j'exécute le programme.
Quand je printf le tableau, j'obtiens quelque chose comme "0 1 2 3 4 5 6 7 0 0" mais ensuite, quand je recommence je n'obtiens plus que "0 0 0 0 0 0 0 0 0 0" (comme si le kernel ne s'était pas exécuté) et il faut que je redémarre l'ordinateur pour qu'il fonctionne à nouveau (une seule fois).
Je n'arrive pas à comprendre ce qui cloche, si quelqu'un peut m'aider, hallelujah parce que ça commence à me rendre fou !
Merci d'avance.
Foin