[英]How to spawn subthreads from threads in openMP (C++)
我正在嘗試用固定數量的孩子和固定深度建造一棵樹。 我不完全了解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);
}
默認情況下,幾乎在所有OpenMP運行時中,嵌套並行性都是禁用的。 您應該通過以下兩種方法之一顯式啟用它:
omp_set_nested(1);
OMP_NESTED
設置為TRUE
在這種情況下,嵌套並行性可能不是您想要的。 線程數量可能會快速增長,並消耗大量系統資源。 您應該使用OpenMP任務。 所有符合OpenMP 3.0的編譯器都應支持它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.