【问题标题】:OpenMp: Best way to create an array with size of the number of threadsOpenMp:创建具有线程数大小的数组的最佳方法
【发布时间】:2020-04-13 18:04:02
【问题描述】:

具体我必须与 OpenMp 并行计算 pi。我只允许使用#omp 并行。所以我想创建一个具有进程数大小的数组,然后并行计算部分总和,然后一起计算总和。但不幸的是,不可能在并行版本之前获得线程数。那么创建一个非常大的数组并用 0.0 对其进行初始化然后一起计算所有内容的最佳方法是,还是有更好的方法?我会很感激每一个答案。提前谢谢!

【问题讨论】:

  • @HighPerformanceMark 我相信你的意思是omp_get_max_threads(),因为omp_get_num_threads() 在并行区域外调用时返回1

标签: c++ openmp


【解决方案1】:

好在提前获取线程数也不是不可能。 OpenMP 运行时不会简单地启动随机数量的线程,而不受程序员和程序用户的任何控制。相反,它遵循明确定义的机制来确定该数字,即described in detail in the OpenMP specification。具体来说,除非您使用 num_threads 提供了更高的固定线程数,否则 OpenMP 启动的线程数受称为 内部控制变量(简称 ICV)的特殊值的限制。 em>nthreads-var。设置此 ICV 的方法是通过 OMP_NUM_THREADS 环境变量或通过 omp_set_num_threads() 调用(后一种方法覆盖前者)。 nthreads-var 的值可以通过调用omp_get_max_threads() 来访问。对于其他 ICV,请参阅the specification

您需要做的就是调用omp_get_max_threads() 并使用返回值作为数组的大小,因为线程数不会超过该值,因为您没有使用更大的值调用omp_set_num_threads()之后并没有将num_threads 子句应用于parallel 构造。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 2017-04-24
    相关资源
    最近更新 更多