使用 C++ Wrappers 的本地内存

Local memory using C++ Wrappers

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

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

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

你的内核类型是这样的:

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

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