继续在 nvidia gpu 上获取 CL_INVALID_KERNEL_ARGS

Posted

技术标签:

【中文标题】继续在 nvidia gpu 上获取 CL_INVALID_KERNEL_ARGS【英文标题】:Keep getting CL_INVALID_KERNEL_ARGS on nvidia gpu 【发布时间】:2012-10-29 04:08:59 【问题描述】:

我在 nvidia GPU 上使用 OpenCL,当我尝试执行内核时,我不断收到 CL_INVALID_KERNEL_ARGS。我已经把它降级为一个非常简单的程序:

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

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

cl_kernel foo = clCreateKernel(program, "foo", &err); 诠释一个= 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; 大小_t lws[] = 100; cl_event 事件; clEnqueueNDRangeKernel(queue, foo, 1, NULL, gws, lws, 0, NULL, &evt); clFinish(队列);

clEnqueueNDRangeKernel 不断返回 CL_INVALID_KERNEL_ARGS。有什么想法吗?

【问题讨论】:

您的clSetKernelArg 呼叫不应该设置kern 而不是foo 根据规范,clEnqueueNDRangeKernel (global_work_offset) 的第四个参数也必须为 NULL,但您传递的是 gwo指向 NULL 值的指针 KLee1 - 抱歉,这是转录错误,我已修复。 James - 我改变了它,但它与错误无关。在示例中进行了更改。 我总是在 clSetKernelArg() 中将 arg_value 转换为 (void *)。试试看吧。 【参考方案1】:

见https://***.com/a/20566270/431528。

您传递的缓冲区对象有多大? __constant 参数是从单独的内存空间而不是从全局内存分配的,因此您可能已经用完了常量内存

使用clGetDeviceInfo 检查CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE 以确保您没有超过该大小。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于继续在 nvidia gpu 上获取 CL_INVALID_KERNEL_ARGS的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NVIDIA GPU 上处理来自 CPU 的 RGB 数据并使用 OpenGL 纹理可视化数据

为啥我的 tensorflow-gpu 在 Intel-HD GPU 而不是 NVIDIA 上运行?

nvidia 怎样用命令看gpu

可以在没有 GPU 的情况下运行 nvidia-docker 吗?

nvidia-container-runtime 是不是会干扰不需要在 gpu 上运行的容器?

如何在 Nvidia GPU 上调试 OpenCL?