使用openmp实现并行广度优先搜索

Implementing parallel breadth first search using openmp

本文关键字:广度优先搜索 并行 实现 openmp 使用      更新时间:2023-10-16

我想使用openmp实现并行广度优先遍历。

我读过《并行广度优先搜索》。我只是想打印广度优先遍历。但是上面提供的链接中的代码几乎包含了关键部分中的所有遍历代码。

如果没有两个线程可以同时在关键部分,那么它将花费与顺序程序相同的时间(可能需要更多的时间(。如何使用OpenMP并行运行算法?

您的前提具有误导性:

代码[…]在关键部分几乎包含了所有的遍历代码。

std::queue<node*> q;
q.push(head);
while (!q.empty()) {
qSize = q.size();
#pragma omp parallel for
for (int i = 0; i < qSize; i++) {
node* currNode;
#pragma omp critical
{
currNode = q.front();
q.pop();
}
doStuff(currNode);
#pragma omp critical
q.push(currNode);
}
}

当然,遍历本身实际上是在一个关键部分,如果您使用的是非线程安全的数据结构,那么它必须是这样的。然而,这个问题的前提是:

处理函数doStuff()是相当昂贵的

只要这一点成立,剩余代码位于关键部分就不是问题。例如,您可以使用Amdahl定律来计算理论上可实现的加速。

尽管如此,如果你的doStuff非常便宜,你的观察当然是正确的。然后,我建议使用不需要共享队列的搜索,例如深度优先搜索或迭代深化深度优先搜索。