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 :
et le code kernel (kernel.cl) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)); }
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
Partager