是否可以使用CUDA在GPU上创建链接列表? 我正在努力做到这一点,我遇到了一些困难 如果我无法在CUDA内核中分配动态内存,那么如何创建新节点并将其添加到链接列表中呢?
答案 0 :(得分:5)
如果你可以提供帮助,你真的不想这样做 - 如果你无法摆脱链接列表,你可以做的最好的事情是通过数组模拟它们并使用数组索引而不是链接的指针
答案 1 :(得分:5)
GPU上的链表有一些有效的用例。考虑使用跳过列表作为替代,因为它们提供更快的操作。有一些高度并发的Skip List算法可以通过Google搜索获得。
查看此链接http://www.cse.iitk.ac.in/users/mainakc/lockfree.html/ 对于CUDA代码,可以在许多无锁CUDA数据结构上进行PDF和PPT演示。
链接列表可以使用缩减算法方法并行构建。这假设所有成员在施工时都是已知的。每个线程通过连接2个节点开始。然后,一半的线程将2个节点段连接在一起,依此类推,每次迭代将线程数减少2个。这将在log2 N时间内构建一个列表。
内存分配是一种约束。预分配主机上阵列中的所有节点。然后你可以使用数组下标代替指针。这具有以下优点:列表遍历在GPU和主机上有效。
对于并发性,您需要使用CUDA原子操作。原子添加/增量以计算节点阵列中使用的节点,并比较和交换以设置节点之间的链接。
再次仔细考虑用例和访问模式。使用一个大的链表非常连贯。使用100 - 100的小链接列表更加平行。我希望内存访问不被合并,除非注意在相邻的内存位置分配连接的节点。
答案 2 :(得分:0)
我同意Paul的观点,链接列表是一种非常“连续”的思维方式。忘记你对串行操作的了解,并立刻做所有事情:)
答案 3 :(得分:0)
查看Thrust进行常规操作的方法