OpenCL 的经典数据结构(集合、映射、二叉树...)
Classical data structure (set, map, binary tree ...) for OpenCL
我正在通过 PyOpenCL 发现 OpenCL,但我很乐意进行一些低级语言编程(C、Rust)。
在我的内核中,我想在进一步处理之前将结果与集合(哈希集或树集)中的现有数据进行比较,而不是必须浏览整个数组。我想避免在主机代码中这样做,以避免主机和设备之间的往返次数过多。
我不想更改集合的内容,因此没有工作项并发访问的风险。
我找不到某种用于 OpenCL 的 "STL" 库,或者用于 Set 和 Hash 数据结构的一些开源实现。
我是不是漏掉了什么,有没有类似的东西?
我应该自己实现一个 Set 数据结构吗?
或者在 OpenCL 内核中使用 Hash 或 Set 数据结构是否表明我正在做与 OpenCL 目标不兼容的事情?
OpenCL 内核通常是用 C 编写的,而不是 C++;或者更确切地说,C++ 内核是可选的,我不知道有任何支持它的实现。
所以没有什么可以与用于构建通用数据结构的 C++ 模板相媲美,更不用说像 STL 实现这样的东西了。此外,C++ 中基于树的数据结构通常不在连续内存上实现,而是使用大量小内存分配,这不能很好地映射到 OpenCL,OpenCL 希望数据很大,"flat"缓冲器。它也不能很好地映射到 GPU 很好支持的内存访问模式。
就是说,没有什么能阻止您构建一个在散列中执行查找的 OpenCL 内核 table,或者在排序数组中执行二分查找查找。
这两种情况下的查找操作都非常简单,并且由于 C 不支持泛型函数,这可能是没有大型 go-to 库的主要原因。
另一个原因是,使其高效将在很大程度上取决于您的数据的性质和您的目标硬件,因此您几乎肯定需要进行大量手动调整以使其更快。同样,图书馆可能会比它更有帮助。
我正在通过 PyOpenCL 发现 OpenCL,但我很乐意进行一些低级语言编程(C、Rust)。
在我的内核中,我想在进一步处理之前将结果与集合(哈希集或树集)中的现有数据进行比较,而不是必须浏览整个数组。我想避免在主机代码中这样做,以避免主机和设备之间的往返次数过多。
我不想更改集合的内容,因此没有工作项并发访问的风险。
我找不到某种用于 OpenCL 的 "STL" 库,或者用于 Set 和 Hash 数据结构的一些开源实现。
我是不是漏掉了什么,有没有类似的东西? 我应该自己实现一个 Set 数据结构吗?
或者在 OpenCL 内核中使用 Hash 或 Set 数据结构是否表明我正在做与 OpenCL 目标不兼容的事情?
OpenCL 内核通常是用 C 编写的,而不是 C++;或者更确切地说,C++ 内核是可选的,我不知道有任何支持它的实现。
所以没有什么可以与用于构建通用数据结构的 C++ 模板相媲美,更不用说像 STL 实现这样的东西了。此外,C++ 中基于树的数据结构通常不在连续内存上实现,而是使用大量小内存分配,这不能很好地映射到 OpenCL,OpenCL 希望数据很大,"flat"缓冲器。它也不能很好地映射到 GPU 很好支持的内存访问模式。
就是说,没有什么能阻止您构建一个在散列中执行查找的 OpenCL 内核 table,或者在排序数组中执行二分查找查找。
这两种情况下的查找操作都非常简单,并且由于 C 不支持泛型函数,这可能是没有大型 go-to 库的主要原因。
另一个原因是,使其高效将在很大程度上取决于您的数据的性质和您的目标硬件,因此您几乎肯定需要进行大量手动调整以使其更快。同样,图书馆可能会比它更有帮助。