c++ - OpenCL:clSetKernelArg中的CL_INVALID_ARG_SIZE

标签 c++ buffer opencl

我目前正在学习如何使用OpenCL,但是在尝试将内核加入队列时遇到了问题。

内核应该接收一个浮点数和两个类型为unsigned char和unsigned int的Buffer-

__kernel void task2(float value,
                    __global unsigned char *chars,
                    __global unsigned int *ints) 

我的程序如下所示-
bufferA = cl::Buffer(context, CL_MEM_WRITE_ONLY, sizeof(cl_uchar) * alphabets.size());
bufferB = cl::Buffer(context, CL_MEM_READ_WRITE, sizeof(cl_uint) * numbers.size());

kernel = cl::Kernel(prog, "kernelTest");
kernel.setArg(0, 2.55);
kernel.setArg(1, bufferA);
kernel.setArg(2, bufferB);

queue.enqueueTask(kernel);

其中字母和数字是 vector 。该程序构建成功,但是被排除在外,因为我认为这与该问题无关。

到达程序中的enqueueTask部分时,我收到一个错误-
Error in: clSetKernelArg
Error code: -51 (CL_INVALID_ARG_SIZE)

除非对此我完全错了,否则内核将接受3个参数,而我将分别传递float,unsigned char Buffer和unsigned Int buffer的三个参数。难道我做错了什么?

最佳答案

您没有说3个setArg()调用中的哪一个失败,但是我怀疑问题可能是字面的2.55double类型,而您的内核需要float。您可以尝试2.55f,或者,如果不起作用,请使用float类型的临时变量代替文字。

请注意,clSetKernelArg()(cl::Kernel::setArg()的后端)不会验证缓冲区对象的大小。因此CL_INVALID_ARG_SIZE仅与标量参数的大小不匹配有关,对于global指针内核参数,clSetKernelArg()验证传递的参数实际上是有效的cl_mem句柄(指定的arg_sizesizeof(cl_mem))。

关于c++ - OpenCL:clSetKernelArg中的CL_INVALID_ARG_SIZE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61318283/

相关文章:

opencv - 如何从opencv中的上下文获取设备列表

opencl - 通过 OpenCL (GPU) 处理文件和流

php - CodeIgniter - 在发送到浏览器之前编辑输出缓冲区?

linux - 如何在 Linux 中创建一个大小的 FIFO 缓冲区?

opencl - OpenCL SubSlice 是否类似于 CUDA Warp (SIMD)?

c++ - 如何在虚幻引擎中动态设置文本

c - printf() 影响缓冲区溢出情况

c++ - `char * const` 字段被 MSVC (VS2015) 视为 "incompatible with C"

c++ - 如何在 C++ 中检查飞机座位预订

c++ - 如何在 Microsoft Visual Studio C/C++ 编译器中关闭位置无关代码编译?