gpt4 book ai didi

c - OpenMP 与节的嵌套并行性

转载 作者:行者123 更新时间:2023-11-30 15:24:22 25 4
gpt4 key购买 nike

我有以下情况:我有一个大的外部 for 循环,它本质上包含一个函数 foo()。在 foo() 中,有可以同时执行的 bar1() 和 bar2(),以及需要在 bar1() 和 bar2() 完成后执行的 bar3()。我已经并行化了大外循环以及 bar1() 和 bar2() 部分。我假设每个外循环线程都会生成自己的部分线程,这是正确的吗?

如果上述假设正确,如何让 bar3() 仅在执行 bar1() 和 bar2() 的线程完成后才执行?如果我使用关键,它将停止所有线程,包括外部 for 循环。如果我使用 single,则不能保证 bar1() 和 bar2() 会完成。

如果上述假设不正确,如何强制外循环线程为 bar1()、bar2() 重新使用线程而不是每次都生成新线程?

请注意,temp 是一个变量,其 init 和clear 的开销很大,因此我将 init 和clear 拉到for 循环之外。这使得事情变得更加复杂,因为 bar1() 和 bar2() 都需要某种临时变量。最佳情况下,应该为创建的每个线程初始化并清除 temp,但我不确定如何强制为部分生成的线程执行此操作。 (如果没有sections pragma,它在并行 block 中工作得很好)。

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);
}

最佳答案

我相信简单地并行化 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);
}

关于c - OpenMP 与节的嵌套并行性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28445261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com