基于GPU的搜索图上两个节点之间的所有可能路径

时间:2011-01-05 06:22:43

标签: graph-theory gpgpu gpu-programming

我的工作广泛使用Migliore,Martorana和Sciortino的算法来查找所有可能的简单路径,即在一个图中没有遇到任何节点的路径,如下所述:An Algorithm to find All Paths between Two Nodes in a Graph。 (虽然这个算法本质上是深度优先搜索并且本质上是直观递归的,但作者还提出了一种非递归的,基于堆栈的实现。)我想知道是否可以在GPU上实现这样的算法。目前,我正在努力在这个问题上看到任何真正的并行性。例如,监视和调度线程的成本可能使得(通过硬件线程)的协作图搜索成为禁止。或者,如果图表被分区并分配给各个硬件线程进行搜索,则可以使用分而治之策略。但是,必须弄清楚如何(1)分区图(2)制定子任务和(3)组合分区上的搜索结果。

2 个答案:

答案 0 :(得分:2)

在此生锈。 Dijkstra怎么样?

Boolean[] visited;              // [node] = true;
Boolean[][] connected;          // [node][i] = node
Vector<Vector<Integer>>[] path; // this should suck
Integer startNode;
Integer endNode;
Queue queue0; //for thread 0
Queue queue1; //for thread 1

while (queue0.hasNext()) {
   Integer node = queue.getNext();
   if visited[node] { 
      continue;
   } else {
      visited[node] = true;
   }

   for (nextNode: connected[node]) {
      for (i) {
         path[nextNode].append(path[node][i].clone().append(node));
      }
      if (nextNode%2 == 0) { queue0.add(nextNode); }
      if (nextNode%2 == 1) { queue1.add(nextNode); }
   }
}

path [endNode] [i] //从startNode到endNode的路径

分区:来自节点%2
子任务:找到从节点出发的地方
结合:你有共享记忆,对吗?

答案 1 :(得分:0)

我不认为你的问题可以很容易地以一种更快的速度移植到GPU上。利用大部分GPU能力的GPU程序:

  • 由线程的thousants组成,但它们的数量是不变的。没有产生新线程或杀死以前的线程。
  • 首选合并内存访问。如果相邻线程访问完全不同的内存区域(通常是图形算法),它将会很慢。
  • 不喜欢recurssion 堆栈。最新的NVIDIA Fermi卡支持函数调用,线程可以有堆栈,但由于线程数较多,堆栈非常短(或占用大量内存)。

说没有高效的GPU算法,但我相信没有直接的方法将现有算法转换为有效的代码。