dworkindambre wrote:Le message d'erreur :
fatal error: oclUtils.h: No such file or directory
Quels sont les .h inclus dans les bouts de code que tu as vu?
Si tu as un bout de code exemple, je suis prenneur.
Ci-dessous, un morceau de programme fonctionnel simplifié à l'extreme, il manque énormément de chose pour en faire un programme décent : Libérer la mémoire, le kernel, vérifier chaque erreur, etc... Il me semble que le code original n'est pas de moi, mais je n'arrive pas à mettre la main sur l'endroit d'où ça provient... Mais vu ce que c'est je suppose qu'il n'y a pas de soucis.
pour compiler : gcc ./fichier.c -lOpenCL -o prog
Bonne chance
#include <stdio.h>
#include <string.h>
#include <CL/cl.h>
const char copy_cl[] = " \
__kernel void copy (__global const char* in, __global char* out) \
{ \
const uint index = get_global_id(0); \
out[index] = in[index]; \
} \
";
int main() {
char buf[] = "Hello, World!";
size_t srcsize;
size_t worksize = sizeof (buf);
cl_int error;
cl_platform_id platform;
cl_device_id device;
cl_uint platforms, devices;
cl_context context;
cl_command_queue cq;
const char *src = copy_cl;
const char *srcptr[] = {src};
cl_program prog;
cl_mem mem1, mem2;
cl_kernel k_copy;
char buf2 [sizeof (buf)];
memset (buf2, 'a', sizeof (buf2));
buf2 [worksize - 1] = 0;
puts (buf2);
error = clGetPlatformIDs (1, &platform, &platforms);
error = clGetDeviceIDs (platform, CL_DEVICE_TYPE_ALL, 1, &device, &devices);
cl_context_properties properties[] = {CL_CONTEXT_PLATFORM, (cl_context_properties)platform, 0};
context = clCreateContext (properties, 1, &device, NULL, NULL, &error);
cq = clCreateCommandQueue (context, device, 0, &error);
srcsize = strlen (copy_cl);
prog = clCreateProgramWithSource (context, 1, srcptr, &srcsize, &error);
error = clBuildProgram(prog, 0, NULL, "", NULL, NULL);
mem1 = clCreateBuffer (context, CL_MEM_READ_ONLY, worksize, NULL, &error);
mem2 = clCreateBuffer (context, CL_MEM_WRITE_ONLY, worksize, NULL, &error);
k_copy = clCreateKernel (prog, "copy", &error);
clSetKernelArg (k_copy, 0, sizeof(mem1), &mem1);
clSetKernelArg (k_copy, 1, sizeof(mem2), &mem2);
error = clEnqueueWriteBuffer (cq, mem1, CL_FALSE, 0, worksize, buf, 0, NULL, NULL);
error = clEnqueueNDRangeKernel (cq, k_copy, 1, NULL, &worksize, &worksize, 0, NULL, NULL);
error = clEnqueueReadBuffer (cq, mem2, CL_FALSE, 0, worksize, buf2, 0, NULL, NULL);
error = clFinish (cq);
puts(buf2);
return EXIT_SUCCESS;
}