OpenCL内核之间共享指针数组

时间:2016-11-29 20:55:17

标签: arrays pointers memory opencl

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

我遇到了类似的问题,但是我设法通过使用简单的指针结构来解决它。我怀疑有人说缓冲区会更改其在内存中的位置,也许在某些特殊情况下确实如此。但这绝对不会在内核正在使用时发生。我没有在不同的视频卡上对其进行测试,但是在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
}

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