【发布时间】:2016-11-29 20:55:17
【问题描述】:
是否可以在 OpenCL 中的多个内核之间共享指针数组。如果是这样,我将如何实施它?如果我没有完全弄错 - 虽然可能是这种情况 - 在内核之间共享事物的唯一方法是共享 cl_mem,但我也认为这些不能包含指针。
【问题讨论】:
-
请考虑删除 C 标签,因为这个问题似乎与 C 编程语言的特定问题无关。
标签: arrays pointers memory opencl
是否可以在 OpenCL 中的多个内核之间共享指针数组。如果是这样,我将如何实施它?如果我没有完全弄错 - 虽然可能是这种情况 - 在内核之间共享事物的唯一方法是共享 cl_mem,但我也认为这些不能包含指针。
【问题讨论】:
标签: arrays pointers memory opencl
这在 OpenCL 1.x 中是不可能的,因为主机和设备具有完全独立的内存空间,因此包含主机指针的缓冲区在设备端没有意义。
但是,OpenCL 2.0 支持共享虚拟内存 (SVM),因此包含指针的内存是合法的,因为主机和设备共享一个地址空间。但是,存在三个不同级别的粒度,这将限制您可以让这些指针指向的内容。在最粗略的情况下,它们只能引用同一缓冲区或设备当前拥有的其他 SVM 缓冲区中的位置。是的,cl_mem 仍然是向内核传递缓冲区的方式,但在带有 SVM 的 OpenCL 2.0 中,该缓冲区可能包含指针。
编辑/添加: OP 指出他们只想在内核之间共享指针。如果这些只是设备指针,那么您可以将它们存储在一个内核的缓冲区中,然后从另一个内核的缓冲区中读取它们。它们只能引用 __global,而不是 __local 内存。如果没有 SVM,它们就不能在主机上使用。主机当然需要分配缓冲区并将其传递给两个内核以供它们使用。就宿主而言,它只是不透明的记忆。只有内核知道它们是 __global 指针。
【讨论】:
我遇到了类似的问题,但我设法通过使用简单的指针结构来解决它。我怀疑有人说缓冲区会改变它们在内存中的位置,也许这对于某些特殊情况是正确的。但这绝对不会在内核使用它时发生。我没有在不同的视频卡上测试过它,但是在 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
}
我知道这是一个迟到的回复,但由于某种原因,我只遇到了对类似问题的否定答案,或者使用索引而不是指针的建议。虽然内部带有指针的结构效果很好。
【讨论】: