pfor/src/pfor/strategies/openmp.h

38 lines
984 B
C++

#ifndef PFOR_PFOR_STRATEGIES_OPENMP_H
#define PFOR_PFOR_STRATEGIES_OPENMP_H
#include <cstdint>
#include "parameters.h"
namespace pfor {
template<bool, typename, typename> struct ForLoopOMP;
template<typename E, typename Range>
struct ForLoopOMP<false, E, Range> {
static void eval(Range const& range, E e) {
if(range.step() > 0)
for(auto it = +range.begin(); it < range.end(); it += range.step()) e[it];
else
for(auto it = +range.begin(); it > range.end(); it += range.step()) e[it];
}
};
template<typename E, typename Range>
struct ForLoopOMP<true, E, Range> {
static void eval(Range const& range, E e) {
if(range.step() > 0) {
#pragma omp parallel for num_threads(ParallelForParameters::nThreads)
for(auto it = +range.begin(); it < range.end(); it += range.step()) e[it];
} else {
#pragma omp parallel for num_threads(ParallelForParameters::nThreads)
for(auto it = +range.begin(); it > range.end(); it += range.step()) e[it];
}
}
};
}
#endif