我希望为我的内核使用本地工作组,但是我在将'NULL'参数传递给我的内核时遇到了一些问题。我希望知道如何使用我将使用的方法传递这些参数,我将在下面显示,而不是我在这里看到的setArg:How to declare local memory in OpenCL?
我的内核有以下主机代码:
在.h文件中初始化:
std::shared_ptr<cl::make_kernel<cl::Buffer, cl::Buffer>> setInputKernel;
在主机代码中:
this->setInputKernel.reset(new cl::make_kernel<cl::Buffer, cl::Buffer>(program, "setInputs"));
将内核代码排入队列:
(*setInputKernel)(cl::EnqueueArgs(*queue, cl::NDRange(1000),cl::NDRange(1000)),
cl::Buffer, cl::Buffer);
内核代码:
kernel void setInputs(global float* restrict inputArr, global float* restrict inputs)
我已经为本地工作组参数设置了适当的大小和设置。但是,我没有成功将数据传递到内核中。
具有本地工作组的内核更新:
kernel void setInputs(global float* restrict inputArr, global float*
restrict inputs, local float* inputArrLoc, local float* inputsLoc)
我试图通过使用NULL或cl :: Buffer来修改内核的输入参数来相应地更改我的代码,但是没有用:
std::shared_ptr<cl::make_kernel<cl::Buffer, cl::Buffer, NULL, NULL>> setInputKernel;
std::shared_ptr<cl::make_kernel<cl::Buffer, cl::Buffer, cl::Buffer, cl::Buffer>> setInputKernel;
第一次尝试给了我编译器问题,说我在没有给出一个函数时期望值,而第二次尝试在我尝试运行内核时返回clSetKernelArg错误。在这两个示例中,我确保了标头和主机文件的所有参数都是一致的。
当我将内核排入队列时,我也尝试将NULL放在我的cl :: Buffers后面,但这会返回一个错误,告诉我没有调用函数。
如何在我的示例中将参数传递给我的内核?
答案 0 :(得分:2)
有一个LocalSpaceArg
类型和Local
辅助函数来执行此操作。
你的内核类型是:
cl::make_kernel<cl::Buffer, cl::Buffer, cl::LocalSpaceArg, cl::LocalSpaceArg>
然后,当您使用cl::Local(size)
(其中size
是您希望分配的字节数)将内核排入队列时,您将指定本地内存分配的大小。