【发布时间】:2012-05-31 00:01:26
【问题描述】:
我正在尝试构建具有固定数量的子节点和固定深度的树。我并不完全理解 openMP 的底层机制。调用build(root_node, 0) 时开始构建树。现在让我们假设maxDepth 是一个任意数字并且maxChildren 等于n。当build(root_node, 0) 被调用时,n 线程被启动。我的印象是这些n 线程中的每一个都会创建n 线程。然而,对top 的仔细观察发现,线程永远不会超过n。只有当maxChildren 等于或高于我拥有的核心数量时,我才能使我的核心饱和。递归中后续级别中的parallel 块似乎没有任何效果,将后续使用的可用线程数限制为初始调用build 所需的线程数。
为什么会这样?递归在这方面有什么作用吗?最重要的是,我能做些什么来解决这个问题?提前致谢。
void
build(Node* pNode, unsigned int depth)
{
if (depth >= maxDepth)
return;
std::list<Node*> children;
std::list<Node*>::iterator it;
// This loop cannot be parallelized because each call to select_next_node
// is dependent on the previous one
for (unsigned i = 0; i < maxChildren; ++i)
{
Node* const p_candidate_node = select_next_node(...);
if (is_valid(p_candidate_node))
children.push_back(p_candidate_node);
}
#pragma omp parallel private(it)
for (it = children.begin(); it != children.end(); ++it)
#pragma omp single nowait
build(*it, depth + 1);
}
【问题讨论】:
标签: c++ multithreading parallel-processing openmp