OpenMP 如何重用线程
How does OpenMP reuse threads
我认为创建和删除线程的成本可能很高。 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 个 "working" 线程将 created/activated 在您的第一个并行部分进入时,其中 2 个将执行一些工作:一个执行 A,另一个执行B. 其他 2 个人将在本节结束时闲置。这 4 个线程在该部分退出时 destroyed/deactivated。然后,在第二个并行部分进入时,一个新的 4 线程组将 created/activated 并且会发生同样的情况......现在我说 created/activated 因为正如你所猜测的那样,创建线程是昂贵的,标准允许编译器创建线程一次,并且只在需要时让线程在并行部分之间休眠。但这是一个应该对程序员透明的实现细节。
归根结底,无法知道哪个线程将处理 A、B、C 和 D...您只能确定 A 和 B 将由 2 个不同的线程处理,并且C 和 D 也由两个不同的线程。
我认为创建和删除线程的成本可能很高。 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 个 "working" 线程将 created/activated 在您的第一个并行部分进入时,其中 2 个将执行一些工作:一个执行 A,另一个执行B. 其他 2 个人将在本节结束时闲置。这 4 个线程在该部分退出时 destroyed/deactivated。然后,在第二个并行部分进入时,一个新的 4 线程组将 created/activated 并且会发生同样的情况......现在我说 created/activated 因为正如你所猜测的那样,创建线程是昂贵的,标准允许编译器创建线程一次,并且只在需要时让线程在并行部分之间休眠。但这是一个应该对程序员透明的实现细节。
归根结底,无法知道哪个线程将处理 A、B、C 和 D...您只能确定 A 和 B 将由 2 个不同的线程处理,并且C 和 D 也由两个不同的线程。