【问题标题】:Implementing Dijkstra's algorithm using CUDA in c在 c 中使用 CUDA 实现 Dijkstra 算法
【发布时间】:2014-01-04 13:09:44
【问题描述】:

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

【问题讨论】:

  • 这不是 stackoverflow 的真正问题。但是,我先做一些更简单的事情来理解 cuda 的基础知识,然后再转向图形算法。我还要补充一点,图算法通常需要一些“技巧”才能使用 SIMD 架构有效地实现。
  • 另外,显然这存在:wiki.apache.org/hadoop/CUDA%20On%20Hadoop
  • 实际上我已经使用 cuda 实现了 LU 分解,但我不确定如何实现 Dijkstra..
  • 哦,太好了 :) LU 解压 不错的 BLAS 数学,以及 cuda 的用途。做像 Dijkstra 这样的事情的问题是问题的随机访问部分,如果有一种简单的方法可以将 ddijkstra 转换为线性代数问题,我认为你将无家可归,如果不是我,这将是一个失败.. ..这看起来很有趣,请随时关注我:)

标签: cuda dijkstra


【解决方案1】:

这样的事情怎么样(声明这不是 map-reduce 解决方案)。

假设您有一个图 GN 声明邻接矩阵 A,其中条目 A[i,j] 表示图中从节点 i 到节点 j 的成本。

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

现在运行该算法开始看起来很像矩阵代数,因为它只需使用向量并使用以下命令对其应用邻接矩阵:

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

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

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

现在有趣的问题变成了如何在计算块之间分配它,但基于行索引进行分片似乎很明显。

【讨论】:

    【解决方案2】:

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

    阅读以上文章后,您将更好地理解为什么图形处理具有挑战性以及存在哪些陷阱。然后你就可以制作自己的 CUDA 程序了。

    【讨论】:

      猜你喜欢
      • 2012-11-25
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2019-04-02
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多