继续在nvidia gpu上获得CL_INVALID_KERNEL_ARGS

时间:2012-11-08 21:13:34

标签: opencl nvidia

我在nvidia GPU上使用OpenCL,当我尝试执行内核时,我不断获得CL_INVALID_KERNEL_ARGS。我把它归结为一个非常简单的程序:

__kernel void foo(int a, __write_only image2d_t bar)
{
  int 2 coords = {0, get_global_id(0)};
  write_imagef(bar, coords, (float4)a);
}

使用以下C程序(为简洁起见,跳过初始化和错误检查位)

cl_kernel foo = clCreateKernel(program, "foo", &err);
int a = 42;
clSetKernelArg(foo, 0, sizeof(int), &a);

cl_image_format fmt = {CL_INTENSITY, CL_FLOAT};
cl_mem bar = clCreateImage2D(ctx, CL_MEM_WRITE_ONLY|CL_MEM_ALLOC_HOST_PTR, &fmt, 100, 1, 0, NULL, &err));
clSetKernelArg(foo, 1, sizeof(cl_mem), &bar);

size_t gws[] = {100};
size_t lws[] = {100};
cl_event evt;
clEnqueueNDRangeKernel(queue, foo, 1, NULL, gws, lws, 0, NULL, &evt);
clFinish(queue);

clEnqueueNDRangeKernel继续返回CL_INVALID_KERNEL_ARGS。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

您正尝试将主机上的变量传递给内核。您需要创建一个cl_mem变量,然后使用clEnqueueWriteBuffer复制该值,然后将cl_memcl_int变量传递给内核。除此之外,你的代码对我来说很好。

答案 1 :(得分:4)

请参阅https://stackoverflow.com/a/20566270/431528

  

您传递的缓冲区对象有多大? __constant参数是从单独的内存空间分配的,而不是从全局内存中分配的,所以你可能已经耗尽了常量内存

使用CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE检查clGetDeviceInfo,确保不超过该尺寸。