2013-04-06 138 views
2

我是英特爾TBB的新手。我正在使用concurrent_queue來實現我的項目中的細粒度並行。我沒有懷疑。這是我如何執行。Intel TBB concurrent_queue如何工作?它是否實現了細粒度的並行?

thread_fun(arguments) { 
     while(concurrent_queue.try_pop(v)) 
      operation on v; //each thread executes its own operation(seperate v for each thread) 
    } 
    main() { 
     for(..) 
     concurrent_queue.push(); //fill the queue 
     _beginthreadex(..); //create 8 win32 threads and pass concurrent_queue as an argument 
    } 
  1. 我明確提到的線程數。我讀過TBB將根據處理器核心數量創建線程。我怎麼能做到這一點?所以我不需要用_beginthreadex函數明確創建線程?

  2. 我是否通過使用concurrent_queue實現細粒度的並行?

  3. 你是什麼意思的任務級並行?如何通過英特爾tbb實現任務級並行性?我正在排隊排隊。流行操作是否被視爲一項任務?這意味着,所有流行操作都被視爲不同的任務。我每次用8個線程彈出8個元素。這意味着,我正在實現任務級別的並行性。我對麼?

  4. 如果我增加線程32的數量上的四核處理器(支持8個線程),請問concurrent_queue工作?是否同時執行隊列上共同執行的8個線程或共32個線程?

請幫幫我。

回答

5

TBB有很多部分。 Concurrent_queue只是一個可以被多個線程安全訪問的隊列。併發隊列並不直接屬於TBB的「細粒度並行」或「任務並行」部分。 (雖然這些部分可以使用 concurrent_queue。)

  1. 您共創美好的使用tbb::parallel_for晶在TBB /任務並行。請參閱該頁面上的示例或at this stack overflow question。當你使用parallel_for tbb時會照顧所有線程的創建,並且也會做動態負載平衡。

  2. Concurrent_queue不會產生任何並行可言:它只是允許多個線程安全的(和相對有效)訪問同一隊列。它確保沒有競爭條件。在你的例子中,你得到的線程不超過8個並行值。其實:concurrent_queue是序列化訪問隊列。你的並行性來自你的「對v的操作」。對concurrent_queue的訪問應該被認爲是開銷。

  3. 在您的示例中,您正在實現一種基本的任務級並行性。我發現this brilliant description of the difference between a task and a thread from a Stack Overflow answer by @Mitch Wheat

    任務是你想要做的事情。

    線程是執行該任務的可能很多工作人員之一。

    更多技術上:任務不能阻止等待彼此。你的任務是你正在執行的「對v的操作」。您正在實現任務級並行。使用類似tbb::parallel_for的優點是它(a)自動爲您啓動線程,(b)嘗試自動選擇最適合用戶系統上的核心數的線程數,(c)經過優化以減少將任務分配給線程的開銷,以及(d)如果您的任務操作的長度不相等,也會執行一些非常酷的動態負載平衡。

  4. 讓我們併發並行區分。你的機器有8個硬件線程。所以你的CPU最大並行度爲8.我將使用術語併發來表示「如果你有一個具有無限數量內核的神奇處理器,你可以達到的最大並行度」。通常情況下,創建比核心數多的線程的主要原因是如果您的線程正在執行大量長時間延遲的I/O操作。操作系統可以切換到其中一個額外的線程來執行CPU工作,而另一個線程正在等待磁盤/網絡。