【问题标题】:Compiler-dependent OpenMP min/max reduction pragma依赖于编译器的 OpenMP 最小/最大缩减编译指示
【发布时间】:2020-02-19 09:32:59
【问题描述】:

我的 C++ 代码使用 OpenMP 指令,需要使用 GCC 和 Visual Studio 2019 进行编译。 OpenMP 3.1 中引入了 OpenMP 最小/最大缩减运算符,但 Visual Studio 2019 only supports OpenMP 2.0

我希望我的代码在 Visual Studio 下恢复为串行循环,但我理解 the preprocessor cannot represent a conditional pragma 是这样的:

// invalid use of preprocessor:
#ifdef _MSC_VER
#define OMP_MIN(expr)
#else
#define OMP_MIN(expr) #pragma omp parallel for reduction(min:(expr))
#endif

double x = 10.0;

OMP_MIN(x)
for (int i = 0; i < array_size; i++) {
    x = fmin(x, array[i]);
}

有没有办法做到这一点?

【问题讨论】:

  • 您可以尝试在两个不同的函数(串行循环,OpenMP循环)中提取循环部分,并根据这两个函数描述您的定义
  • 确实如此,但由于我有几个这样的循环,因此需要大量重构以避免重复代码。

标签: c++ visual-c++ openmp


【解决方案1】:

您可以使用 C++11 中的 _Pragma() 来创建一个类似函数的宏,以有条件地启用编译指示:

#include <cmath>

#ifdef _MSC_VER
#define OMP_MINX()
#else
#define OMP_MINX() _Pragma("omp parallel for reduction(min:x)")
#endif

int main() {
  double x = 10.0;
  double array[50];
  int array_size = 50;

  OMP_MINX()
  for (int i = 0; i < array_size; i++) {
    x = std::fmin(x, array[i]);
  }
}

但我还没有弄清楚如何让 gcc 接受除文字字符串以外的任何参数,以允许使用任意变量 - 甚至预处理器的字符串化运算符也不起作用,这意味着您不妨使用

#ifndef _MSC_VER
#pragma omp parallel for reduction(min:x)
#endif
for (int i = 0; i < array_size; i++) {
  x = std::fmin(x, array[i]);
}

【讨论】:

  • _Pragma() 对我来说是新的,我想知道它是否是为了解决这种类型的用例而添加的?我找不到太多关于它的信息。无论如何,我已经选择了你的第二种选择,谢谢。
【解决方案2】:

您可以使用https://gcc.gnu.org/onlinedocs/cpp/Pragmas.html 中解释的DO_PRAGMA() 宏习语。

#define DO_PRAGMA(x) _Pragma (#x)

#ifdef _MSC_VER
#define OMP_MINX(expr)
#else
#define OMP_MINX(expr) DO_PRAGMA(omp parallel for reduction(min: expr))
#endif

如果_MSC_VER 未定义,OMP_MINX(x) 将扩展为所需的#pragma omp parallel for reduction(min: x)expr 首先展开,然后 DO_PRAGMA() 的整个参数在应用 _Pragma() 运算符之前被字符串化。这是 OP 要求的。

解决方案的灵感来自这个答案: How to concatenate strings in the arguments of _Pragma

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多