【发布时间】:2012-09-25 09:05:47
【问题描述】:
以下opencl代码编译失败。
typedef struct {
double d;
double* da;
long* la;
uint ui;
} MyStruct;
__kernel void MyKernel (__global MyStruct* s) {
}
错误信息如下。
line 11: error: kernel pointer arguments must point to addrSpace global, local, or constant
__kernel void MyKernel (__global MyStruct* s) {
^
正如你所看到的,我已经清楚地用 '__global' 限定了参数,因为错误表明我应该这样做。我在做什么错,我该如何解决这个错误?
这显然发生在内核编译期间,所以我没有在这里发布我的主机代码,因为它甚至没有比这更进一步。
谢谢。
【问题讨论】:
-
__kernel void MyKernel (__global struct MyStruct* s)之间应该没有struct关键字,看到这是C吗? -
@TonyTheLion 我不这么认为,它已被定义为 MyStruct,因此该结构是隐式的。我认为问题在于他的结构中有指针,这是不允许的。为什么你的结构中有指针,它们的含义是什么?您不能像那样从内核中指向主机内存。
-
@TonyTheLion 添加 struct 关键字确实使内核编译成功。但我不确定这是否符合我的要求。我将在下一条给 Thomas 的评论中解释。
-
@Thomas 上面的结构旨在有一个双精度数组、一个双精度数组、一个长数组和一个无符号整数。在我的主机代码中,我有一个包含三个结构的数组(尽管可能更多),我试图将它们作为参数传递给内核并使用数组索引访问每个结构。附带说明一下,添加 struct 关键字确实可以使内核编译,但从语义上讲,这是在做我想让它做的事情吗?
-
@junkie 嗯,也许托尼当时是对的,但如果我的 C-fu 是正确的,则不需要 struct。现在内核真的工作了吗?还是只是编译?我从来没有尝试过在结构中使用数组,我看不出它是如何工作的,因为一个指针被映射到一个 cl_mem 主机端,并且你的结构已经是一个 cl_mem,但我可能是错的。
标签: opencl