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"。
我有一个在英特尔平台上运行的 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"。