Mantid
Loading...
Searching...
No Matches
ParallelMinMax.cpp
Go to the documentation of this file.
2
3#include <utility>
4#include <vector>
5
6namespace Mantid::Kernel {
7
8namespace {
13template <typename T> class MANTID_KERNEL_DLL MinMaxFinder {
14 std::vector<T> const *vec;
15
16public:
19
20 // copy min/max from the other. we're all friends
21 MinMaxFinder(MinMaxFinder<T> &other, tbb::split) : vec(other.vec), minval(other.minval), maxval(other.maxval) {}
22
23 // set the min=max=first element supplied
24 MinMaxFinder(std::vector<T> const *vec) : vec(vec), minval(vec->front()), maxval(vec->front()) {}
25
26 void operator()(tbb::blocked_range<size_t> const &range) {
27 const auto [minele, maxele] = std::minmax_element(vec->cbegin() + range.begin(), vec->cbegin() + range.end());
28 if (*minele < minval)
29 minval = *minele;
30 if (*maxele > maxval)
31 maxval = *maxele;
32 }
33
34 void join(MinMaxFinder<T> const &other) {
35 if (other.minval < minval)
36 minval = other.minval;
37 if (other.maxval > maxval)
38 maxval = other.maxval;
39 }
40};
41} // namespace
42
43template <typename T> std::pair<T, T> parallel_minmax(std::vector<T> const *const vec, size_t const grainsize) {
44 if (vec->size() < grainsize) {
45 const auto [minval, maxval] = std::minmax_element(vec->cbegin(), vec->cend());
46 return std::make_pair(*minval, *maxval);
47 } else {
48 MinMaxFinder<T> finder(vec);
49 tbb::parallel_reduce(tbb::blocked_range<size_t>(0, vec->size(), grainsize), finder);
50 return std::make_pair(finder.minval, finder.maxval);
51 }
52}
53
54template <typename T>
55std::pair<T, T> parallel_minmax(std::shared_ptr<std::vector<T>> const &vec, size_t const grainsize) {
56 return parallel_minmax<T>(vec.get(), grainsize);
57}
58
59template <typename T>
60std::pair<T, T> parallel_minmax(std::unique_ptr<std::vector<T>> const &vec, size_t const grainsize) {
61 return parallel_minmax<T>(vec.get(), grainsize);
62}
63
64#define EXPORTPARALLELMINMAX(type) \
65 template std::pair<type, type> MANTID_KERNEL_DLL parallel_minmax(std::shared_ptr<std::vector<type>> const &, \
66 size_t); \
67 template std::pair<type, type> MANTID_KERNEL_DLL parallel_minmax(std::unique_ptr<std::vector<type>> const &, size_t);
68
72
73#undef EXPORTPARALLELMINMAX
74
75} // namespace Mantid::Kernel
std::vector< T > const * vec
T maxval
#define EXPORTPARALLELMINMAX(type)
T minval
DLLExport std::string join(ITERATOR_TYPE begin, ITERATOR_TYPE end, const std::string &separator, typename std::enable_if<!(std::is_same< typename std::iterator_traits< ITERATOR_TYPE >::iterator_category, std::random_access_iterator_tag >::value)>::type *=nullptr)
Join a set or vector of (something that turns into a string) together into one string,...
Definition Strings.h:84
std::pair< T, T > parallel_minmax(std::vector< T > const *const vec, size_t const grainsize=1000)
parallel_minmax