4#include "exec/single_thread_context.hpp"
39using namespace Kokkos::utils::callbacks;
62 const view_s_t data(Kokkos::view_alloc(
exec,
"data - shared space"));
68 static_assert(std::same_as<
69 decltype(stdexec::get_completion_domain<stdexec::set_value_t>(stdexec::get_env(sndr))),
77 ASSERT_EQ(data(), 0) <<
"Eager execution is not allowed.";
83 ASSERT_THAT(recorded_events, [&]() {
85 return testing::ElementsAre(
90 return testing::ElementsAre(
108 const view_s_t data(Kokkos::view_alloc(
exec,
"data - shared space"));
115 ASSERT_EQ(data(), 0) <<
"Eager execution is not allowed.";
119 testing::ElementsAre(
124 ASSERT_EQ(data(), 2);
137 const view_s_t data(Kokkos::view_alloc(
exec,
"data - shared space"));
140 experimental::execution::single_thread_context stc{};
142 auto sndr = stdexec::when_all(
144 | stdexec::continues_on(stc.get_scheduler()) |
THEN_INCREMENT(data))
147 ASSERT_EQ(data(), 0) <<
"Eager execution is not allowed.";
153 testing::ElementsAre(
159 ASSERT_EQ(data(), 3);
170TEST_F(
WhenAllTest, single_branch_followed_by_other_and_finish_on_self) {
171 const view_s_t data(Kokkos::view_alloc(
exec,
"data - shared space"));
174 experimental::execution::single_thread_context stc{};
177 | stdexec::continues_on(stc.get_scheduler()) |
THEN_INCREMENT(data)
180 ASSERT_EQ(data(), 0) <<
"Eager execution is not allowed.";
186 ASSERT_THAT(recorded_events, [&]() {
188 return testing::ElementsAre(
195 return testing::ElementsAre(
203 ASSERT_EQ(data(), 3);
217 const view_s_t data(Kokkos::view_alloc(
"data - shared space"));
220 experimental::execution::single_thread_context stc{};
222 auto w_a = stdexec::when_all(
229 decltype(stdexec::get_completion_domain<stdexec::set_value_t>(stdexec::get_env(w_a), stdexec::env<>{})),
235 ASSERT_EQ(data(), 0) <<
"Eager execution is not allowed.";
241 testing::ElementsAre(
246 ASSERT_EQ(data(), 3);
260 const view_s_t data(Kokkos::view_alloc(
exec,
"data - shared space"));
262 const auto [exec_A, exec_B] = Kokkos::Experimental::partition_space(
exec, 1, 1);
264 const context_t esc_A{exec_A}, esc_B{exec_B};
266 auto sndr = stdexec::when_all(
271 ASSERT_EQ(data(), 0) <<
"Eager execution is not allowed.";
278 testing::ElementsAre(
284 ASSERT_THAT(recorded_events, [&]() {
286 return testing::ElementsAre(
295 return testing::ElementsAre(
305 ASSERT_EQ(data(), 3);
322 const view_s_t data(Kokkos::view_alloc(
"data - shared space"));
327 const context_h_t esc_h{exec_h};
329 auto sndr = stdexec::when_all(
334 ASSERT_EQ(data(), 0) <<
"Eager execution is not allowed.";
341 testing::ElementsAre(
347 ASSERT_THAT(recorded_events, [&]() {
349 return testing::ElementsAre(
357 return testing::ElementsAre(
367 ASSERT_EQ(data(), 3);
381TEST_F(
WhenAllTest, two_mixed_branches_followed_by_other_and_finish_on_self) {
382 const view_s_t data(Kokkos::view_alloc(
"data - shared space"));
385 experimental::execution::single_thread_context stc{};
387 auto sndr = stdexec::when_all(
389 | stdexec::continues_on(stc.get_scheduler()),
391 | stdexec::continues_on(stc.get_scheduler()) |
THEN_INCREMENT(data)
394 ASSERT_EQ(data(), 0) <<
"Eager execution is not allowed.";
400 testing::ElementsAre(
406 ASSERT_EQ(data(), 4);
424 const view_s_t data(Kokkos::view_alloc(
"data - shared space"));
427 experimental::execution::single_thread_context stc{};
429 auto sndr = stdexec::when_all(
437 ASSERT_EQ(data(), 0) <<
"Eager execution is not allowed.";
443 ASSERT_THAT(recorded_events, [&]() {
445 return testing::ElementsAre(
453 return testing::ElementsAre(
462 ASSERT_EQ(data(), 4);
477 const auto [exec_A, exec_B, exec_C] = Kokkos::Experimental::partition_space(
exec, 1, 1, 1);
479 const context_t esc_A{exec_A}, esc_B{exec_B}, esc_C{exec_C};
482 auto br_B = ::stdexec::schedule(esc_B.get_scheduler()) |
THEN_LABELED_PFOR(TEST_EXECUTION_SPACE,
'B');
483 auto br_C = ::stdexec::schedule(esc_C.get_scheduler()) |
THEN_LABELED_PFOR(TEST_EXECUTION_SPACE,
'C');
485 auto when_AB_then_D = ::stdexec::when_all(std::move(br_A), std::move(br_B))
488 auto sndr = ::stdexec::when_all(std::move(when_AB_then_D), std::move(br_C));
495 testing::ElementsAre(
503 ASSERT_THAT(recorded_events, [&]() {
505 return testing::ElementsAre(
517 return testing::ElementsAre(
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_THREADS_THROWS_ON_SYNC_WAIT_ASSERT_AND_SKIP(_sndr_)
#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...
#define THEN_INCREMENT_ATOMIC(_data_)
Same as THEN_INCREMENT, using Tests::Utils::atomic_add. // NOLINTNEXTLINE(cppcoreguidelines-macro-usa...
#define THEN_LABELED_PFOR(_exec_, _id_)
Add a Kokkos::Execution::parallel_for using Tests::Utils::Functors::Labeled. // NOLINTNEXTLINE(cppcor...
constexpr check_rcvr_env_queryable_with_t< false, Queries... > check_rcvr_env_not_queryable_with
auto record_sync_wait(Sndr &&sndr)
bool are_same_instances(const Exec &exec, const OtherExec &other_exec)
Matcher to filter out events that are just noise for tests.
Execution context using a Kokkos execution space under the hood.
auto get_scheduler() const noexcept -> ExecutionSpaceImpl::Scheduler< Exec >
Event to be sent to Kokkos::utils::callbacks::dispatch when calling record.
Event to be sent to Kokkos::utils::callbacks::dispatch when calling wait.
Kokkos::View< value_t, Kokkos::SharedSpace > view_s_t
Kokkos::Execution::ExecutionSpaceContext< Exec > context_t
Kokkos::DefaultHostExecutionSpace host_execution_space