Зависит от компилятора прагма OpenMP мин / макс редукция - PullRequest
1 голос
/ 19 февраля 2020

Мой код C ++ использует директивы OpenMP и должен компилироваться с G CC и Visual Studio 2019. Операторы минимального / максимального сокращения OpenMP были введены в OpenMP 3.1, но Visual Studio 2019 поддерживает только OpenMP 2.0 .

Я бы хотел, чтобы мой код возвращался к последовательному l oop в Visual Studio, но я понимаю, что препроцессор не может представлять условную прагму , например:

// 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]);
}

Есть ли способ достичь этого?

1 Ответ

2 голосов
/ 19 февраля 2020

Вы можете использовать _Pragma() из C ++ 11, чтобы получить функциональный макрос, который условно разрешает прагму:

#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]);
  }
}

, но я не выяснил, как сделать g cc примите в качестве аргумента что угодно, кроме литеральной строки, чтобы разрешить использование произвольной переменной - даже оператор строкового преобразования препроцессора не работает, то есть вы могли бы просто использовать

#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]);
}
...