我想创建一个全局对象数组(每个可能的线程由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的并行区域时可用的线程数。
哪一个是正确的?
答案 0 :(得分:2)
没有最大数量。
从技术上讲,OpenMP定义了一个名为nthreads-var
的内部控制变量(参见OpenMP 4.5 2.3.3),它是默认的线程数。您使用omp_get_max_threads
阅读它,使用omp_set_num_threads
(一个不幸的命名故障)进行设置,并使用明确的num_threads
子句覆盖它。
因此,您必须编写代码,以便能够处理意外数量的线程,例如:通过将数组预定义到omp_get_num_threads()
并在更多线程到达时懒洋洋地调整它。或者采取合理的猜测并检查每次访问的索引范围。