理解 ompordered 子句
OpenMP 的 ompordered 子句協調執行緒執行,以確保並行循環內程式碼段的順序執行。多個執行緒同時執行,直到遇到有序區域,它們在其中同步並按照與串行循環中相同的順序進行。
考慮以下程式碼:
<code class="cpp">vector<int> v; #pragma omp parallel for ordered schedule(dynamic, anyChunkSizeGreaterThan1) for (int i = 0; i < n; ++i){ ... ... ... #pragma omp ordered v.push_back(i); }</code>
此程式碼確保向量 v 填滿了包含 n 個元素的有序列表。
執行緒同步
當執行緒遇到 omp 有序區塊時,它們必須等待執行該 omp 有序區塊的執行緒盡可能最低的迭代。這種同步至關重要,因為它維護串行循環中指定的執行順序。 OpenMP 執行時期程式庫通常將最低迭代分配給第一個準備好執行的執行緒。
調度的影響
而有序子句可以與動態與靜態調度相比,建議動態調度。使用靜態調度,線程的迭代是預先定義的,如果將最低迭代分配給已經完成迭代的線程,這可能會導致線程空閒。
使用動態調度,迭代是在運行時分配的,減少執行緒空轉的可能性。但是,它會帶來一些開銷,因此只有當動態調度所花費的時間與有序區域的執行時間相比可以忽略不計時才應考慮。
多執行緒有序執行
為了說明有序執行,請考慮具有三個執行緒和九次迭代的場景,每個執行緒負責三次迭代。區塊大小為1 的靜態調度將導致以下執行時間軸:
tid List of Timeline iterations 0 0,3,6 ==o==o==o 1 1,4,7 ==.o==o==o 2 2,5,8 ==..o==o==o
使用動態調度,執行時間線將是隨機的,因為分配給每個執行緒的迭代列表不是確定性的.
透過使用帶有ordered 子句的動態調度,您可以實現並發性,同時在並行循環中保持正確的執行順序。
以上是「ompordered」子句如何確保 OpenMP 中並行循環內的順序執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!