在没有它的机器上忽略OpenMP

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

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

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

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

因此,您不必担心,如果您可以使用它,它将始终像strcmp这样的函数。 为了确保他们拥有CRT,您可以安装visual studio可再发行组件。

编辑:

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

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

 #if defined(_OPENMP) #pragma omp ... #endif 

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

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

因此,您只需要一个要链接到的openmp.h的副本。 这是一个: http : //cms.mcc.uiuc.edu/qmcdev/docs/html/OpenMP_8h-source.html 。

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

 #if defined(ENABLE_OPENMP) #include  #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 

在最坏的情况下,您可以将这三行放入虚拟的openmp.h文件中,然后使用它。 剩下的就行了。

我喜欢另一种方法,从Bisqwit借来的:

 #if defined(_OPENMP) #include  extern const bool parallelism_enabled = true; #else extern const bool parallelism_enabled = false; #endif 

然后,启动您的OpenMP并行for循环,如下所示:

 #pragma omp parallel for if(parallelism_enabled) 

注意:没有使用pragma是有正当理由的,这是非标准的,因此谷歌和其他人不支持它。