OpenMP 中的執行緒任務排程

2021-08-20 06:53:41 字數 2555 閱讀 6549

openmp中任務排程主要針對並行的for迴圈,當迴圈中每次迭代的計算量不相等時,如果簡單地給各個執行緒分配相同次數的迭代,則可能會造成各個執行緒計算負載的不平衡,影響程式的整體效能。

如下面的**中,如果每個執行緒執行的任務數量平均分配,有的執行緒會結束早,有的執行緒結束晚:

1 #include2 #include3

4int

main();

6#pragma omp parallel for

7for (int i =0; i < 100; i++)

11return0;

12 }

為此,openmp提供了schedule子句來實現任務的排程。

schedule子句:

schedule(type[, size]),

引數type是指排程的型別,可以取值為static,dynamic,guided,runtime四種值。其中runtime允許在執行時確定排程型別,因此實際排程策略只有前面三種。

引數size表示每次排程的迭代數量,必須是整數。該引數是可選的。當type的值是runtime時,不能夠使用該引數。

1.靜態排程static

大部分編譯器在沒有使用schedule子句的時候,預設是static排程。static在編譯的時候就已經確定了,那些迴圈由哪些執行緒執行。

當不使用size 時,將給每個執行緒分配┌n/t┐個迭代。當使用size時,將每次給執行緒分配size次迭代。

如下面**:

1 #include2 #include3

intmain();

5#pragma omp parallel for schedule(static)6//

#pragma omp parallel for schedule(static,5)

7for (int i =0; i < 100; i++)

10return0;

11 }

在四核機器上執行:

(1)當不使用引數時,100/4=25,0-24由1號執行緒執行;25-49由2號執行緒執行;50-74由3號執行緒執行;75-99由4號執行緒執行

(1)當不使用引數時,x(x=0,1,2,3)執行緒執行((n/5)%4)任務。其中n=0-99。

2.動態排程dynamic

動態排程依賴於執行時的狀態動態確定執行緒所執行的迭代,也就是執行緒執行完已經分配的任務後,會去領取還有的任務。由於執行緒啟動和執行完的時間不確定,所以迭代被分配到哪個執行緒是無法事先知道的。

當不使用size 時,是將迭代逐個地分配到各個執行緒。當使用size 時,逐個分配size個迭代給各個執行緒。

如下面**:

1 #include2 #include3

intmain();

5#pragma omp parallel for schedule(static)6//

#pragma omp parallel for schedule(static,5)

7for (int i =0; i < 100; i++)

10return0;

11 }

1 #include2 #include3

intmain();

5#pragma omp parallel for schedule(dynamic)6//

#pragma omp parallel for schedule(dynamic,5)

7for (int i =0; i < 100; i++)

10return0;

11 }

3.啟發式排程guided

採用啟發式排程方法進行排程,每次分配給執行緒迭代次數不同,開始比較大,以後逐漸減小。

size表示每次分配的迭代次數的最小值,由於每次分配的迭代次數會逐漸減少,少到size時,將不再減少。如果不知道size的大小,那麼預設size為1,即一直減少到1。具體採用哪一種啟發式演算法,需要參考具體的編譯器和相關手冊的資訊。

三種執行方式總結:

靜態排程static:每次哪些迴圈由那個執行緒執行時固定的,編譯除錯。由於每個執行緒的任務是固定的,但是可能有的迴圈任務執行快,有的慢,不能達到最優。

動態排程dynamic:根據執行緒的執行快慢,已經完成任務的執行緒會自動請求新的任務或者任務塊,每次領取的任務塊是固定的。

啟發式排程guided:每個任務分配的任務是先大後小,指數下降。當有大量任務需要迴圈時,剛開始為執行緒分配大量任務,最後任務不多時,給每個執行緒少量任務,可以達到執行緒任務均衡。

1 #include2 #include3

intmain();

5#pragma omp parallel for schedule(static)6//

#pragma omp parallel for schedule(static,5)

7for (int i =0; i < 100; i++)

10return0;

11 }

OpenMP中的任務排程

openmp中,任務排程主要用於並行的for迴圈中,當迴圈中每次迭代的計算量不相等時,如果簡單地給各個執行緒分配相同次數的迭代的話,會造成各個執行緒計算負載不均衡,這會使得有些執行緒先執行完,有些後執行完,造成某些cpu核空閒,影響程式效能。例如以下 int i,j int a 100 100 fo...

OpenMP中的任務排程

openmp中的任務排程 openmp中,任務排程主要用於並行的for迴圈中,當迴圈中每次迭代的計算量不相等時,如果簡單地給各個執行緒分配相同次數的迭代的話,會造成各個執行緒計算負載不均衡,這會使得有些執行緒先執行完,有些後執行完,造成某些cpu核空閒,影響程式效能。例如以下 int i,j int...

OpenMP中的任務排程

openmp中的任務排程 openmp中,任務排程主要用於並行的for迴圈中,當迴圈中每次迭代的計算量不相等時,如果簡單地給各個執行緒分配相同次數的迭代的話,會造成各個執行緒計算負載不均衡,這會使得有些執行緒先執行完,有些後執行完,造成某些cpu核空閒,影響程式效能。例如以下 int i,j int...