我目前正在学习如何使用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.55
是double
类型,而您的内核需要float
。您可以尝试2.55f
,或者,如果不起作用,请使用float
类型的临时变量代替文字。
请注意,clSetKernelArg()
(cl::Kernel::setArg()
的后端)不会验证缓冲区对象的大小。因此CL_INVALID_ARG_SIZE
仅与标量参数的大小不匹配有关,对于global
指针内核参数,clSetKernelArg()
验证传递的参数实际上是有效的cl_mem
句柄(指定的arg_size
为sizeof(cl_mem)
)。
关于c++ - OpenCL:clSetKernelArg中的CL_INVALID_ARG_SIZE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61318283/