在c中使用CUDA实现Dijkstra算法

时间:2014-01-04 02:09:05

标签: cuda dijkstra

我正在尝试使用cuda实现Dijsktra的算法。我得到了一个使用map执行相同操作的代码。减少这是链接http://famousphil.com/blog/2011/06/a-hadoop-mapreduce-solution-to-dijkstra%E2%80%99s-algorithm/但我希望实现与链接中给出的类似的东西,使用cuda使用共享和全局记忆。请告诉我如何继续,因为我是cuda的新手..我不知道是否有必要以矩阵的形式提供主机和设备上的输入以及我应该在内核中执行什么操作功能

2 个答案:

答案 0 :(得分:1)

这样的事情是什么(Dislaimer这不是map-reduce解决方案)。

假设您有一个图G N状态的邻接矩阵A,条目A [i,j]表示从节点i到节点j的成本图形。

这个Dijkstras算法包含一个表示前面'V'的向量,其中V [i]是从原点到节点i的当前最小距离 - 在Dijkstras算法中,这个信息将被存储在一个堆中并加载到该堆中。每个循环的堆顶部。

现在运行算法开始看起来很像矩阵代数,因为只需使用Vector并使用以下命令将adjancicy矩阵应用于它:

V[i] <- min{V[j] + A[j,i] | j in Nodes}

对于V中的所有i值。只要有V的更新就可以运行(可以在设备上检查,无需来回加载V来检查!),还可以存储转换后的版本邻接矩阵允许顺序读取。

最多这个运行时间对应于图中最长的非循环路径。

现在有趣的问题是如何在计算块之间分配这个问题,但基于行索引的分片似乎很明显。

答案 1 :(得分:1)

我建议你研究关于 GPU上的高效图形处理的两篇着名论文。首先可以找到here。它相当简单,基本上分配一个warp来处理顶点及其邻居。你可以找到第二个更复杂的here。它可以有效地并行生成下一级顶点的队列,从而减少负载不平衡。

在对上述文章进行研究之后,您将更好地理解为什么图形处理具有挑战性以及存在缺陷的原因。然后你可以制作自己的CUDA程序。