使用 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
是您希望分配的字节数)。
我希望为我的内核使用本地工作组,但是我在将 '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
是您希望分配的字节数)。