繁体   English   中英

关闭OpenMP

[英]Turn off OpenMP

在我的C ++程序中,我想有时使用OpenMP运行其可执行文件,有时不使用OpenMP(即多线程或单线程)。 我正在考虑以下两种情况中我的代码如何使用OpenMP:

(1)假设我的代码只有#include <omp.h>和OpenMP指令。

(2)与(1)相同,我的代码进一步调用OpenMP函数,如omp_get_thread_num()

为了不为不同的运行提供不同的代码,是否使用一些自定义的预编译器变量来保护OpenMP出现在我的代码中的唯一方法是什么?

谢谢并恭祝安康!

您可以使用环境变量:

set OMP_NUM_THREADS=1

实际上,它不会关闭OpenMP。 它将强制OpenMP仅为应用程序创建一个线程。 它无需重新编译即可运行。 我使用此变量来测试1,2,3,4等线程的可伸缩性。

你最简单的方法是

omp_set_num_threads(m_iUseableProcessors);

其中m_iUseableProcessors是您要将计算拆分的处理器数。 没有OpenMP功能我不知道怎么做。 您可能#ifdef它们,但这会让您在编译时关闭OpenMP。

你可以把include包括如下:

#ifdef _OPENMP_
#include<omp.h> 
#endif

现在,如果你运行没有-fopenmp标志的程序,它将忽略openmp指令

除了_OPENMP的建议_OPENMP ,您可能会发现使用C99的_Pragma (或__pragma ,如果您使用某些C ++编译器 - 请参阅此StackOverflow问题以获取详细信息),以防止您的代码被#ifdef _OPENMP#endif #ifdef _OPENMP ,从而减少与条件编译相关的行3x,并以其他方式为O(1)控制OpenMP注释的O(n)实例。

例如,我在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM