功能:並行處理比較耗時的for循環
在OpenMP中,對for循環並行化的任務調度使用schedule子句來實現:
-
使用格式:schedule(type[,size])
-
type參數表示調度類型:static、dynamic、guided
-
size參數(可選):分配給每個線程的連續迭代計算的次數
-
靜態調度(static)
大部分編譯器在沒有使用schedule子句的時候,默認是static調度。static在編譯的時候就已經確定了,那些循環由哪些線程執行。
當不使用size 時,將給每個線程分配┌N/t┐個迭代。當使用size時,將每次給線程分配size次迭代。
-
-
動態調度(dynamic)
動態地將迭代分配到各個線程,動態調度可以使用size參數也可以不使用size參數,不使用size參數時是將迭代逐個地分配到各個線程,使用size參數時,每次分配給線程的迭代次數為指定的size次
從結果看出:這個調度是逐個將任務分配到每一個核心,然后哪個執行完了就接着分配。如果指定size為2,就會每一次為每一個核心連續分配兩個任務
-
guided調度(guided)
guided調度是一種采用指導性的啟發式自調度方法。開始時每個線程會分配到較大的迭代塊,之后分配到的迭代塊會逐漸遞減。迭代塊的大小會按指數級下降到指定的size大小,如果沒有指定size參數,那么迭代塊大小最小會降到1
-
三種運行方式總結:
靜態調度static:每次哪些循環由那個線程執行時固定的,編譯調試。由於每個線程的任務是固定的,但是可能有的循環任務執行快,有的慢,不能達到最優。
動態調度dynamic:根據線程的執行快慢,已經完成任務的線程會自動請求新的任務或者任務塊,每次領取的任務塊是固定的。
啟發式調度guided:每個任務分配的任務是先大后小,指數下降。當有大量任務需要循環時,剛開始為線程分配大量任務,最后任務不多時,給每個線程少量任務,可以達到線程任務均衡。
open MP 與串行執行 對比:
https://www.cnblogs.com/mfryf/p/6863089.html
四種調度方式實例: dynamic、guided、runtime、static
https://blog.csdn.net/billbliss/article/details/44131919