看起来 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 API 版本的映射如下:
{200505:'2.5',200805:'3.0',201107:'3.1',201307:'4.0'}`,其中每对是“_OPENMP的值:OpenMP API版本”。 - Trevor Boyd Smith_OPENMP
的另一个版本是 {201511: '4.5'}。 One more version for _OPENMP
is {201511: '4.5'}. - astroboylrx_OPENMP
中设置。 - jww#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
{201811,"5.0"}
- 请参见 https://github.com/jeffhammond/HPCInfo/blob/master/docs/Preprocessor-Macros.md - Paul Jurczak您需要使用以下命令检查您的 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++ | |
空白条目是因为我没有找到对应的信息。首先设置环境变量OMP_DISPLAY_ENV:
在bash中:
export OMP_DISPLAY_ENV="TRUE"
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版本的年份和月份。
实际上,我认为你不能直接获得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
OpenMP文档大大改进。您可以从此链接查找有关支持的OpenMP版本及相应编译器的更多信息。
回答您的问题,如上所述,请先找到gcc编译器版本,然后参考上面的链接以了解相应的OpenMP版本。
上面的链接还列出了不同编译器支持的OpenMP版本。
您可以通过运行一个简单的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
#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()
函数成员不同,此语句将不会抛出异常。
echo | clang -fopenmp -dM -E - | grep -i openmp
。 - lylhw13