Skip to content
Snippets Groups Projects
Commit 734245be authored by Uwe Schulzweida's avatar Uwe Schulzweida
Browse files

varray_range: added OpenMP pragma.

parent ef001c82
No related branches found
No related tags found
No related merge requests found
......@@ -50,7 +50,7 @@ template <typename T>
MinMax
varray_min_max_mv(const size_t len, const T *array, const T missval)
{
auto minmax_mv = [](const auto a, const auto mv_a, auto &vmin, auto &vmax, auto &nvals, auto is_EQ) {
auto f_minmax_mv = [](const auto a, const auto mv_a, auto &vmin, auto &vmax, auto &nvals, auto is_EQ) {
if (!is_EQ(a, mv_a))
{
vmin = min_value(vmin, a);
......@@ -64,9 +64,9 @@ varray_min_max_mv(const size_t len, const T *array, const T missval)
size_t nvals = 0;
if (std::isnan(missval))
for (size_t i = 0; i < len; ++i) minmax_mv(array[i], missval, vmin, vmax, nvals, dbl_is_equal);
for (size_t i = 0; i < len; ++i) f_minmax_mv(array[i], missval, vmin, vmax, nvals, dbl_is_equal);
else
for (size_t i = 0; i < len; ++i) minmax_mv(array[i], missval, vmin, vmax, nvals, is_equal);
for (size_t i = 0; i < len; ++i) f_minmax_mv(array[i], missval, vmin, vmax, nvals, is_equal);
return MinMax(vmin, vmax, nvals);
}
......@@ -370,8 +370,10 @@ varray_min(const size_t len, const Varray<T> &v)
auto vmin = v[0];
for (size_t i = 0; i < len; ++i)
vmin = min_value(vmin, v[i]);
#ifdef HAVE_OPENMP4
#pragma omp parallel for simd default(shared) schedule(static) reduction(min : vmin)
#endif
for (size_t i = 0; i < len; ++i) vmin = min_value(vmin, v[i]);
return vmin;
}
......@@ -390,8 +392,10 @@ varray_max(const size_t len, const Varray<T> &v)
auto vmax = v[0];
for (size_t i = 0; i < len; ++i)
vmax = max_value(vmax, v[i]);
#ifdef HAVE_OPENMP4
#pragma omp parallel for simd default(shared) schedule(static) reduction(max : vmax)
#endif
for (size_t i = 0; i < len; ++i) vmax = max_value(vmax, v[i]);
return vmax;
}
......@@ -411,6 +415,9 @@ varray_range(const size_t len, const Varray<T> &v)
auto vmin = v[0];
auto vmax = v[0];
#ifdef HAVE_OPENMP4
#pragma omp parallel for simd default(shared) schedule(static) reduction(min : vmin) reduction(max : vmax)
#endif
for (size_t i = 0; i < len; ++i)
{
vmin = min_value(vmin, v[i]);
......@@ -428,17 +435,32 @@ template <typename T>
T
varray_min_mv(const size_t len, const Varray<T> &v, const T missval)
{
auto f_min_mv = [](const auto a, const auto mv_a, auto &vmin, auto is_EQ) {
if (!is_EQ(a, mv_a)) vmin = min_value(vmin, a);
};
assert(len > 0);
assert(v.size() > 0);
assert(len <= v.size());
T vmin = std::numeric_limits<T>::max();
for (size_t i = 0; i < len; ++i)
if (!DBL_IS_EQUAL(v[i], missval))
vmin = min_value(vmin, v[i]);
if (std::isnan(missval))
{
#ifdef HAVE_OPENMP4
#pragma omp parallel for default(shared) schedule(static) reduction(min : vmin)
#endif
for (size_t i = 0; i < len; ++i) f_min_mv(v[i], missval, vmin, dbl_is_equal);
}
else
{
#ifdef HAVE_OPENMP4
#pragma omp parallel for default(shared) schedule(static) reduction(min : vmin)
#endif
for (size_t i = 0; i < len; ++i) f_min_mv(v[i], missval, vmin, is_equal);
}
if (IS_EQUAL(vmin, std::numeric_limits<T>::max())) vmin = missval;
if (is_equal(vmin, std::numeric_limits<T>::max())) vmin = missval;
return vmin;
}
......@@ -451,17 +473,32 @@ template <typename T>
T
varray_max_mv(const size_t len, const Varray<T> &v, const T missval)
{
auto f_max_mv = [](const auto a, const auto mv_a, auto &vmax, auto is_EQ) {
if (!is_EQ(a, mv_a)) vmax = max_value(vmax, a);
};
assert(len > 0);
assert(v.size() > 0);
assert(len <= v.size());
T vmax = -std::numeric_limits<T>::max();
for (size_t i = 0; i < len; ++i)
if (!DBL_IS_EQUAL(v[i], missval))
vmax = max_value(vmax, v[i]);
if (std::isnan(missval))
{
#ifdef HAVE_OPENMP4
#pragma omp parallel for default(shared) schedule(static) reduction(max : vmax)
#endif
for (size_t i = 0; i < len; ++i) f_max_mv(v[i], missval, vmax, dbl_is_equal);
}
else
{
#ifdef HAVE_OPENMP4
#pragma omp parallel for default(shared) schedule(static) reduction(max : vmax)
#endif
for (size_t i = 0; i < len; ++i) f_max_mv(v[i], missval, vmax, is_equal);
}
if (IS_EQUAL(vmax, -std::numeric_limits<T>::max())) vmax = missval;
if (is_equal(vmax, -std::numeric_limits<T>::max())) vmax = missval;
return vmax;
}
......@@ -474,6 +511,14 @@ template <typename T>
T
varray_range_mv(const size_t len, const Varray<T> &v, const T missval)
{
auto f_minmax_mv = [](const auto a, const auto mv_a, auto &vmin, auto &vmax, auto is_EQ) {
if (!is_EQ(a, mv_a))
{
vmin = min_value(vmin, a);
vmax = max_value(vmax, a);
}
};
assert(len > 0);
assert(v.size() > 0);
assert(len <= v.size());
......@@ -481,14 +526,22 @@ varray_range_mv(const size_t len, const Varray<T> &v, const T missval)
T vmin = std::numeric_limits<T>::max();
T vmax = -std::numeric_limits<T>::max();
for (size_t i = 0; i < len; ++i)
if (!DBL_IS_EQUAL(v[i], missval))
{
vmin = min_value(vmin, v[i]);
vmax = max_value(vmax, v[i]);
}
if (std::isnan(missval))
{
#ifdef HAVE_OPENMP4
#pragma omp parallel for default(shared) schedule(static) reduction(min : vmin) reduction(max : vmax)
#endif
for (size_t i = 0; i < len; ++i) f_minmax_mv(v[i], missval, vmin, vmax, dbl_is_equal);
}
else
{
#ifdef HAVE_OPENMP4
#pragma omp parallel for default(shared) schedule(static) reduction(min : vmin) reduction(max : vmax)
#endif
for (size_t i = 0; i < len; ++i) f_minmax_mv(v[i], missval, vmin, vmax, is_equal);
}
return (IS_EQUAL(vmin, std::numeric_limits<T>::max()) && IS_EQUAL(vmax, -std::numeric_limits<T>::max())) ? missval : vmax - vmin;
return (is_equal(vmin, std::numeric_limits<T>::max()) && is_equal(vmax, -std::numeric_limits<T>::max())) ? missval : vmax - vmin;
}
// Explicit instantiation
......@@ -513,6 +566,9 @@ varray_sum(const size_t len, const Varray<T> &v)
assert(len <= v.size());
double sum = 0.0;
#ifdef HAVE_OPENMP4
#pragma omp parallel for default(shared) schedule(static) reduction(+ : sum)
#endif
for (size_t i = 0; i < len; ++i) sum += v[i];
return sum;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment