【问题标题】:Pointer Array shared between OpenCL kernelsOpenCL 内核之间共享的指针数组
【发布时间】:2016-11-29 20:55:17
【问题描述】:

是否可以在 OpenCL 中的多个内核之间共享指针数组。如果是这样,我将如何实施它?如果我没有完全弄错 - 虽然可能是这种情况 - 在内核之间共享事物的唯一方法是共享 cl_mem,但我也认为这些不能包含指针。

【问题讨论】:

  • 请考虑删除 C 标签,因为这个问题似乎与 C 编程语言的特定问题无关。

标签: arrays pointers memory opencl


【解决方案1】:

这在 OpenCL 1.x 中是不可能的,因为主机和设备具有完全独立的内存空间,因此包含主机指针的缓冲区在设备端没有意义。

但是,OpenCL 2.0 支持共享虚拟内存 (SVM),因此包含指针的内存是合法的,因为主机和设备共享一个地址空间。但是,存在三个不同级别的粒度,这将限制您可以让这些指针指向的内容。在最粗略的情况下,它们只能引用同一缓冲区或设备当前拥有的其他 SVM 缓冲区中的位置。是的,cl_mem 仍然是向内核传递缓冲区的方式,但在带有 SVM 的 OpenCL 2.0 中,该缓冲区可能包含指针。

编辑/添加: OP 指出他们只想在内核之间共享指针。如果这些只是设备指针,那么您可以将它们存储在一个内核的缓冲区中,然后从另一个内核的缓冲区中读取它们。它们只能引用 __global,而不是 __local 内存。如果没有 SVM,它们就不能在主机上使用。主机当然需要分配缓冲区并将其传递给两个内核以供它们使用。就宿主而言,它只是不透明的记忆。只有内核知道它们是 __global 指针。

【讨论】:

  • 我知道主机指针在 gpu 上不起作用。我也知道 SVM,但这不是我要问的。我只想在几个不同的内核之间共享一个指针数组。
  • 设备指针?然后只需将它们存储在一个内核的缓冲区中,然后从另一个内核的缓冲区中读取它们。但是它们不能在主机上使用。主机当然需要分配缓冲区并将其传递给两个内核以供它们使用。
  • 好吧,问题是如何做到这一点。
  • 它只是说“指针”;很抱歉,我没有意识到您的意思是“仅设备指针”。所以我添加到我的答案知道我明白这一点。
  • “嗯,问题是关于如何做到这一点”据我所知,您不能简单地将指针数组存储在缓冲区中。
【解决方案2】:

我遇到了类似的问题,但我设法通过使用简单的指针结构来解决它。我怀疑有人说缓冲区会改变它们在内存中的位置,也许这​​对于某些特殊情况是正确的。但这绝对不会在内核使用它时发生。我没有在不同的视频卡上测试过它,但是在 nvidia(cl 1.2) 上它工作得很好,所以我可以访问一个数组中的数据,这个数组甚至没有作为参数传递到内核中。

typedef struct
{  
   __global volatile point_dataT* point;//pointer to another struct in different buffer
}   pointerBufT;

__kernel void tester(__global pointerBufT * pointer_buf){
printf("Test id: %u\n",pointer_buf[coord.x+coord.y*img_width].point->id);//Retrieving information from an array not passed to the kernel
}

我知道这是一个迟到的回复,但由于某种原因,我只遇到了对类似问题的否定答案,或者使用索引而不是指针的建议。虽然内部带有指针的结构效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-01
    • 2015-01-16
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    相关资源
    最近更新 更多