在我的C ++程序中,我希望有时使用OpenMP运行其可执行文件,有时不使用OpenMP(即多线程或单线程)。我正在考虑以下两种情况中我的代码如何使用OpenMP:
(1)假设我的代码只有#include <omp.h>
和OpenMP指令。
(2)与(1)相同,我的代码进一步调用像omp_get_thread_num()
这样的OpenMP函数。
为了不为不同的运行设置不同的代码,使用一些自定义的预编译变量来保护OpenMP出现在我的代码中的唯一方法是什么?
谢谢和问候!
答案 0 :(得分:10)
您可以使用环境变量:
set OMP_NUM_THREADS=1
实际上,它不会关闭OpenMP。它将强制OpenMP仅为应用程序创建一个线程。它无需重新编译即可运行。我使用此变量来测试1,2,3,4等线程的可伸缩性。
答案 1 :(得分:3)
最简单的方法是
omp_set_num_threads(m_iUseableProcessors);
其中m_iUseableProcessors
是您要将计算拆分的处理器数。没有OpenMP功能我不知道怎么做。你可能会#ifdef
出来,但这会让你在编译时关闭OpenMP。
答案 2 :(得分:3)
您可以按如下方式输入:
#ifdef _OPENMP_
#include<omp.h>
#endif
现在,如果你运行没有-fopenmp标志的程序,它将忽略openmp指令
答案 3 :(得分:0)
除了_OPENMP
的建议外,您可能会发现使用C99的_Pragma
(或__pragma
非常有用,如果您使用的是某些C ++编译器 - 请参阅{{ 3}}以获取详细信息)以防止您的代码被#ifdef _OPENMP
和#endif
乱七八糟,从而将与条件编译相关的行减少3倍,并以其他方式对O(n)进行O(1)控制)OpenMP注释的实例。
例如,我在C99 OpenMP代码中使用以下样式。支持C ++的更改应该相当适度,尽管可能是编译器特定的(在这种情况下,像__GNUC__
,__clang__
,__INTEL_COMPILER
等宏可能很有用。)
#ifndef PRAGMA_OPENMP_H
#define PRAGMA_OPENMP_H
#if defined(_OPENMP) && ( __STDC_VERSION__ >= 199901L )
#define PRAGMA(x) _Pragma(#x)
#define OMP_PARALLEL PRAGMA(omp parallel)
#define OMP_PARALLEL_FOR PRAGMA(omp parallel for schedule(static))
#define OMP_FOR PRAGMA(omp for schedule(static))
#define OMP_PARALLEL_FOR_COLLAPSE(n) PRAGMA(omp parallel for collapse(n) schedule(static))
#define OMP_PARALLEL_FOR_COLLAPSE2 OMP_PARALLEL_FOR_COLLAPSE(2)
#define OMP_PARALLEL_FOR_COLLAPSE3 OMP_PARALLEL_FOR_COLLAPSE(3)
#define OMP_PARALLEL_FOR_COLLAPSE4 OMP_PARALLEL_FOR_COLLAPSE(4)
#define OMP_PARALLEL_FOR_REDUCE_ADD(r) PRAGMA(omp parallel for reduction (+ : r) schedule(static))
#else
#warning No OpenMP, either because compiler does not understand OpenMP or C99 _Pragma.
#define OMP_PARALLEL
#define OMP_PARALLEL_FOR
#define OMP_FOR
#define OMP_PARALLEL_FOR_COLLAPSE(n)
#define OMP_PARALLEL_FOR_COLLAPSE2
#define OMP_PARALLEL_FOR_COLLAPSE3
#define OMP_PARALLEL_FOR_COLLAPSE4
#define OMP_PARALLEL_FOR_REDUCE_ADD(r)
#endif
#endif // PRAGMA_OPENMP_H