【发布时间】:2015-02-11 01:51:33
【问题描述】:
我有以下情况:我有一个大的外部 for 循环,它本质上包含一个函数 foo()。在 foo() 中,有 bar1() 和 bar2() 可以同时执行,而 bar3() 需要在 bar1() 和 bar2() 完成后执行。我已经并行化了大外循环,以及 bar1() 和 bar2() 部分。我假设每个外循环线程都会生成自己的部分线程,这是正确的吗?
如果上面的假设是正确的,我如何让 bar3() 仅在执行 bar1() 和 bar2() 的线程完成后执行?如果我使用关键,它将在所有线程上停止,包括外部 for 循环。如果我使用 single,则无法保证 bar1() 和 bar2() 会完成。
如果上面的假设不正确,如何强制外循环线程重用 bar1()、bar2() 的线程,而不是每次都生成新线程?
注意 temp 是一个变量,它的 init 和 clear 很昂贵,所以我将 init 和 clear 拉到 for 循环之外。它使事情进一步复杂化,因为 bar1() 和 bar2() 都需要某种临时变量。最佳情况下,应该为创建的每个线程初始化并清除 temp,但我不确定如何为部分生成的线程强制执行该操作。 (如果没有sections pragma,它在parallel 块中可以正常工作)。
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)就可以了。如果不是这种情况,那么您需要在问题中更加清楚。 -
@Zboson bar1 和 bar2 可以并行运行,我希望额外的线程并行运行它们,但不应在循环的每次迭代中生成这些额外的线程。这更有意义吗?
标签: c multithreading parallel-processing openmp