Distributed Ranges
Loading...
Searching...
No Matches
for_each.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <sycl/sycl.hpp>
8
9#include <dr/detail/sycl_utils.hpp>
10#include <dr/sp/algorithms/execution_policy.hpp>
11#include <dr/sp/detail.hpp>
12#include <dr/sp/init.hpp>
13#include <dr/sp/util.hpp>
14#include <dr/sp/zip_view.hpp>
15
16namespace dr::sp {
17
18template <typename ExecutionPolicy, dr::distributed_range R, typename Fn>
19void for_each(ExecutionPolicy &&policy, R &&r, Fn &&fn) {
20 static_assert( // currently only one policy supported
21 std::is_same_v<std::remove_cvref_t<ExecutionPolicy>, device_policy>);
22
23 std::vector<sycl::event> events;
24
25 for (auto &&segment : dr::ranges::segments(r)) {
26 auto &&q = __detail::queue(dr::ranges::rank(segment));
27
28 assert(rng::distance(segment) > 0);
29
30 auto local_segment = __detail::local(segment);
31
32 auto first = rng::begin(local_segment);
33
34 auto event = dr::__detail::parallel_for(
35 q, sycl::range<>(rng::distance(local_segment)),
36 [=](auto idx) { fn(*(first + idx)); });
37 events.emplace_back(event);
38 }
39 __detail::wait(events);
40}
41
42template <typename ExecutionPolicy, dr::distributed_iterator Iter, typename Fn>
43void for_each(ExecutionPolicy &&policy, Iter begin, Iter end, Fn &&fn) {
44 for_each(std::forward<ExecutionPolicy>(policy), rng::subrange(begin, end),
45 std::forward<Fn>(fn));
46}
47
48template <dr::distributed_range R, typename Fn> void for_each(R &&r, Fn &&fn) {
49 for_each(dr::sp::par_unseq, std::forward<R>(r), std::forward<Fn>(fn));
50}
51
52template <dr::distributed_iterator Iter, typename Fn>
53void for_each(Iter begin, Iter end, Fn &&fn) {
54 for_each(dr::sp::par_unseq, begin, end, std::forward<Fn>(fn));
55}
56
57template <typename ExecutionPolicy, dr::distributed_iterator Iter,
58 std::integral I, typename Fn>
59Iter for_each_n(ExecutionPolicy &&policy, Iter begin, I n, Fn fn) {
60 auto end = begin;
61 rng::advance(end, n);
62 for_each(std::forward<ExecutionPolicy>(policy), begin, end,
63 std::forward<Fn>(fn));
64 return end;
65}
66
67template <dr::distributed_iterator Iter, std::integral I, typename Fn>
68Iter for_each_n(Iter &&r, I n, Fn fn) {
69 return for_each_n(dr::sp::par_unseq, std::forward<Iter>(r), n, fn);
70}
71
72} // namespace dr::sp
Definition: concepts.hpp:31