1、在for的任務分擔中有幾種不同的排程方式:靜態排程和動態排程,非正式的解釋靜態排程就是每個執行緒分固定的任務,而動態排程可以理解為通過cpu進行排程,那個執行緒做完了,那個執行緒可能就會有新的任務,是動態分配任務的。
2、靜態排程:
#pragma omp parallel for schedule(static) num_threads(2)
for(int i = 0; i < 4; i++ )
printf("i = %d, thread_num = %d\n", i, omp_get_thread_num());
以上**的執行結果是什麼呢………………結果是0號執行緒輸出的i = 0和1,而1號執行緒輸出的i = 2和3,這也就意味著每個執行緒是靜態的劃分了n/t次連續的任務(我們這裡每個任務就是指一次迴圈輸出,n代表迴圈的總次數,t並行域中總共的執行緒數)
3、靜態排程:
#pragma omp parallel for schedule(static, 1) num_threads(2)
for(int i = 0; i < 4; i++ )
printf("i = %d, thread_num = %d\n", i, omp_get_thread_num());
後面加上引數2,表示每個執行緒分配2個連續的任務。
那麼我們可以通過更改這個引數的值,假設值為整型size,則每個執行緒分配連續size個任務。(那麼當size>=t的時候任務會怎麼分配呢??可以試試哇!)
那有沒有可能0執行緒分配搭配i = 0和i = 1呢,看看下面的動態排程。
4、動態排程:
#pragma omp parallel for schedule (dynamic) num_threads(2)
for(int i = 0; i < 4; i++ )
printf("i = %d, thread_num = %d\n", i, omp_get_thread_num());
每個執行緒動態分配任務。
對應於上面的程式,如果加上引數size,表示動態排程的時候是分配兩個連續的任務
#pragma omp parallel for schedule (dynamic, size) num_threads(2)
for(int i = 0; i < 4; i++ )
printf("i = %d, thread_num = %d\n", i, omp_get_thread_num());
假設i = 1,對應上面3的最後乙個問題,這裡的0號執行緒可能分配到i = 0和i= 1,因為是動態排程的。
5、guided排程:
#pragma omp parallel for schedule (guided, size) num_threads(2)
for(int i = 0; i < 4; i++ )
printf("i = %d, thread_num = %d\n", i, omp_get_thread_num());
每個執行緒分配到的任務數會逐漸遞減,預設size = 1。
6、runtime排程:
通過設定環境變數omp_schedule來確定排程型別,沒有用過所以不做介紹了。
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...