OpenCL 中的自引用指针

Self Referencing Pointer in OpenCL

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

例如如下:

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

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

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

如果结构对齐成为主机和设备之间的问题,您也可以添加字段索引。例如字段 A 的起始字节,字段 B 的起始字节,对于具有 4 个使用字段(索引除外)的结构,所有这些都压缩在一个 4 字节整数中。

也许你可以添加一个预处理阶段:

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

也许相反更好

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

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

您还应该寻找 "sycl api"。