【发布时间】: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 *)。试试看吧。