У меня проблема кодирования с базовым классом 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 в качестве компилятора, оба цикла распараллеливаются