kokkos-execution 0.0.1
Loading...
Searching...
No Matches
test_transfer_when_all.cpp
Go to the documentation of this file.
2PRAGMA_DIAGNOSTIC_PUSH
4#include "exec/single_thread_context.hpp"
5PRAGMA_DIAGNOSTIC_POP
6
8
11
17
29
31
32using namespace Kokkos::utils::callbacks;
33
46
49 const view_s_t data(Kokkos::view_alloc(exec, "data - shared space"));
50
51 const auto [exec_A, exec_B] = Kokkos::Experimental::partition_space(exec, 1, 1);
52
53 const context_t esc_A{exec_A}, esc_B{exec_B};
54
55 auto w_a = stdexec::transfer_when_all(
56 esc_A.get_scheduler(),
57 stdexec::schedule(esc_A.get_scheduler()) | THEN_INCREMENT_ATOMIC(data),
58 stdexec::schedule(esc_B.get_scheduler()) | THEN_INCREMENT_ATOMIC(data));
59
60 static_assert(std::same_as<
61 decltype(stdexec::get_completion_domain<stdexec::set_value_t>(stdexec::get_env(w_a))),
63 >);
64
66 static_assert(std::same_as<
67 decltype(stdexec::get_completion_scheduler<stdexec::set_value_t>(stdexec::get_env(w_a))),
69 >);
71
72 auto sndr = std::move(w_a) | THEN_INCREMENT(data);
73
74 ASSERT_EQ(data(), 0) << "Eager execution is not allowed.";
75
76 const auto recorded_events = Tests::Utils::record_sync_wait<recorder_listener_t>(std::move(sndr));
77
78 if (Tests::Utils::are_same_instances(exec_A, exec_B)) {
79 ASSERT_THAT(
80 recorded_events,
81 testing::ElementsAre(
82 MATCHER_FOR_BEGIN_PFOR(exec_A, dispatch_label(exec_A, "then")),
83 MATCHER_FOR_BEGIN_PFOR(exec_B, dispatch_label(exec_B, "then")),
84 MATCHER_FOR_BEGIN_PFOR(exec_A, dispatch_label(exec_A, "then")),
85 MATCHER_FOR_BEGIN_FENCE(exec_A, dispatch_label(exec_A, "sync_wait"))));
86 } else {
87 ASSERT_THAT(recorded_events, [&]() {
89 return testing::ElementsAre(
90 MATCHER_FOR_BEGIN_PFOR(exec_A, dispatch_label(exec_A, "then")),
91 MATCHER_FOR_BEGIN_PFOR(exec_B, dispatch_label(exec_B, "then")),
93 MATCHER_FOR_WAIT_EVENT(recorded_events.at(2)),
94 MATCHER_FOR_BEGIN_PFOR(exec_A, dispatch_label(exec_A, "then")),
95 MATCHER_FOR_BEGIN_FENCE(exec_A, dispatch_label(exec_A, "sync_wait")));
96 } else {
97 return testing::ElementsAre(
98 MATCHER_FOR_BEGIN_PFOR(exec_A, dispatch_label(exec_A, "then")),
99 MATCHER_FOR_BEGIN_PFOR(exec_B, dispatch_label(exec_B, "then")),
100 MATCHER_FOR_BEGIN_FENCE(exec_B, dispatch_label(exec_B, "after dispatch")),
101 MATCHER_FOR_BEGIN_PFOR(exec_A, dispatch_label(exec_A, "then")),
102 MATCHER_FOR_BEGIN_FENCE(exec_A, dispatch_label(exec_A, "sync_wait")));
103 }
104 }());
105 }
106
107 ASSERT_EQ(data(), 3);
108}
109
110} // namespace Tests::ExecutionSpaceImpl
constexpr std::string dispatch_label(const Exec &, Label &&label)
Get the dispatch label from Exec and label.
#define MATCHER_FOR_WAIT_EVENT(_record_event_variant_)
#define MATCHER_FOR_BEGIN_PFOR(_exec_, _label_)
#define MATCHER_FOR_RECORD_EVENT(_exec_)
#define MATCHER_FOR_BEGIN_FENCE(_exec_, _label_)
RecorderListener< EventDiscardMatcher< TEST_EXECUTION_SPACE >, BeginFenceEvent, BeginParallelForEvent, Kokkos::Execution::Impl::RecordEvent, Kokkos::Execution::Impl::WaitEvent > recorder_listener_t
Concept for a sender whose completion scheduler is Kokkos::Execution::ExecutionSpaceImpl::Scheduler.
#define KOKKOS_EXECUTION_STDEXEC_PRAGMA_DIAGNOSTIC_IGNORED
Basic list of ignored diagnostics when including anything from stdexec.
#define THEN_INCREMENT(_data_)
Add a then using Tests::Utils::Functors::Increment that may throw. // NOLINTNEXTLINE(cppcoreguideline...
Definition increment.hpp:35
#define THEN_INCREMENT_ATOMIC(_data_)
Same as THEN_INCREMENT, using Tests::Utils::atomic_add. // NOLINTNEXTLINE(cppcoreguidelines-macro-usa...
Definition increment.hpp:39
auto record_sync_wait(Sndr &&sndr)
Definition sync_wait.hpp:14
bool are_same_instances(const Exec &exec, const OtherExec &other_exec)
Definition kokkos.hpp:13
Matcher to filter out events that are just noise for tests.
auto get_scheduler() const noexcept -> ExecutionSpaceImpl::Scheduler< Exec >
Event to be sent to Kokkos::utils::callbacks::dispatch when calling record.
Definition event.hpp:52
Event to be sent to Kokkos::utils::callbacks::dispatch when calling wait.
Definition event.hpp:73
decltype(std::declval< const context_t >().get_scheduler()) scheduler_t
Definition context.hpp:28
Kokkos::Execution::ExecutionSpaceContext< Exec > context_t
Definition context.hpp:27