38 lines
984 B
C++
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
|