使用 openmp 实现并行广度优先搜索
Implementing parallel breadth first search using openmp
我想用openmp实现并行广度优先遍历
我读了。我只是想打印广度优先遍历。但是上面提供的link里面的代码,几乎所有的遍历代码都在临界区
如果没有两个线程可以同时进入临界区,那么它会花费与顺序程序相同的时间(可能需要更多时间)。如何使用 OpenMP 并行 运行 算法?
您的前提具有误导性:
the code [...] has almost all the traversal code in the critical section.
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);
}
}
当然,遍历本身实际上是在临界区中,如果您使用的是非线程安全的数据结构,则必须如此。不过,这道题的前提是:
The processing function doStuff()
is quite expensive
只要这成立,剩下的代码在临界区就不是问题。例如,您可以使用 Amdahl's law 来计算理论上可实现的加速比。[=16=]
综上所述,如果您的 doStuff
很便宜,您的观察当然是正确的。然后我会推荐使用不需要共享队列的搜索,例如深度优先搜索或迭代加深深度优先搜索。
我想用openmp实现并行广度优先遍历
我读了
如果没有两个线程可以同时进入临界区,那么它会花费与顺序程序相同的时间(可能需要更多时间)。如何使用 OpenMP 并行 运行 算法?
您的前提具有误导性:
the code [...] has almost all the traversal code in the critical section.
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);
}
}
当然,遍历本身实际上是在临界区中,如果您使用的是非线程安全的数据结构,则必须如此。不过,这道题的前提是:
The processing function
doStuff()
is quite expensive
只要这成立,剩下的代码在临界区就不是问题。例如,您可以使用 Amdahl's law 来计算理论上可实现的加速比。[=16=]
综上所述,如果您的 doStuff
很便宜,您的观察当然是正确的。然后我会推荐使用不需要共享队列的搜索,例如深度优先搜索或迭代加深深度优先搜索。