我认为线程的创建和删除可能代价高昂。 OpenMP 是否尝试重用现有线程?例如,
#pragma omp parallel sections num_threads(4)
{
#pragma omp section
{ ... worker A ... }
#pragma omp section
{ ... worker B ... }
}
#pragma omp parallel sections num_threads(4)
{
#pragma omp section
{ ... worker C ... }
#pragma omp section
{ ... worker D ... }
}
在执行过程中,OpenMP 分配 5 个线程还是 3 个线程(其中 C 和 D 复用 A 和 B 使用的线程)?
在您的示例中,在进入第一个并行部分时,将创建/激活一组 4 个“工作”线程,其中 2 个将执行一些工作:一个执行 A,另一个执行 B。另外 2 个将处于空闲状态在本节的末尾。然后,4 个线程在退出该部分时被销毁/停用。然后,在进入第二个并行部分时,将创建/激活一个由 4 个线程组成的新团队,同样的情况也会发生...现在我说创建/激活,因为正如您所猜测的,创建线程的成本很高,标准允许编译器创建线程一次,并且仅在需要时才将线程置于并行部分之间的睡眠状态。但这是一个对程序员来说应该透明的实现细节。
最终,无法知道哪个线程将处理 A、B、C 和 D...您只能确定 A 和 B 将由 2 个不同的线程处理,而 C 和 D 将由两个不同的线程处理。也有不同的线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)