一定の数の子と一定の深さを持つツリーを構築しようとしています。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);
}