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以及后面的代码.
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文件中,并使用它.剩下的就行了.
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__