我正在使用 CUDA 从节点列表构建无向图。每个节点都有一个 3 维坐标,如果节点之间的距离小于某个截止距离 d,我的程序会在两个节点之间创建一条边。
现在我以邻接表的形式存储边缘。问题是,我有 1024 个线程异步计算成对距离。一旦在节点 A 和 B 之间“发现”一条边,我需要增加节点 A 的边数并将节点 B 放在邻接列表中的“下一个可用”位置。
在这里,CUDA 让我做噩梦。我希望邻接列表更新过程至关重要,但 CUDA 似乎没有提供任何超出 atomicAdd() 的功能。结果,每次运行代码时,我都会遇到不可预知的行为和不同的邻接列表。
有没有办法异步创建邻接列表?也许通过更聪明的数据结构?