2014-05-19 54 views
3

我想知道如何執行OpenMP任務隊列的任務調度。OpenMP任務調度策略

Here我讀到,默認情況下,OpenMP強加一個寬度優先的調度程序,並且他們對FIFO和LIFO做了一些測試,但他們沒有提及任何有關默認值的內容。由於我只有一個線程(我使用單個指令)創建多個任務,因此我認爲比較他們的廣度優先和工作優先排序沒有任何意義。

那麼,默認的FIFO還是LIFO?有可能改變它嗎?

感謝

+0

只是一個說明,我沒有在答案中提到:在文章中你說他們說'OpenMP ...沒有指定這些任務的調度應該如何完成(儘管它施加了一些限制)。我認爲當你說'OpenMP強加一個廣度優先調度程序'時,你可能誤解了一些聲明...... – Massimiliano

回答

3

我想知道如何進行的OpenMP任務隊列的任務調度

摘要版本

OpenMP中任務調度是實現定義,即使standard對算法施加了一些限制。如果您需要操作調度程序,那麼要搜索的地方就是您所定位的特定OpenMP實施。

長故事

在其所有的任務調度機械定義的基本概念是,任務的調度點(見第2.11.3):

每當一個線程到達一個任務調度點,執行 可能導致它執行任務切換,開始或恢復綁定到當前團隊的不同任務的執行 。

在筆記低於他們給的什麼應該是預期的行爲(重點煤礦)更廣泛的解釋:

任務調度點動態鴻溝任務的區域分成幾部分。 每個部分從開始到結束不間斷執行。相同任務區域的不同部分 按照遇到的 的順序執行。在沒有任務同步結構的情況下,線程執行不同可調度任務 的部分的順序是未指定的。

正確的程序必須正確和一致的行爲與那些與規則 上述 兼容所有 可以想象調度序列...

該標準還規定了其中任務調度點暗示:

  • 立即任務區域
  • 的完成點之後產生一個明確的任務
  • 的以下的點
  • 在任務區域
  • 在任務等待區域
  • 在任務組區域
  • 的隱式和顯式屏障區域中的端
  • 立即在開始時在生成一個目標數據區域
  • 的目標區域
  • 和結束之後的點目標更新區域

什麼當遇到其中一個線程可以這樣做:

  • 開始綁定到當前團隊
  • 恢復所有掛起的任務區域,綁定到當前團隊綁任務的執行,向其中它被綁定
  • 開始綁定到一個解開任務的執行目前團隊
  • 恢復任何被綁定到當前團隊的暫停解開的任務區域。

它明確地說,雖然:

如果上面的選擇多於一個可用,它是不確定的 作爲將被選擇。

爲不同的符合行爲留出空間。它僅規定4個約束:

  1. 的任務包括在生成的任務後立即執行。
  2. 新綁定任務的調度受限於當前綁定到該線程的任務區域集合,並且不是 掛起在障礙區域中。如果此集合爲空,則可以安排任何新綁定任務 。否則,只有在該集合中的每個任務的後代任務爲 時纔可以安排新的並列任務。
  3. 一個依賴任務不應該被調度,直到它的任務依賴被滿足。
  4. 當一個顯式任務由一個包含if表達式的結構生成的表達式評估爲false,並且之前的約束已滿足時,將在 之後立即執行任務。

每個調度算法必須滿足要考慮符合。

+0

在隊列中等待執行的任務是什麼?任務隊列的訪問順序是什麼?有沒有關於這方面的信息? – fc67

+0

@ fc67除了四個約束之外,其他一切都是特定實現的特殊情況。 – Massimiliano