1#ifndef KOKKOS_EXECUTION_PARALLEL_FOR_HPP
2#define KOKKOS_EXECUTION_PARALLEL_FOR_HPP
4#include "Kokkos_Macros.hpp"
5#ifdef KOKKOS_ENABLE_EXPERIMENTAL_CXX20_MODULES
6import kokkos.core_impl;
21template <
typename Data>
23 typename Data::functor_t;
24 typename Data::policy_or_iter_space_t;
25 typename Data::properties_t;
28 requires stdexec::__is_instance_of<typename Data::properties_t, properties>;
29 requires requires(
const Data& data) {
30 { data.functor } -> std::same_as<const typename Data::functor_t&>;
31 { data.policy_or_iter_space } -> std::same_as<const typename Data::policy_or_iter_space_t&>;
38template <stdexec::sender Sndr, Impl::parallel_for_data Data>
45 template <
typename Label,
typename Functor,
typename ExecPolicy>
47 constexpr auto operator()(Label&&
label, ExecPolicy&& policy, Functor&& functor)
const STDEXEC_AUTO_RETURN(
50 std::forward<ExecPolicy>(policy),
51 std::forward<Functor>(functor),
54 template <typename Functor, typename ExecPolicyOrIterSpace>
57 operator()(ExecPolicyOrIterSpace&& policy_or_iter_space, Functor&& functor)
const STDEXEC_AUTO_RETURN(
60 std::forward<ExecPolicyOrIterSpace>(policy_or_iter_space),
61 std::forward<Functor>(functor)))
63 template <
typename Label,
typename Functor, std::
integral T>
65 constexpr auto operator()(Label&&
label,
const T work_count, Functor&& functor)
const STDEXEC_AUTO_RETURN(
69 std::forward<Functor>(functor),
72 template <typename Functor, std::integral T>
73 constexpr auto operator()(
const T work_count, Functor&& functor)
const STDEXEC_AUTO_RETURN(
75 template <
typename Functor,
typename ExecPolicyOrIterSpace,
typename... Properties>
77 std::remove_cvref_t<Functor>,
78 std::remove_cvref_t<ExecPolicyOrIterSpace>,
79 std::remove_cvref_t<Properties>...
82 template <stdexec::sender Sndr,
typename Functor,
typename ExecPolicyOrIterSpace,
typename... Properties>
86 ExecPolicyOrIterSpace&& policy_or_iter_space,
88 Properties&&... properties)
const
94 std::forward<Properties>(properties)...,
95 std::forward<Functor>(functor),
96 std::forward<ExecPolicyOrIterSpace>(policy_or_iter_space)},
97 std::forward<Sndr>(sndr)
100 template <stdexec::sender Sndr, typename Label, typename Functor, typename ExecPolicyOrIterSpace>
105 operator()(Sndr&& sndr, Label&&
label, ExecPolicyOrIterSpace&& policy_or_iter_space, Functor&& functor) const
106 STDEXEC_AUTO_RETURN(this->operator()(
107 std::forward<Sndr>(sndr),
108 std::forward<ExecPolicyOrIterSpace>(policy_or_iter_space),
109 std::forward<Functor>(functor),
110 Impl::Label{std::forward<Label>(
label)}))
115template <
typename Functor, execution_policy_or_iteration_space ExecPolicyOrIterSpace,
typename... Properties>
125 template <
typename Self,
typename UnaryOp>
133 std::invoke_result_t<UnaryOp,
decltype(stdexec::__forward_like<Self>(self.policy_or_iter_space))>
136 >{stdexec::__forward_like<Self>(detail::as_base<Properties>(self))...,
137 stdexec::__forward_like<Self>(self.functor),
138 std::forward<UnaryOp>(unary_op)(stdexec::__forward_like<Self>(self.policy_or_iter_space))})
142template <stdexec::sender Sndr, Impl::parallel_for_data Data>
152 using base_t = stdexec::__tuple<parallel_for_t, __data_t, Sndr>;
156 template <stdexec::receiver Rcvr>
159 template <stdexec::receiver Rcvr>
160 constexpr auto connect(Rcvr)
const & =
delete;
165 stdexec::__get<idx_sndr>(
static_cast<const base_t&
>(*
this)))
#define KOKKOS_EXECUTION_COMPL_SIGS_ADD(_decayed_self_type_, _sndr_type_,...)
Constrain the accepted label types.
#define KOKKOS_EXECUTION_IMPL_FORWARDING_ATTRIBUTES_GET_ENV(_type_, _obj_)
#define KOKKOS_EXECUTION_RETURNS_BRACED(_type_,...)
Define a function by returning a list-initialized object of an explicit type.
constexpr auto make_iter_space(const T work_count) noexcept -> Kokkos::dims< 1, T >
Make a valid iteration space from a work count.
consteval Impl::Label< std::string_view > label(std::string_view str) noexcept
constexpr parallel_for_t parallel_for
properties< Properties... > properties_t
policy_or_iter_space_t policy_or_iter_space
ExecPolicyOrIterSpace policy_or_iter_space_t
constexpr auto transform_policy_or_iter_space(this Self &&self, UnaryOp &&unary_op) noexcept(noexcept(ParallelForData< functor_t, std::remove_cvref_t< std::invoke_result_t< UnaryOp, decltype(stdexec::__forward_like< Self >(self.policy_or_iter_space))> >, Properties... >{stdexec::__forward_like< Self >(detail::as_base< Properties >(self))..., stdexec::__forward_like< Self >(self.functor), std::forward< UnaryOp >(unary_op)(stdexec::__forward_like< Self >(self.policy_or_iter_space))})) -> decltype(ParallelForData< functor_t, std::remove_cvref_t< std::invoke_result_t< UnaryOp, decltype(stdexec::__forward_like< Self >(self.policy_or_iter_space))> >, Properties... >{stdexec::__forward_like< Self >(detail::as_base< Properties >(self))..., stdexec::__forward_like< Self >(self.functor), std::forward< UnaryOp >(unary_op)(stdexec::__forward_like< Self >(self.policy_or_iter_space))})
constexpr auto connect(Rcvr) &&=delete
stdexec::sender_tag sender_concept
stdexec::__tuple< parallel_for_t, __data_t, Sndr > base_t
static constexpr size_t idx_sndr
stdexec::__mlist< Sndr > __children_t
constexpr auto connect(Rcvr) const &=delete
Custom algorithm for the Kokkos::parallel_for construct.
constexpr auto operator()(Label &&label, const T work_count, Functor &&functor) const noexcept(noexcept(stdexec::__closure(*this, Impl::make_iter_space(work_count), std::forward< Functor >(functor), Impl::Label{std::forward< Label >(label)}))) -> decltype(stdexec::__closure(*this, Impl::make_iter_space(work_count), std::forward< Functor >(functor), Impl::Label{std::forward< Label >(label)}))
constexpr auto operator()(Sndr &&sndr, ExecPolicyOrIterSpace &&policy_or_iter_space, Functor &&functor, Properties &&... properties) const noexcept(noexcept(Impl::ParallelForSender< Sndr, parallel_for_data_t< Functor, ExecPolicyOrIterSpace, Properties... > >{{ parallel_for_t{}, parallel_for_data_t< Functor, ExecPolicyOrIterSpace, Properties... >{ std::forward< Properties >(properties)..., std::forward< Functor >(functor), std::forward< ExecPolicyOrIterSpace >(policy_or_iter_space)}, std::forward< Sndr >(sndr) }})) -> Impl::ParallelForSender< Sndr, parallel_for_data_t< Functor, ExecPolicyOrIterSpace, Properties... > >
Impl::ParallelForData< std::remove_cvref_t< Functor >, std::remove_cvref_t< ExecPolicyOrIterSpace >, std::remove_cvref_t< Properties >... > parallel_for_data_t