我想知道如何在 Linux 远程机器上检查 OpenMP 的版本?
我也不知道它安装在哪里。
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 版本的年份和月份名称。
这是一个简短的 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
首先设置环境变量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 版本的年份和月份名称。
您需要检查您的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++ | |
空白条目在那里,因为我没有找到相应的信息。
OpenMP 文档改进了很多。您可以从此链接中找到有关支持的 OpenMP 版本对应编译器的更多信息。
来到你的问题,如上所述首先找到gcc编译器版本,然后参考上面的链接了解对应的OpenMP版本。
上面的链接还具有不同编译器中支持的 OpenMP 版本。
这是上面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。