【问题标题】:OpenCL kernel fails to compile asking for address space qualifierOpenCL 内核无法编译要求地址空间限定符
【发布时间】: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


【解决方案1】:

我认为问题在于你的结构中有指针,这是不允许的。您不能像那样从内核指向主机内存,因此内核参数结构中的指针没有多大意义。可变大小的数组在 OpenCL 中由 cl_mem 主机对象备份,这占一个完整的参数,据我所知,您只能将可变大小的数组直接作为内核参数传递(并调整数量当然,相应的工作单位)。

您可能更喜欢将大小信息放在结构中,然后将数组作为独立的内核参数提取出来。

【讨论】:

  • 完全正确。我的测试证明这确实是问题所在,最后我也确实将数组提取为独立的,仅在结构中使用偏移信息。这种数据结构最初有点不直观和乏味,但它确实有效,并且随着人们花更多时间在 opencl 上而变得更加直观。谢谢。
  • @junkie 不客气,经过反思,我相信添加 struct 起作用的原因是因为您实际上根本没有使用 MyStruct 类型,而是声明了一个通用 struct 指针,OpenCL 很高兴接受,因为它假设您稍后会将其转换为某个结构。既然你提到你使用最小内核进行测试,我猜内核是空的,所以你从来没有投射任何东西,所以它编译了,但没有按照你的想法做。不过只是猜测。
  • 这听起来很合理。我的内核是空的。奇怪的是,尽管指定了结构的名称,但它仍然不检查结构。但我并不声称完全理解这对这一切都是陌生的。
猜你喜欢
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
相关资源
最近更新 更多