【问题标题】:OpenCL - Initializing program-scope variables from the host?OpenCL - 从主机初始化程序范围变量?
【发布时间】:2011-08-22 22:38:27
【问题描述】:

我有一些通用参数声明为全局(__constant)结构,如下所示:

typedef struct
{
    int a;
    int b;
    float c;
    /// blah blah

} SomeParams;

__constant SomeParams Parameters;

在内核中,我需要像这样使用它:

__kernel void Foo()
{
    int a = Parameters.a;
    /// do something useful...
}

我不确定如何在执行内核之前从主机初始化参数的值。

为内核参数创建缓冲区等没有问题,但由于这不是内核参数,我需要做什么?

我正在使用 Cloo C#/OpenCL 绑定,但即使是原始 CL API 也会有所帮助。

【问题讨论】:

    标签: opencl


    【解决方案1】:

    据我所知(但我不会对此发誓),您不能从以这种方式声明的主机代码初始化变量(有一个例外,见下文)。你可以声明一个变量并像这样初始化它:

    __constant float pi = 3.14f;
    

    你也可以这样做:

    内核:__constant float width = WIDTH

    主机:使用定义WIDTH 值的-D 构建参数构建内核。

    我过去所做的是将常量变量作为内核参数。

    __kernel void Foo(__constant SomeParams Parameters)
    {
        int a = Parameters.a;
        /// do something useful...
    }
    

    然后您可以像任何其他内核参数一样分配和设置值。

    【讨论】:

    • 谢谢。我希望不必传递参数集合(它被至少六个不同的内核使用),但这是一个可行的解决方案。 __constant 并非来自每个内核可用的有限内存,我是否正确?
    • 有人想知道,为什么编译器不会对未初始化的全局变量发出警告。
    • 您可以使用clGetDeviceInfo(...) 方法和CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE 来获取设备上可用于常量缓冲区的字节数(那些标记为__constant 的变量)。传递CL_DEVICE_LOCAL_MEM_SIZE 以获取设备的本地内存大小(那些标记为__local 的变量)。还有一点需要注意……可以传递给内核的 __constant 参数的数量是有限制的。要获得该号码,请传递CL_DEVICE_MAX_CONSTANT_ARGS。 OpenCL 规范规定最小值为 8(但可能更多,具体取决于设备)。
    • 对不起,我刚刚意识到我可能没有清楚地回答你的问题。不,标记为__constant 的变量与标记为__local__private__global 的变量来自不同的内存池。
    • 我在 AMD“OpenCL 编程简介”指南中找到了以下语句:`恒定内存是全局内存的一个区域,在内核执行期间保持不变。工作项对该区域只有读取权限。允许主机进行读写访问。现在,只要他们说主机被允许写的方式......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2013-07-21
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多