2013-02-10 101 views
3

我想在OpenMP程序(Linux中的C代碼)中獲取不同線程的ID。爲什麼我爲下面的代碼獲得相同的線程ID?OpenMP任務和線程創建

#pragma omp task untied 
    id1 = omp_get_thread_num(); printf("TID:%d\n",id1); 
    foo_par(A); 
#pragma omp task untied 
    id2 = omp_get_thread_num(); printf("TID:%d\n",id2); 
    foo_par(B); 
.... 

爲什麼我爲id1和id2都得到'0'?

+1

請嘗試閱讀[OpenMP規範](http://www.openmp.org/mp-documents/OpenMP3.1.pdf)第2.7節:您會注意到您的問題的前提「_As as I知道,OpenMP中的每個任務都創建了一個線程「,這是不正確的。 – Massimiliano 2013-02-10 20:18:42

回答

2

與您的代碼:

#pragma omp task untied 
    id1 = omp_get_thread_num(); printf("TID:%d\n",id1); 
    foo_par(A); 
#pragma omp task untied 
    id2 = omp_get_thread_num(); printf("TID:%d\n",id2); 
    foo_par(B); 

因爲,你不使用{}僅此指令omp_get_thread_num();將成爲一個任務。

順便說一下,請記住task pragmaOpenMP 3.0開始可用,所以如果您的GCC是舊版本4.4,則任務指令將被忽略。

嘗試以下方法:需要

#pragma omp parallel region 
{ 
    #pragma omp single 
    { 
    #pragma omp task untied 
    { 
    id1 = omp_get_thread_num(); printf("TID:%d\n",id1); 
    foo_par(A); 
    } 

    #pragma omp task untied 
    { 
    id2 = omp_get_thread_num(); printf("TID:%d\n",id2); 
    foo_par(B); 
    } 
} 
} 

的單一結構,這樣的任務將僅由一個線程創建。否則, 每個任務將被創建N次(N ==線程數)。

請注意,如果一個線程'X'能夠完成他們的工作並請求池中的其他任務,它可能會在團隊中的另一個線程之前開始。換句話說,即使你已經定義了2個不同的任務(例如),這些任務也可能由同一個線程執行。

+0

謝謝。好的,讓我以不同的方式提問。我怎樣才能控制線程?如果我理解正確,可能會有數千個由N個線程執行的任務(例如,遞歸算法)。有沒有辦法控制這些線程? (例如以不同的方式安排它們) – 2013-02-11 02:30:27

+1

@Computer_guy根據http://www.openmp.org/mp-documents/OpenMP3.1.pdf「遇到的線程可以立即執行任務,或推遲執行任務,在後一種情況下,團隊中的任何線程都可以分配任務「。所以我擔心這是不可能的。也許你可以使用「if」選項來根據其id來限制對任務的訪問。 – dreamcrash 2013-02-11 02:36:31

1

嘗試

#pragma omp task untied 
if (omp_get_thread_num() == 1) 
    foo_par(A); 
else 
    foo_par(B); 

GDB可以用來debug a program with multiple threads。使用這個來遍歷你的代碼來知道每個線程的值爲omp_get_thread_num();儘管在調試時會很明顯。