50

我想知道如何在 Linux 远程机器上检查 OpenMP 的版本?

我也不知道它安装在哪里。

4

6 回答 6

69

OpenMP 的 C/C++ 规范似乎没有提供以编程方式执行此操作的直接方法。所以你必须检查你的编译器版本的文档。

gcc --version ## get compiler version

对于 GCC,这是一个很好的资源(没有提到最新版本的 GCC):http ://gcc.gnu.org/wiki/openmp :

从 GCC 4.2 开始,编译器实现了 OpenMP 标准的 2.5 版,从 4.4 开始,它实现了 OpenMP 标准的 3.0 版。自 GCC 4.7 起支持 OpenMP 3.1。


编辑

经过一番努力,我得到了以下工作。它至少给出了 OpenMP 版本的指示——尽管它仍然需要您查找某些内容。

$ echo |cpp -fopenmp -dM |grep -i open
#define _OPENMP 200805

您可以访问此处 ( http://www.openmp.org/specifications/ ) 以了解提供的日期与实际 OpenMP 版本号之间的映射。

在支持预处理器的实现中,_OPENMP 宏名称被定义为具有十进制值 yyyymm,其中 yyyy 和 mm 是实现支持的 OpenMP API 版本的年份和月份名称。

于 2012-11-28T19:05:14.457 回答
27

这是一个简短的 C++11 程序,用于显示您的 OpenMP 版本;它还涵盖了 2020 年 11 月发布的 5.1 版。

#include <unordered_map>
#include <iostream>
#include <omp.h>

int main(int argc, char *argv[])
{
  std::unordered_map<unsigned,std::string> map{
    {200505,"2.5"},{200805,"3.0"},{201107,"3.1"},{201307,"4.0"},{201511,"4.5"},{201811,"5.0"},{202011,"5.1"}};
  std::cout << "We have OpenMP " << map.at(_OPENMP) << ".\n";
  return 0;
}

并编译它:

g++ -std=c++11 -fopenmp foobar.cpp
于 2015-12-16T21:55:35.403 回答
9

首先设置环境变量OMP_DISPLAY_ENV:在 bash 中:

export  OMP_DISPLAY_ENV="TRUE" 

或在类似 csh 的外壳中:

setenv OMP_DISPLAY_ENV TRUE

然后编译并运行您的 OpenMP 程序:

./a.out

会有额外的信息,比如:

OPENMP DISPLAY ENVIRONMENT BEGIN
  _OPENMP = '201511'
  OMP_DYNAMIC = 'FALSE'
  OMP_NESTED = 'FALSE'
  OMP_NUM_THREADS = '8'
  OMP_SCHEDULE = 'DYNAMIC'
  OMP_PROC_BIND = 'FALSE'
  OMP_PLACES = ''
  OMP_STACKSIZE = '0'
  OMP_WAIT_POLICY = 'PASSIVE'
  OMP_THREAD_LIMIT = '4294967295'
  OMP_MAX_ACTIVE_LEVELS = '2147483647'
  OMP_CANCELLATION = 'FALSE'
  OMP_DEFAULT_DEVICE = '0'
  OMP_MAX_TASK_PRIORITY = '0'
OPENMP DISPLAY ENVIRONMENT END

其中 _OPENMP 有 8 个十进制值 yyyymm 其中 yyyy 和 mm 是实现支持的 OpenMP API 版本的年份和月份名称。

于 2018-12-11T19:46:51.607 回答
9

您需要检查您的gcc版本使用

gcc --version

然后查看下面的(不完整的)表格(其信息来自此 Wiki 文章和来自OpenMP 官方网站的此网页):

| gcc version | OpenMP version |    Languages    | Offloading |
|-------------|----------------|-----------------|------------|
|    4.2.0    |       2.5      |        C        |            |
|    4.4.0    |       3.0      |        C        |            |
|    4.7.0    |       3.1      |        C        |            |
|    4.9.0    |       4.0      |      C, C++     |            |
|    4.9.1    |       4.0      | C, C++, Fortran |            |
|      5      |                |                 |     Yes    |
|     6.1     |       4.5      |      C, C++     |            |

空白条目在那里,因为我没有找到相应的信息。

于 2017-10-27T11:23:44.610 回答
2

OpenMP 文档改进了很多。您可以从此链接中找到有关支持的 OpenMP 版本对应编译器的更多信息。

来到你的问题,如上所述首先找到gcc编译器版本,然后参考上面的链接了解对应的OpenMP版本。

上面的链接还具有不同编译器中支持的 OpenMP 版本。

于 2019-12-24T04:29:32.850 回答
1

这是上面user2023370答案的一个更安全的版本。为简洁起见,省略了古老的 OpenMP 版本:

#include <map>
#include <fmt/format.h>
using namespace std;
...
fmt::print("OpenMP v{}\n", map<int, string>{{200805, "3.0"},{201107, "3.1"}, {201307, "4.0"}, {201511, "4.5"}, {201811, "5.0"}}[_OPENMP]);

如果遇到新版本号或损坏的版本号,则该语句不会抛出异常,而不是使用at()函数成员。

版本号来自https://github.com/jeffhammond/HPCInfo/blob/master/docs/Preprocessor-Macros.md

于 2020-11-10T11:22:30.957 回答