使用openmp实现并行广度优先搜索
Implementing parallel breadth first search using openmp
我想使用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
非常便宜,你的观察当然是正确的。然后,我建议使用不需要共享队列的搜索,例如深度优先搜索或迭代深化深度优先搜索。
相关文章:
- 提升图广度优先搜索前置编译错误
- 使用openmp实现并行广度优先搜索
- 广度优先搜索陷入无限循环
- 并行化广度优先搜索
- 如何使用C 中的广度优先搜索解决8个式嘴问题
- 如何使用广度优先搜索确定是否可以在有向图中到达顶点
- 修改广度优先搜索算法以记住矩阵中的最短路径
- 如何实现广度优先搜索
- 图论:广度优先搜索
- 广度优先搜索未找到正确的路径
- 有向图中的广度优先搜索
- 使用Boost图库从多个来源进行广度优先搜索
- 如何用C++编写广度优先搜索的代码
- C++以广度优先搜索的方式查找多个数组中元素的所有组合
- 广度优先搜索:有向图
- 邻接列表,用于创建图形和广度优先搜索 (BFS) 和 Fepth First Search (DFS)
- 广度优先搜索中的 C++ 迭代器和指针用法
- 广度优先搜索输入
- 广度优先搜索返回错误的金额
- 是否可以将boost库的广度优先搜索算法应用于矩阵