我想知道如何检查Linux远程计算机上的OpenMP版本?
我不知道它的安装位置。
答案 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。