如何获得在整个程序执行期间可能创建的最大 OpenMP 线程数?

Posted

技术标签:

【中文标题】如何获得在整个程序执行期间可能创建的最大 OpenMP 线程数?【英文标题】:How can I get the maximum number of OpenMP threads that may be created during the whole execution of the program? 【发布时间】:2016-05-18 18:35:37 【问题描述】:

我想创建一个全局对象数组(OpenMP 产生的每个可能线程一个对象)并在整个程序中重用它。每个线程将使用omp_get_thread_num 读取其编号并使用它来索引数组。

如何获取程序整个执行过程中可能创建的OpenMP线程的最大数量?

omp_get_max_threads 的文档说这个函数被指定返回一个特定于调用它的特定并行区域的值

omp_get_max_threads - 并行区域的最大线程数

说明:返回不使用子句 num_threads 的当前并行区域使用的最大线程数。

而MSDN documentation 的措辞暗示omp_get_max_threads 在并行区域之外返回的值与在任何其他点返回的值相同。

omp_get_max_threads

如果在代码中的该点定义了没有 num_threads 的并行区域,则返回一个等于或大于可用线程数的整数。

哪一个是正确的?

【问题讨论】:

【参考方案1】:

没有最大数量。

从技术上讲,OpenMP 定义了一个名为nthreads-var(参见OpenMP 4.5 2.3.3)的内部控制变量,它是默认线程数。你用omp_get_max_threads 阅读它,用omp_set_num_threads 设置它(一个不幸的命名故障),然后用一个显式的num_threads 子句覆盖它。

因此,您必须编写代码,使其能够处理意外数量的线程,例如通过将数组预定义为omp_get_num_threads() 并在更多线程到达时懒惰地调整它的大小。或者进行合理猜测并检查每次访问的索引范围。

【讨论】:

谢谢,所以我明白如果我保证在程序中永远不会调用omp_set_num_threads,我可以依赖omp_get_max_threads() 永远不会改变。对吗? 实际上,是的。但严格遵循标准,这是实现定义的。从 OpenMP 3.1 开始,nthreads-var 是一个列表 - 函数仅引用第一个元素。如果列表中有多个元素,则在嵌套区域中使用尾部。由于列表的初始化是由实现定义的,因此实现可以像[2,4] 一样初始化列表。我怀疑/希望这会发生。

以上是关于如何获得在整个程序执行期间可能创建的最大 OpenMP 线程数?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决可能的乘法溢出以获得正确的模数运算?

一文读懂Linux任务间调度原理和整个执行过程

如何阻止用户等待很长时间才能获得位置修复?

如何确保烧瓶应用程序已在所有路线上获得授权?

java 如何获得线程池中正在执行的线程数?

如何在.Net中获得最大允许的文件大小?