OpenCL - 从主机初始化程序范围变量?

3Da*_*ave 3 opencl

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

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

} SomeParams;

__constant SomeParams Parameters;
Run Code Online (Sandbox Code Playgroud)

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

__kernel void Foo()
{
    int a = Parameters.a;
    /// do something useful...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jon*_*rlo 6

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

__constant float pi = 3.14f;
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

核心: __constant float width = WIDTH

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

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

__kernel void Foo(__constant SomeParams Parameters)
{
    int a = Parameters.a;
    /// do something useful...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我在AMD"OpenCL编程简介"中发现了这一说法Guid:`常量内存是一个全局内存区域,在整个内核执行过程中保持不变.工作项只能读取该区域的访问权限.允许主机进行读写访问.现在,如果他们只是说如何允许主持人写... (2认同)