如何在Linux上检查OpenMP版本

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

4
OpenMP已经内置于您的编译器中。我猜您应该检查编译器的版本并参考手册来检查OpenMP的版本。 - Vladimir Obrizan
如果您想使用clang检查OpenMP版本,可以使用echo | clang -fopenmp -dM -E - | grep -i openmp - lylhw13
8个回答

73

看起来 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版本的年份和月份。


有个有趣的故事:我花了很多时间试图找出如何以编程方式找到OpenMP的版本,但最终放弃并发布了这个答案。然后我注意到对于我的目的来说,这是无关紧要的,因为我想要的具体功能(taskyield)实际上在任何版本的gcc中都不受支持(正如上面引用的维基百科所指出的)。 - Brent Bradburn
8
为了快速参考(从http://openmp.org/wp/openmp-specifications/复制),`#define _OPENMP到 OPENMP API 版本的映射如下:{200505:'2.5',200805:'3.0',201107:'3.1',201307:'4.0'}`,其中每对是“_OPENMP的值:OpenMP API版本”。 - Trevor Boyd Smith
8
_OPENMP 的另一个版本是 {201511: '4.5'}。 One more version for _OPENMP is {201511: '4.5'}. - astroboylrx
1
似乎C/C++的OpenMP规范没有直接以编程方式完成这个操作的方法......" - 不正确。该值在宏_OPENMP中设置。 - jww
@jww:我在编辑后的答案中已经涵盖了这一点。我的理解是,这将返回一个参考日期,它是版本的间接表示,而不是版本本身。如果您想获得常用的版本号,仍然需要应用翻译。 - Brent Bradburn
Kitware/CMake/master/Modules/FindOpenMP.cmake中有一个CMake的自动映射,可能与FineOpenMP有关。 - Brent Bradburn

29
这是一个简短的C++11程序,用于显示您的OpenMP版本;它还涵盖了2021年11月发布的5.2版本。
#include <unordered_map>
#include <iostream>
#include <omp.h>

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

并使用以下命令进行编译:

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

对于声称支持4.5的ICL 16.0.3,它仍然报告4.0。 - tim18
对于VS2015.2,它不会产生任何输出。它主要是OpenMP 2.5,但没有定义_OPENMP。 - tim18
1
g++ 7.0 报告 4.5,5.3 报告 4.0。 - tim18
1
添加 {201811,"5.0"} - 请参见 https://github.com/jeffhammond/HPCInfo/blob/master/docs/Preprocessor-Macros.md - Paul Jurczak
1
{200203, "2.0"} 适用于 Visual Studio 2019(是的,真的) - Pavel Peřina

10

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

gcc -v

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++     |            |
空白条目是因为我没有找到对应的信息。

9

首先设置环境变量OMP_DISPLAY_ENV

在bash中:

export  OMP_DISPLAY_ENV="TRUE" 

或在类似csh的shell中:
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版本的年份和月份。


到目前为止,这里最简单的答案! - Rhubarb

3

实际上,我认为你不能直接获得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

3

OpenMP文档大大改进。您可以从链接查找有关支持的OpenMP版本及相应编译器的更多信息。

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

上面的链接还列出了不同编译器支持的OpenMP版本。


2

您可以通过运行一个简单的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编译它,或者像我一样使用mpicc,并添加标志-fopenmp


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接