我看到的所有openmp教程示例都是爲for循環創建線程。但我需要爲普通的語句組創建線程,這些語句可能會聚集到函數中。例如,像下面這樣:爲函數創建openmp線程
#include <stdio.h>
#include <omp.h>
int A() { printf("in A:%d\n", omp_get_thread_num()); }
int B() { printf("in B:%d\n", omp_get_thread_num()); }
int D() { printf("in D:%d\n", omp_get_thread_num()); }
int E() { printf("in E:%d\n", omp_get_thread_num()); }
int F() { printf("in F:%d\n", omp_get_thread_num()); }
int G() { printf("in G:%d\n", omp_get_thread_num()); }
int H() { printf("in H:%d\n", omp_get_thread_num()); }
int C() {
printf("in C:%d\n", omp_get_thread_num());
#pragma omp parallel num_threads(2)
{
D(); // want to execute D,E in separate threads
E();
}
F();
}
main() {
omp_set_nested(1);
printf("in main:%d\n", omp_get_thread_num());
G();
#pragma omp parallel num_threads(3)
{
A(); // want to execute A,B,C in separate threads
B();
C();
}
H();
}
在上面的代碼,我希望每個函數恰好一次執行,但在不同的線程。 (所以我可能在上面的代碼中使用了僞指令,請根據需要糾正它。)
如何使用openmp編寫這種嵌套並行函數?這些函數會共享所有可用的全局變量,還是有辦法指定哪些變量將由哪些函數共享?
EDITS:在閱讀下面的Jorge Bellon的回答後,我編碼了以下內容,並在代碼後顯示其輸出。看起來像許多函數正在使用線程0,這不是我想要的 - 我希望函數能夠並行執行。另外,我只需要一次執行G,所以看起來像我必須刪除「num_threads(3)」行。讓我知道什麼是解決這個問題。
// compile this with: g++ -fopenmp
int A() { printf("in H:%d\n", omp_get_thread_num()); sleep(1); }
// similarly for B, D, E, F, G, H
int C() {
printf("in C:%d\n", omp_get_thread_num()); sleep(1);
#pragma omp task
D();
#pragma omp task
E();
#pragma omp taskwait
F(); sleep(1);
}
main() {
omp_set_nested(1);
printf("in main:%d\n", omp_get_thread_num());
#pragma omp parallel num_threads(3)
G();
#pragma omp task
A();
#pragma omp task
B();
#pragma omp task
C();
#pragma omp taskwait
H();
}
// outputs:
in main:0
in G:1
in G:0
in G:2
in A:0
in B:0
in C:0
in D:0
in E:0
in F:0
in H:0
謝謝。我試過你的解決方案,但看起來像我只有一個線程。請參閱上述問題中添加的詳細信息。 – R71
我不需要超出本地連接的任務,所以我不需要任務依賴關係的細節。 – R71
您需要指定線程將並行運行的範圍。在你顯示的基於任務的代碼中,並行範圍只有'G();'。您需要使用尖括號'{}'(參見我的示例)來定義並行部分將包括以下所有行,直到主函數結束。要知道任務是否並行運行,請將'get_thread_num()'返回值添加到'printf'中,以便知道哪個線程正在運行該任務。 –