2015-11-28 29 views
0

OpenMP中靜態調度的原理很簡單:調度器以循環方式向循環分配循環迭代。我們假設有四個線程:t0,t1,t2,t3OpenMP中的靜態調度循環塊是否可以使用?

如果我們使用靜態調度,第五次迭代將再次分配給t0。如果t1尚未完成其工作,會發生什麼情況?程序是否被阻止?只允許動態調度程序以更智能的方式分配工作(例如,「將下一個迭代分配給最後完成的線程」)。

回答

0

簡答題,不!

更長,版本。 OpenMP不管理線程之間的「自動」依賴關係。如果在循環迭代之間確實存在數據依賴關係,則作爲開發人員,您有責任確保放置同步,以便在並行運行時保持同步。

如果您需要在迭代中保持某種順序,您應該查看ordered指令。

+0

我不是在談論依賴關係。工作量不是平均分配的,t0仍然有效,儘管它應該得到下一次迭代。 如果沒有被阻塞,那麼靜態調度如何工作?接下來的迭代是否被分配給** t1 ** – null

+0

通過靜態調度,每個線程獲得迭代器範圍(靜態地)的相等片段。所以如果你的循環和T線程有N次迭代,每次迭代都會得到N/T迭代。已完成迭代的線程將在循環結束時等待。如果在'#pragma omp for'中使用'nowait'指令,則線程將一直持續到並行區域或「障礙」的末尾。 – simpel01

+0

如果你知道你的迭代可能有不同的工作量,最好的選擇是使用'dynamic'時間表。 – simpel01

相關問題