在没有它的机器上忽略OpenMP

Tim*_*Tim 29 c c++ ignore openmp

我有一个使用OpenMP的C++程序,它将运行在可能安装或未安装OpenMP的几台机器上.

如果机器没有OpenMP并忽略那些#include <omp.h>,OpenMP指令(如#pragma omp parallel ...)和/或库函数(如tid = omp_get_thread_num();),我怎么能知道我的程序?

And*_*lke 61

OpenMP编译添加预处理器定义"_OPENMP",因此您可以执行以下操作:

#if defined(_OPENMP)
   #pragma omp ...
#endif
Run Code Online (Sandbox Code Playgroud)

有关示例,请参阅http://bisqwit.iki.fi/story/howto/openmp/#Discussion以及后面的代码.

  • 虽然如此,如果一个人喜欢在没有警告的情况下进行编译,即使在-Wall下,那么像"警告:未知的pragma忽略"这样的编译器消息将会很烦人. (10认同)
  • 没有必要保护#pragma omp,因为这样的pragma不是侵入性的(在未激活openmd时安全地跳过). (7认同)
  • 关于编译警告,我出于这个原因使用`-Wno-unknown-pragmas`进行编译.问题:可能会影响项目中的其他编译指示并删除有用的警告. (2认同)
  • 这个if-block对于隐藏函数调用很有用,比如omp_set_num_threads()或omp_get_thread_num().`#if defined(_OPENMP)tid = omp_get_thread_num(); #else tid = 0; #endif` (2认同)

Bro*_*ses 21

编译器应该忽略#pragma他们不理解的指令; 这就是语法的重点.并且定义的函数在openmp.h非并行系统上具有简单明确的含义 - 特别是,头文件将检查编译器是否定义ENABLE_OPENMP,如果未启用,则提供正确的回退.

所以,您只需要openmp.h链接的副本即可.这是一个:http://cms.mcc.uiuc.edu/qmcdev/docs/html/OpenMP_8h-source.html.

但是,代码的相关部分就是这样:

#if defined(ENABLE_OPENMP)
#include <omp.h>
#else
typedef int omp_int_t;
inline omp_int_t omp_get_thread_num() { return 0;}
inline omp_int_t omp_get_max_threads() { return 1;}
#endif
Run Code Online (Sandbox Code Playgroud)

在最坏的情况下,你可以把这三行放在一个虚拟openmp.h文件中,并使用它.剩下的就行了.

  • "#pragma"语义的+1.-1表示`ENABLE_OPENMP`,不符合标准.请改用"_OPENMP". (12认同)

gbj*_*anb 0

OpenMP 是编译器运行时的东西,而不是平台的东西。

IE。如果您使用 Visual Studio 2005 或更高版本编译应用程序,则您始终可以使用 OpenMP,因为运行时支持它。(如果最终用户没有安装 Visual Studio C 运行时,那么您的应用程序将根本无法运行)。

所以,你不用担心,如果你能使用它,它就会像strcmp这样的函数一样一直存在。为了确保他们有 CRT,然后您可以安装 Visual Studio Redistributable。

编辑:

好的,但是 GCC 4.1 将无法编译您的 openMP 应用程序,因此问题不在于目标机器,而在于目标编译器。由于所有编译器都有提供其版本的预定义宏,因此请使用 #ifdef 块包装 OpenMP 调用。例如,GCC使用3个宏来标识编译器版本,__GNUC__, __GNUC_MINOR__ and __GNUC_PATCHLEVEL__

  • -1:编译器版本完全不够。编译器和运行时都必须支持 openmp _并且_它也必须_启用_。相同的编译器版本可能在一台计算机上支持 openmp,而在另一台计算机上不支持。 (3认同)