我有以下的情況:我有一個循環大外,基本上包含一個函數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);
}
爲什麼你想使用嵌套並行?您已經對循環進行了並行處理,因此每個線程都按順序運行'bar1','bar2'和'bar3'。只要'x','y'和'temp'不僅取決於'i'(或者獨立於所有'i'),那麼它就沒有問題。如果情況並非如此,那麼你需要在你的問題中更清楚。 – 2015-02-11 07:33:55
@Zboson bar1和bar2可以並行運行,我想要額外的線程並行運行它們,但是這些額外的線程不應該在循環的每次迭代中生成。這是否更有意義? – nullgraph 2015-02-11 17:43:41