如何检查Linux上的OpenMP版本

js5cn81o  于 2023-03-07  发布在  Linux
关注(0)|答案(8)|浏览(581)

我想知道如何在Linux远程机器上检查OpenMP的版本?
我也不知道安装在哪里。

sczxawaw

sczxawaw1#

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

gcc --version ## get compiler version

对于GCC,这是一个很好的资源(没有提到GCC的最新版本):http://gcc.gnu.org/wiki/openmp
从GCC 4.2开始,编译器实现OpenMP标准的2.5版,从GCC 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版本号之间的Map。
在支持预处理器的实现中,_OPENMP宏名称被定义为具有十进制值yyyymm,其中yyyy和mm是实现支持的OpenMP API版本的年和月标识。

w7t8yxp5

w7t8yxp52#

这里有一个简短的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
sg24os4d

sg24os4d3#

您需要使用以下命令检查gcc版本

gcc --version

然后查看下表(不完整)(其信息来自OpenMP官方网站的this Wiki articlethis 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++     |            |

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

wi3ka0sx

wi3ka0sx4#

首先设置环境变量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版本的年份和月份名称。

olqngx59

olqngx595#

OpenMP文档改进了很多。你可以从this链接找到更多关于支持的OpenMP版本对应的编译器的信息。
回到您的问题,如上所述,首先找到gcc编译器版本,然后参考上面的链接了解相应的OpenMP版本。
上面的链接还提供了不同编译器中支持的OpenMP版本。

0tdrvxhp

0tdrvxhp6#

实际上,我认为你不能直接得到openmp的版本,但是编译器会使用一个预定义的宏_OPENMP来表示openmp的发布日期,你应该指定-fopenmp选项来使用这个宏。
您可以先使用shell命令获取openmp的发布日期,如下所示

echo _OPENMP | gcc -fopenmp -E -x c - | tail -1

至于我的gcc,它是

201511

然后你可以查看openmp的发布历史(https://www.openmp.org/news/press-releases/)来获得版本,201511的意思是2015年11月,版本是openmp 4.5
发布历史记录如下:

Date        Version
----------------------
Nov 2021    OpenMP 5.2
Nov 2020    OpenMP 5.1
Nov 2018    OpenMP 5.0
Nov 2015    OpenMP 4.5
Jul 2013    OpenMP 4.0
Jul 2011    OpenMP 3.1
May 2008    OpenMP 3.0
May 2005    OpenMP 2.5
Mar 2002    C/C++ 2.0
Nov 2000    Fortran 2.0
Nov 1999    Fortran 1.1
Oct 1998    C/C++ 1.0
Oct 1997    Fortran 1.0
nfzehxib

nfzehxib7#

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

to94eoyn

to94eoyn8#

你可以通过运行一个简单的C程序来检查它:

#include <stdio.h>
#include <omp.h>

int main() {
  #ifdef _OPENMP
    printf("OpenMP version: %d\n", _OPENMP);
  #else
    printf("No OpenMP support\n");
  #endif
  return 0;
}

然后用GCC编译它,或者像我的例子一样,通过添加标志-fopenmp来编译它

相关问题