使用 CUDA 创建链表

Posted

技术标签:

【中文标题】使用 CUDA 创建链表【英文标题】:Creating a linked list using CUDA 【发布时间】:2011-04-27 21:14:31 【问题描述】:

是否可以使用 CUDA 在 GPU 上创建链表? 我正在尝试这样做,但遇到了一些困难。 如果我无法在 CUDA 内核中分配动态内存,那么如何创建一个新节点并将其添加到链表中?

【问题讨论】:

【参考方案1】:

如果你能提供帮助,你真的不想这样做——如果你无法摆脱链表,你能做的最好的事情就是通过数组来模拟它们并使用数组索引而不是链接指针.

【讨论】:

作者没有提供任何证据或解释说明为什么不使用 LL。您可以在 GPU 上使用指针创建 LL。当我们在 GPU 上执行更复杂的算法时,需要这些类型的结构。仅当您需要 LL 跨内存空间持久存在时,才需要对 LL 使用数组下标。【参考方案2】:

我同意 Paul 的观点,链表是一种非常“连续”的思维方式。忘记你学到的关于串行操作的知识,一次做所有事情:)

【讨论】:

在 GPU 和并行编程中有大量有效的 LL 使用。我将它们用于散列、索引、压缩和搜索算法算法。使用 GPU 上的 LL,您可以获得每秒超过 100M 的插入...【参考方案3】:

看看Thrust做常用操作的方法

【讨论】:

【参考方案4】:

GPU 上的链表有一些有效的用例。考虑使用跳过列表作为替代方案,因为它们提供更快的操作。 Google 搜索提供了高度并发的跳过列表算法示例。

查看此链接http://www.cse.iitk.ac.in/users/mainakc/lockfree.html/ 对于 CUDA 代码,一个关于许多无锁 CUDA 数据结构的 PDF 和 PPT 演示文稿。

可以使用缩减算法方法并行构建链接列表。这假设所有成员在构建时都是已知的。每个线程从连接 2 个节点开始。然后一半的线程将 2 个节点段连接在一起,依此类推,每次迭代将线程数减少 2。这将在 log2 N 时间内建立一个列表。

内存分配是一个约束。在主机上预先分配数组中的所有节点。然后,您可以使用数组下标代替指针。这样做的好处是列表遍历在 GPU 和主机上都有效。

对于并发,您需要使用 CUDA 原子操作。原子添加/增量来计算节点数组中使用的节点,比较和交换来设置节点之间的链接。

再次仔细考虑用例和访问模式。使用一个大的链表是非常连续的。使用 100 - 100 的小链表更加并行。我希望内存访问不会合并,除非注意在相邻内存位置分配连接的节点。

【讨论】:

以上是关于使用 CUDA 创建链表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构:链表链队列

何为链表链表示例以及翻转链表

JavaScript单向链表的创建遍历插入删除操作

算法链表链表相关问题总结

数据结构-链表链表的基本操作

数据结构-链表链表的相关算法