我不理解omp_get_num_threads()和omp_get_max_threads()之间的区别。我复制演示代码如下所示。
omp_set_nested(1);
omp_set_max_active_levels(10);
omp_set_dynamic(0);
omp_set_num_threads(2);
#pragma omp parallel
{
omp_set_num_threads(3);
#pragma omp parallel
{
omp_set_num_threads(4);
#pragma omp single
{
std::cout << omp_get_max_active_levels() << " " << omp_get_num_threads() << " "
<< omp_get_max_threads() << std::endl;
}
}
#pragma omp barrier
#pragma omp single
{
std::cout << omp_get_max_active_levels() << " " << omp_get_num_threads() << " "
<< omp_get_max_threads() << std::endl;
}
}然后我得到了以下输出。
10 3 4
10 3 4
10 3 4
10 3 3我已经检查了正式文件,但我仍然对此感到困惑。
发布于 2019-12-22 03:26:07
来自文件:
omp_get_num_threads
--
omp_get_num_threads例程返回执行例程区域绑定到的parallel区域的团队中的线程数。如果从程序的顺序部分调用,则此例程返回1。
omp_get_max_threads
由
omp_get_max_threads返回的值是当前任务的nthreads ICV的第一个元素的值。如果在此例程执行返回后遇到没有num_threads子句的并行区域,则该值也是可用于组成一个新团队的线程数的上限。
下图说明了线程的流程。您的输出可能不正确,我不能用clang+libomp或gcc+libGOMP复制它。

如果没有同时指定线程数,omp_get_max_threads总是返回新的parallel构造可以创建的线程数。当在内部并行区域在omp_set_num_threads上设置4时,可以创建的新的不同线程的最大数量为4,但在该区域3中正在使用。对于外部平行区域,最大值为3,2在使用中。
在串行代码中,在任何实用程序中,线程数为1,但如果不通过omp_set_num_threads或OMP_NUM_THREADS环境变量更改,则最大线程数是系统的默认值(通常是内核数)。
https://stackoverflow.com/questions/59434959
复制相似问题