天天看點

C++ OpenMp的并行程式設計

功能:并行處理比較耗時的for循環

在OpenMP中,對for循環并行化的任務排程使用schedule子句來實作:

使用格式:schedule(type[,size])

type參數表示排程類型:static、dynamic、guided

size參數(可選):配置設定給每個線程的連續疊代計算的次數

靜态排程(static)

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

當不使用size 時,将給每個線程配置設定┌N/t┐個疊代。當使用size時,将每次給線程配置設定size次疊代。

#pragma omp parallel for schedule(static)

//#pragma omp parallel for schedule(static,2)

for (int i = 0; i < 10; ++i)

{

printf("i=%d, thread_id=%d\n", i, omp_get_thread_num());

}

動态排程(dynamic)

動态地将疊代配置設定到各個線程,動态排程可以使用size參數也可以不使用size參數,不使用size參數時是将疊代逐個地配置設定到各個線程,使用size參數時,每次配置設定給線程的疊代次數為指定的size次

#pragma omp parallel for schedule(dynamic)

//#pragma omp parallel for schedule(dynamic,2)

從結果看出:這個排程是逐個将任務配置設定到每一個核心,然後哪個執行完了就接着配置設定。如果指定size為2,就會每一次為每一個核心連續配置設定兩個任務

guided排程(guided)

guided排程是一種采用指導性的啟發式自排程方法。開始時每個線程會配置設定到較大的疊代塊,之後配置設定到的疊代塊會逐漸遞減。疊代塊的大小會按指數級下降到指定的size大小,如果沒有指定size參數,那麼疊代塊大小最小會降到1

#pragma omp parallel for schedule(guided)

三種運作方式總結:

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

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

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