Распараллеливание OMP не работает в вариационном классе CRTP - PullRequest
0 голосов
/ 02 октября 2018

У меня проблема кодирования с базовым классом CRTP, который предоставляет функцию, которая вызывается в цикле в производном классе

template<typename Derived>
class Func
{
public:
  double func(int i)
  {
    return pow(i + 1, 2.5);
  }
};

template<template<typename> typename... Args>
class Loop : public Args<Loop<Args...>>...
{
public:
  static const size_t N = 100000000;
  std::array<double, N> _array;

  void loop()
  {
#pragma omp parallel for schedule(static)
    for (int i = 0; i < N; i++)
    {
      _array[i] = func(i);
    }
  }
};

(в этом примере crtp не нужен, но в моем коде),Компилируя это в Visual Studio 2017 с / MD / MP / O2 / Oi / Ot / fp: точный / D NDEBUG / openmp / GL Флагирует цикл не распараллеливается, тогда как когда я пропускаю шаблон с переменным числом *

class Loop2 : public Func<Loop<Func>>
{
public:
  static const size_t N = 100000000;
  std::array<double, N> _array;

  void loop()
  {
#pragma omp parallel for schedule(static)
    for (int i = 0; i < N; i++)
    {
        _array[i] = func(i);
    }
  }
};

цикл работает параллельно.Можно ли сохранить комфортность шаблона вариации и распараллеливания цикла?

Редактировать: используя Clang с Visual Studio в качестве компилятора, оба цикла распараллеливаются

...