7#include <sycl/sycl.hpp>
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>
18template <
typename ExecutionPolicy, dr::distributed_range R,
typename Fn>
19void for_each(ExecutionPolicy &&policy, R &&r, Fn &&fn) {
21 std::is_same_v<std::remove_cvref_t<ExecutionPolicy>, device_policy>);
23 std::vector<sycl::event> events;
25 for (
auto &&segment : dr::ranges::segments(r)) {
26 auto &&q = __detail::queue(dr::ranges::rank(segment));
28 assert(rng::distance(segment) > 0);
30 auto local_segment = __detail::local(segment);
32 auto first = rng::begin(local_segment);
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);
39 __detail::wait(events);
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));
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));
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));
58 std::integral I,
typename Fn>
59Iter for_each_n(ExecutionPolicy &&policy, Iter begin, I n, Fn fn) {
62 for_each(std::forward<ExecutionPolicy>(policy), begin, end,
63 std::forward<Fn>(fn));
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);
Definition: concepts.hpp:31