我认为线程创建和删除可能代价高昂。 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使用的线程)?
答案 0 :(得分:3)
在你的例子中,一个由4个“工作”线程组成的团队将在你的第一个并行部分进入时创建/激活,其中2个将做一些工作:一个做A,另一个做B.另外2个将在该部分结束时等待闲置。然后在退出该部分时销毁/停用4个线程。然后,当第二个并行部分进入时,将创建/激活一个由4个线程组成的新团队,同样会发生...现在我说创建/激活,因为正如您猜测的那样,创建线程成本很高,标准允许编译器创建线程一次并且只在他们想要的时候让线程在并行部分之间休眠。但这是一个应该对程序员透明的实现细节。
在一天结束时,无法知道哪个线程将处理A,B,C和D ...您只能确定A和B将由2个不同的线程处理,并且C和D由两个不同的线程组成。