c++ - 使用openmp实现并行广度优先搜索
问题描述
我想使用openmp实现并行广度优先遍历。
我阅读了 Parallelizing a Breadth-First Search。我只是想打印广度优先遍历。但是上面提供的链接中的代码几乎包含了临界区的所有遍历代码。
如果没有两个线程可以同时处于临界区,那么它将花费与顺序程序相同的时间(可能需要更多时间)。如何使用 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()
相当昂贵
只要这成立,剩余代码位于临界区就不是问题。例如,您可以使用阿姆达尔定律来计算理论上可实现的加速。
综上所述,如果您doStuff
的价格非常便宜,那么您的观察当然是正确的。然后,我建议使用不需要共享队列的搜索,例如深度优先搜索或迭代深化深度优先搜索。
推荐阅读
- matlab - 计算 BMI MATLAB
- python - 为什么这段代码不在这一行之后运行?
- javascript - javascript:仅按第一个空格拆分句子并插入到同一个列表中。功能性方法
- r - 使用 ggplot 包制作箱线图时的 aes() 值是什么?
- image - 为纸张导出 Matlab 图像
- encryption - 错误:“解码错误(36):字典不匹配”在命令行上使用 ZSTD 解码来解码 .ZST 文件
- python - 从父目录导入时出现 Python3 ModuleNotFoundError
- vue.js - 自定义字体未在 Electron + Vue App 上显示
- html - 当我缩放浏览器宽度时,我的英雄图像会放大
- vim - 使用vim查找项目中的文件