使用C ++ Wrappers的本地内存

时间:2016-07-13 07:18:52

标签: opencl

我希望为我的内核使用本地工作组,但是我在将'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后面,但这会返回一个错误,告诉我没有调用函数。

如何在我的示例中将参数传递给我的内核?

1 个答案:

答案 0 :(得分:2)

有一个LocalSpaceArg类型和Local辅助函数来执行此操作。

你的内核类型是:

cl::make_kernel<cl::Buffer, cl::Buffer, cl::LocalSpaceArg, cl::LocalSpaceArg>

然后,当您使用cl::Local(size)(其中size是您希望分配的字节数)将内核排入队列时,您将指定本地内存分配的大小。