1
我正在嘗試構建一個固定數量的子樹以及固定深度的樹。我不完全瞭解openMP的基本機制。樹木施工在撥打build(root_node, 0)
後開始。現在讓我們假設maxDepth
被賦予一個任意數字,並且maxChildren
等於n
。當調用build(root_node, 0)
時,會啓動n
線程。我的印象是,這些n
線程中的每一個都會創建n
線程。但仔細觀察top
發現,線程永遠不會超過n
。只有當maxChildren
等於或高於我擁有的核心數量時,我纔可以飽和我的核心。看起來在遞歸中的後續級別的parallel
塊沒有效果,將後續使用的可用線程的數量限制爲初始調用build
所需的。如何在openMP中產生線程中的子線程(C++)
它爲什麼會這樣?這個遞歸是否有任何部分?而最重要的是,我能做些什麼來補救呢?提前致謝。
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);
}
啓用嵌套並行確實消耗了太多的資源,我一直使用'maxDepth = 10'和'maxChildren = 2'得到「線程創建失敗:資源暫時不可用」的錯誤。再次感謝你的智慧! –
有沒有一種方法可以限制可以生成的最大線程數量,而無需顯式設置環境變量? –
您可以通過設置「OMP_NUM_THREADS」環境變量來指定最大線程數。它的值是逗號分隔的正數列表,它指定了每個嵌套級別使用的線程數量,例如, 'export OMP_NUM_THREADS = 4,2,2'表示在基本級別有4個線程,然後對於第一個和第二個嵌套級別最多有2個線程。 –