如何获得在整个程序执行期间可能创建的最大 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 线程数?的主要内容,如果未能解决你的问题,请参考以下文章