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

时间:2011-08-21 20:09:45

标签: opencl

我将一些通用参数声明为全局(__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也会有所帮助。

1 个答案:

答案 0 :(得分:6)

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

__constant float pi = 3.14f;

您也可以这样做:

内核:__constant float width = WIDTH

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

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

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

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