如何检查Linux上的OpenMP版本

时间:2009-08-20 06:44:29

标签: linux gcc version openmp

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

我不知道它的安装位置。

6 个答案:

答案 0 :(得分:47)

似乎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版本的年和月指定。

答案 1 :(得分:13)

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

#include <unordered_map>
#include <cstdio>
#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"}};
  printf("We have OpenMP %s.\n", map.at(_OPENMP).c_str());
  return 0;
}

并使用以下命令编译:

g++ -std=c++11 -fopenmp foobar.cpp

答案 2 :(得分:4)

您需要使用

检查gcc版本
gcc --version

然后查看下面的(不完整)表格(其信息来自this Wiki article和来自OpenMP官方网站的this webpage):

| 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++     |            |

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

答案 3 :(得分:1)

第一个设置环境变量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版本的年和月指定。

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

这是上面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