我将一些通用参数声明为全局(__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也会有所帮助。
答案 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...
}
然后,您可以像任何其他内核参数一样分配和设置值。