5

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

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

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

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

谢谢并恭祝安康!

4

4 回答 4

12

您可以使用环境变量:

set OMP_NUM_THREADS=1

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

于 2009-09-02T13:32:24.723 回答
5

嗨,最简单的方法是

omp_set_num_threads(m_iUseableProcessors);

m_iUseableProcessors您要拆分计算的处理器数量在哪里。如果没有 OpenMP 功能,我不知道该怎么做。您可能会将#ifdef它们排除在外,但这会使您在编译时关闭 OpenMP。

于 2009-08-31T14:33:46.517 回答
3

您可以将包含如下:

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

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

于 2010-03-03T22:04:40.173 回答
0

除了 的建议之外_OPENMP,您可能会发现使用 C99 _Pragma(或者__pragma,如果您使用一些 C++ 编译器 - 有关详细信息,请参阅此 StackOverflow 问题)来防止您的代码被#ifdef _OPENMP和乱扔#endif,从而减少与条件编译相关的行数很有用3 倍,否则让您 O(1) 控制 O(n) 个 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
于 2015-04-06T21:15:31.197 回答