天天看點

OpenMP 中的線程任務排程

OpenMP中任務排程主要針對并行的for循環,當循環中每次疊代的計算量不相等時,如果簡單地給各個線程配置設定相同次數的疊代,則可能會造成各個線程計算負載的不平衡,影響程式的整體性能。

如下面的代碼中,如果每個線程執行的任務數量平均配置設定,有的線程會結束早,有的線程結束晚:

為此,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次疊代。

  如下面代碼:

OpenMP 中的線程任務排程
OpenMP 中的線程任務排程

View Code

  在四核機器上執行:

  (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個疊代給各個線程。

OpenMP 中的線程任務排程
OpenMP 中的線程任務排程

3.啟發式排程guided

   采用啟發式排程方法進行排程,每次配置設定給線程疊代次數不同,開始比較大,以後逐漸減小。

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

三種運作方式總結:

靜态排程static:每次哪些循環由那個線程執行時固定的,編譯調試。由于每個線程的任務是固定的,但是可能有的循環任務執行快,有的慢,不能達到最優。

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

啟發式排程guided:每個任務配置設定的任務是先大後小,指數下降。當有大量任務需要循環時,剛開始為線程配置設定大量任務,最後任務不多時,給每個線程少量任務,可以達到線程任務均衡。

繼續閱讀