2015-02-11 88 views
0

我有以下的情況:我有一個循環大外,基本上包含一個函數foo()。在foo()中,可以同時執行bar1()和bar2(),並且需要在bar1()和bar2()完成後執行bar3()。我已經並行化了大外部循環,並將bar1()和bar2()。我假設每個外部循環線程都會生成它們自己的部分線程,這是否正確?的OpenMP嵌套並行與部分

如果上述假設的是正確的,我怎麼BAR3()來BAR2()只完成執行BAR1()和線程之後執行?如果我使用critical,它會停止在所有線程上,包括外循環。如果我使用single,那麼不能保證bar1()和bar2()會完成。

如果上述假設是不正確的,我怎麼強制外環線程resuse的BAR1(),BAR2()的線程,而不是產生新的線程每一次?

注意,溫度是一個變量,其init和明確的價格昂貴,所以我拉init和明確外for循環。它進一步複雜化,因爲bar1()和bar2()都需要某種臨時變量。理想情況下,temp應該是初始化並清除每個創建的線程,但我不知道如何強制爲線程生成的線程。 (沒有章節編譯指示,它可以在並行模塊中正常工作)。

main(){ 
    #pragma omp parallel private(temp) 
    init(temp); 
    #pragma omp for schedule(static) 
    for (i=0;i<100000;i++) { 
     foo(temp); 
    } 
    clear(temp); 
} 

foo() { 
    init(x); init(y); 
    #pragma omp sections 
    { 
     { bar1(x,temp); } 
     #pragma omp section 
     { bar2(y,temp); } 
    } 
    bar3(x,y,temp); 
} 
+1

爲什麼你想使用嵌套並行?您已經對循環進行了並行處理,因此每個線程都按順序運行'bar1','bar2'和'bar3'。只要'x','y'和'temp'不僅取決於'i'(或者獨立於所有'i'),那麼它就沒有問題。如果情況並非如此,那麼你需要在你的問題中更清楚。 – 2015-02-11 07:33:55

+0

@Zboson bar1和bar2可以並行運行,我想要額外的線程並行運行它們,但是這些額外的線程不應該在循環的每次迭代中生成。這是否更有意義? – nullgraph 2015-02-11 17:43:41

回答

1

我相信,簡單地並行化for循環應該給你足夠的並行性來使CPU中的資源飽和。但是如果你真的想同時運行兩個函數,下面的代碼應該可以工作。

main(){ 
    #pragma omp parallel private(temp) 
    { 
     init(temp); 
     #pragma omp for schedule(static) 
     for (i=0;i<100000;i++) { 
      foo(temp); 
     } 
     clear(temp); 
    } 
} 

foo() { 
    init(x); init(y); 

    #pragma omp task 
    bar1(x,temp); 

    bar2(y,temp); 

    #pragma omp taskwait 

    bar3(x,y,temp); 
}