簡體   English   中英

如何從OpenMP(C ++)中的線程產生子線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM