OpenCL中的自引用指针

时间:2017-01-10 07:25:52

标签: opencl gpu intel gpgpu self-reference

我有一个在英特尔平台上运行的OpenCL C ++代码。我确实知道在内核端的结构中不接受指针。但是,我有一个使用其中的自引用指针选项的类。现在,我可以使用一个结构并为主机端的结构复制相同的结构,但我无法在设备端执行相同的操作。

例如如下:

 Class Classname{  
    Classname *SameClass_Selfreferencingpointer;  
    }  
On the Host side I have done the same for the structure as well:  
    struct Structurename{  
    Structurename *SameStructure_Selfreferencingpointer;  
    }  

有人可以为设备方提供此实施的替代选项吗? 感谢您提前提供任何帮助。

1 个答案:

答案 0 :(得分:1)

由于opencl设备中没有malloc,并且结构体在缓冲区中用作结构数组,因此可以添加它的索引,以便它知道它在数组中的位置。您可以在内核之前分配一个大缓冲区,然后使用原子函数来增加伪malloc指针,就好像它是从缓冲区分配一样,但只是返回一个指向最后一个整数的整数"已分配"结构索引。然后,主机端将只使用索引而不是指针。

如果结构对齐成为主机和设备之间的问题,您也可以添加字段索引。例如字段A的起始字节,字段B的起始字节,全部压缩为单个4字节整数,用于具有除索引之外的4个已使用字段的结构。

也许您可以添加预处理阶段:

  • host将一个人为数字写入3.1415
  • 等字段
  • 设备检查struct中所有字节偏移的浮点,直到找到3.1415
  • device将找到的字节偏移量放入一个数组并将其发送给主机
  • 然后主机在从该字节偏移量
  • 开始的结构中写入float字段
  • 因此主机和设备变得对齐兼容,在从主机
  • 获取结构的所有内核中使用相同的偏移量

也许对面更好

  • 设备将3.14放在struct
  • 的字段中
  • 设备将结构写入struct
  • 数组
  • host获取缓冲区
  • 主机检查3.14并找到字节偏移量
  • 主机写入和从该偏移量开始的fp号码以供将来工作

这需要您的类及其在主机+设备端的复制结构。

您还应该寻找" sycl api"。