與您的代碼:
#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 pragma
自OpenMP 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個不同的任務(例如),這些任務也可能由同一個線程執行。
請嘗試閱讀[OpenMP規範](http://www.openmp.org/mp-documents/OpenMP3.1.pdf)第2.7節:您會注意到您的問題的前提「_As as I知道,OpenMP中的每個任務都創建了一個線程「,這是不正確的。 – Massimiliano 2013-02-10 20:18:42