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