7namespace dr::mp::__detail {
9inline auto add_counts(rng::forward_range
auto &&r) {
10 rng::range_difference_t<
decltype(r)> zero{};
12 return std::accumulate(rng::begin(r), rng::end(r), zero);
15inline auto count_if_local(rng::forward_range
auto &&r,
auto &&pred) {
17 dr::drlog.debug(
" with DPL\n");
18#ifdef SYCL_LANGUAGE_VERSION
19 return std::count_if(mp::dpl_policy(),
26 dr::drlog.debug(
" with CPU\n");
27 return std::count_if(std::execution::par_unseq,
33template <dr::distributed_range DR>
34auto count_if(std::size_t root,
bool root_provided, DR &&dr,
auto &&pred) {
35 using count_type = rng::range_difference_t<
decltype(dr)>;
36 auto comm = mp::default_comm();
42 dr::drlog.debug(
"Parallel count\n");
45 auto count = [=](
auto &&r) {
46 assert(rng::size(r) > 0);
47 return count_if_local(r, pred);
49 auto locals = rng::views::transform(local_segments(dr), count);
50 auto local = add_counts(locals);
52 std::vector<count_type> all(comm.size());
55 comm.gather(local, std::span{all}, root);
56 if (root == comm.rank()) {
57 return add_counts(all);
63 comm.all_gather(local, all);
64 return add_counts(all);
74 template <
typename T, dr::distributed_range DR>
75 auto operator()(std::size_t root, DR &&dr,
const T &value)
const {
76 auto pred = [=](
auto &&v) {
return v == value; };
77 return __detail::count_if(root,
true, dr, pred);
80 template <
typename T, dr::distributed_range DR>
81 auto operator()(DR &&dr,
const T &value)
const {
82 auto pred = [=](
auto &&v) {
return v == value; };
83 return __detail::count_if(0,
false, dr, pred);
86 template <
typename T, dr::distributed_iterator DI>
87 auto operator()(std::size_t root, DI first, DI last,
const T &value)
const {
88 auto pred = [=](
auto &&v) {
return v == value; };
89 return __detail::count_if(root,
true, rng::subrange(first, last), pred);
92 template <
typename T, dr::distributed_iterator DI>
93 auto operator()(DI first, DI last,
const T &value)
const {
94 auto pred = [=](
auto &&v) {
return v == value; };
95 return __detail::count_if(0,
false, rng::subrange(first, last), pred);
103 template <dr::distributed_range DR>
104 auto operator()(std::size_t root, DR &&dr,
auto &&pred)
const {
105 return __detail::count_if(root,
true, dr, pred);
108 template <dr::distributed_range DR>
109 auto operator()(DR &&dr,
auto &&pred)
const {
110 return __detail::count_if(0,
false, dr, pred);
113 template <dr::distributed_iterator DI>
114 auto operator()(std::size_t root, DI first, DI last,
auto &&pred)
const {
115 return __detail::count_if(root,
true, rng::subrange(first, last), pred);
118 template <dr::distributed_iterator DI>
119 auto operator()(DI first, DI last,
auto &&pred)
const {
120 return __detail::count_if(0,
false, rng::subrange(first, last), pred);
Definition: onedpl_direct_iterator.hpp:15
Definition: count.hpp:101