使用omp_set_num_threads后,能否使OpenMP恢复为理想的线程数?

时间:2019-07-10 16:45:05

标签: c++ openmp

有没有一种方法可以使OpenMP将线程数(下次使用时)恢复为默认的 ,应用程序已经调用了{{1 }}有一个特定的数字?

例如,我提供给omp_set_num_threads()的特殊代码(例如0或-1)吗?

还是我应该尝试做类似omp_set_num_threads的事情?

我假设默认数字是OpenMP认为是“最佳”的任何实现。但是我不知道默认值是保证是什么,甚至应该保证是什么。我所知道的是,我有一个针对一个特定的OpenMP块调用omp_set_num_threads(omp_get_max_threads())的应用程序,现在我不能对其进行编辑。但我想防止该设置影响代码中的其他OpenMP块。

1 个答案:

答案 0 :(得分:3)

我以前有这个问题。 (免责声明:,我使用MSVC,目前仅实现OpenMP 2.0标准)。据我所知,OpenMP 2.0 standard中没有任何内容可以让您找出此默认值。不需要omp_get_max_threads()来返回它(所有后续的强调都是我的):

  

omp_get_max_threads函数返回一个整数,该整数保证至少与在没有{{的并行区域的情况下,用于组队的线程数一样大。 1}}子句将在代码中遇到。

换句话说,它可能返回一个大于当前设置(或默认值)的数字。

num_threads也没有特殊值:

  

omp_set_num_threads函数设置默认的线程数,以供后续未指定omp_set_num_threads子句的并行区域使用。 [...]参数num_threads的值必须为正整数

如果弄错了,则取决于实施情况:

  

如果在禁用动态调整线程数的过程中遇到并行区域,并且为并行区域请求的线程数超过,则运行时系统可以提供的数量程序的行为是实现定义的。例如,一种实现可能会中断程序的执行,或者可能会串行化并行区域。

您可能会在OpenMP实施的文档中找到更精确的信息(减少不安)。但是,对于MSVC,该文档只是OpenMP 2.0标准的逐字副本...


由于您正以这种方式修改线程数,因此我想提请注意MSVC中num_threadsomp_set_dynamic的交互:
Why does omp_set_dynamic(1) never adjust the number of threads (in Visual C++)?