【问题标题】:Local memory using C++ Wrappers使用 C++ Wrappers 的本地内存
【发布时间】:2016-07-13 17:34:01
【问题描述】:

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

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

【问题讨论】:

    标签: opencl


    【解决方案1】:

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

    你的内核类型是这样的:

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

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

    【讨论】:

    • 我在使用cl::Local 时收到此错误,这是否意味着我的ocl 版本还不支持此功能? “本地”不是“cl”的成员
    • 更新:我的库好像少了几行。添加了这个:/*! Local * \brief Helper 函数,用于生成 LocalSpaceArg 对象。 */ 内联 LocalSpaceArg Local(::size_t size) { LocalSpaceArg ret = { size };返回 ret; } 来自 Khronos 的 cl.hpp 文件,它工作正常。
    猜你喜欢
    • 2011-02-10
    • 2011-09-16
    • 2015-04-16
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2014-02-01
    相关资源
    最近更新 更多