kokkos-execution 0.0.1
Loading...
Searching...
No Matches
test_inter_op.cpp
Go to the documentation of this file.
2PRAGMA_DIAGNOSTIC_PUSH
4#include "exec/static_thread_pool.hpp"
5PRAGMA_DIAGNOSTIC_POP
6
9
14
26
28
29using namespace Kokkos::utils::callbacks;
30
43
45TEST_F(InterOpTest, transition_to_inline_scheduler) {
46 const view_s_t data(Kokkos::view_alloc(exec, "data - shared space"));
47
48 const context_t esc{exec};
49
51
52 auto chain =
53 stdexec::schedule(esc.get_scheduler())
54 | stdexec::then(
55 Tests::Utils::Functors::LoadCheckAdd<value_t, on_device>{.prev = 0, .value = 4, .data = data.data()})
56 | stdexec::continues_on(stdexec::inline_scheduler{})
57 | stdexec::then(
58 Tests::Utils::Functors::LoadCheckAdd<value_t, false>{.prev = 4, .value = 4, .data = data.data()});
59
60 ASSERT_EQ(data(), 0) << "Eager execution is not allowed.";
61
62 const auto recorded_events = Tests::Utils::record_sync_wait<recorder_listener_t>(
63 std::move(chain)); // NOLINT(performance-move-const-arg)
64
65 ASSERT_THAT(
66 recorded_events,
67 testing::ElementsAre(
69 MATCHER_FOR_BEGIN_FENCE(exec, dispatch_label(exec, "schedule_from"))));
70
71 ASSERT_EQ(data(), 8);
72}
73
75TEST_F(InterOpTest, transition_from_inline_scheduler) {
76 const view_s_t data(Kokkos::view_alloc("data - shared space"));
77
78 const context_t esc{exec};
79
81
82 auto chain =
83 stdexec::schedule(stdexec::inline_scheduler{})
84 | stdexec::then(
85 Tests::Utils::Functors::LoadCheckAdd<value_t, false>{.prev = 0, .value = 4, .data = data.data()})
86 | stdexec::continues_on(esc.get_scheduler())
87 | stdexec::then(
88 Tests::Utils::Functors::LoadCheckAdd<value_t, on_device>{.prev = 4, .value = 4, .data = data.data()});
89
90 ASSERT_EQ(data(), 0) << "Eager execution is not allowed.";
91
92 const auto recorded_events = Tests::Utils::record_sync_wait<recorder_listener_t>(
93 std::move(chain)); // NOLINT(performance-move-const-arg)
94
95 ASSERT_THAT(
96 recorded_events,
97 testing::ElementsAre(
100
101 ASSERT_EQ(data(), 8);
102}
103
105TEST_F(InterOpTest, transition_from_inline_scheduler_and_back) {
106 const view_s_t data(Kokkos::view_alloc("data - shared space"));
107
108 const context_t esc{exec};
109
111
112 auto chain =
113 stdexec::schedule(stdexec::inline_scheduler{})
114 | stdexec::then(
115 Tests::Utils::Functors::LoadCheckAdd<value_t, false>{.prev = 0, .value = 4, .data = data.data()})
116 | stdexec::continues_on(esc.get_scheduler())
117 | stdexec::then(
118 Tests::Utils::Functors::LoadCheckAdd<value_t, on_device>{.prev = 4, .value = 4, .data = data.data()})
119 | stdexec::continues_on(stdexec::inline_scheduler{})
120 | stdexec::then(
121 Tests::Utils::Functors::LoadCheckAdd<value_t, false>{.prev = 8, .value = 4, .data = data.data()});
122
123 ASSERT_EQ(data(), 0) << "Eager execution is not allowed.";
124
125 const auto recorded_events = Tests::Utils::record_sync_wait<recorder_listener_t>(
126 std::move(chain)); // NOLINT(performance-move-const-arg)
127
128 ASSERT_THAT(
129 recorded_events,
130 testing::ElementsAre(
132 MATCHER_FOR_BEGIN_FENCE(exec, dispatch_label(exec, "schedule_from"))));
133
134 ASSERT_EQ(data(), 12);
135}
136
138TEST_F(InterOpTest, transition_to_static_thread_pool) {
139 const view_s_t data(Kokkos::view_alloc(exec, "data - shared space"));
140
141 const context_t esc{exec};
142
143 experimental::execution::static_thread_pool pool{1};
144
146
147 auto chain =
148 stdexec::schedule(esc.get_scheduler())
149 | stdexec::then(
150 Tests::Utils::Functors::LoadCheckAdd<value_t, on_device>{.prev = 0, .value = 4, .data = data.data()})
151 | stdexec::continues_on(pool.get_scheduler())
152 | stdexec::then(
153 Tests::Utils::Functors::LoadCheckAdd<value_t, false>{.prev = 4, .value = 4, .data = data.data()});
154
155 ASSERT_EQ(data(), 0) << "Eager execution is not allowed.";
156
157 const auto recorded_events = Tests::Utils::record_sync_wait<recorder_listener_t>(
158 std::move(chain)); // NOLINT(performance-move-const-arg)
159
160 ASSERT_THAT(
161 recorded_events,
162 testing::ElementsAre(
164 MATCHER_FOR_BEGIN_FENCE(exec, dispatch_label(exec, "schedule_from"))));
165
166 ASSERT_EQ(data(), 8);
167}
168
170TEST_F(InterOpTest, transition_from_static_thread_pool) {
171 const view_s_t data(Kokkos::view_alloc("data - shared space"));
172
173 const context_t esc{exec};
174
175 experimental::execution::static_thread_pool pool{1};
176
178
179 auto chain =
180 stdexec::schedule(pool.get_scheduler())
181 | stdexec::then(
182 Tests::Utils::Functors::LoadCheckAdd<value_t, false>{.prev = 0, .value = 4, .data = data.data()})
183 | stdexec::continues_on(esc.get_scheduler())
184 | stdexec::then(
185 Tests::Utils::Functors::LoadCheckAdd<value_t, on_device>{.prev = 4, .value = 4, .data = data.data()});
186
187 ASSERT_EQ(data(), 0) << "Eager execution is not allowed.";
188
190
191 const auto recorded_events = Tests::Utils::record_sync_wait<recorder_listener_t>(
192 std::move(chain)); // NOLINT(performance-move-const-arg)
193
194 ASSERT_THAT(
195 recorded_events,
196 testing::ElementsAre(
199
200 ASSERT_EQ(data(), 8);
201}
202
204TEST_F(InterOpTest, transition_from_static_thread_pool_and_back) {
205 const view_s_t data(Kokkos::view_alloc("data - shared space"));
206
207 const context_t esc{exec};
208
209 experimental::execution::static_thread_pool pool{1};
210
212
213 auto chain =
214 stdexec::schedule(pool.get_scheduler())
215 | stdexec::then(
216 Tests::Utils::Functors::LoadCheckAdd<value_t, false>{.prev = 0, .value = 4, .data = data.data()})
217 | stdexec::continues_on(esc.get_scheduler())
218 | stdexec::then(
219 Tests::Utils::Functors::LoadCheckAdd<value_t, on_device>{.prev = 4, .value = 4, .data = data.data()})
220 | stdexec::continues_on(pool.get_scheduler())
221 | stdexec::then(
222 Tests::Utils::Functors::LoadCheckAdd<value_t, false>{.prev = 8, .value = 4, .data = data.data()});
223
224 ASSERT_EQ(data(), 0) << "Eager execution is not allowed.";
225
227
228 const auto recorded_events = Tests::Utils::record_sync_wait<recorder_listener_t>(
229 std::move(chain)); // NOLINT(performance-move-const-arg)
230
231 ASSERT_THAT(
232 recorded_events,
233 testing::ElementsAre(
235 MATCHER_FOR_BEGIN_FENCE(exec, dispatch_label(exec, "schedule_from"))));
236
237 ASSERT_EQ(data(), 12);
238}
239
241TEST_F(InterOpTest, transition_to_static_thread_pool_and_back) {
242 const view_s_t data(Kokkos::view_alloc(exec, "data - shared space"));
243
244 const context_t esc{exec};
245
246 experimental::execution::static_thread_pool pool{1};
247
249
250 auto chain =
251 stdexec::schedule(esc.get_scheduler())
252 | stdexec::then(
253 Tests::Utils::Functors::LoadCheckAdd<value_t, on_device>{.prev = 0, .value = 4, .data = data.data()})
254 | stdexec::continues_on(pool.get_scheduler())
255 | stdexec::then(
256 Tests::Utils::Functors::LoadCheckAdd<value_t, false>{.prev = 4, .value = 4, .data = data.data()})
257 | stdexec::continues_on(esc.get_scheduler())
258 | stdexec::then(
259 Tests::Utils::Functors::LoadCheckAdd<value_t, on_device>{.prev = 8, .value = 4, .data = data.data()});
260
261 ASSERT_EQ(data(), 0) << "Eager execution is not allowed.";
262
264
265 const auto recorded_events = Tests::Utils::record_sync_wait<recorder_listener_t>(
266 std::move(chain)); // NOLINT(performance-move-const-arg)
267
268 ASSERT_THAT(
269 recorded_events,
270 testing::ElementsAre(
275
276 ASSERT_EQ(data(), 12);
277}
278
279} // namespace Tests::ExecutionSpaceImpl
constexpr std::string dispatch_label(const Exec &, Label &&label)
Get the dispatch label from Exec and label.
#define MATCHER_FOR_BEGIN_PFOR(_exec_, _label_)
#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
#define KOKKOS_EXECUTION_THREADS_THROWS_ON_SYNC_WAIT_ASSERT_AND_SKIP(_sndr_)
Definition context.hpp:69
#define KOKKOS_EXECUTION_STDEXEC_PRAGMA_DIAGNOSTIC_IGNORED
Basic list of ignored diagnostics when including anything from stdexec.
auto record_sync_wait(Sndr &&sndr)
Definition sync_wait.hpp:14
void show_exec_space_id(const Exec &exec, std::string_view label="", std::ostream &out=std::cout)
Definition kokkos.hpp:33
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
Kokkos::Execution::ExecutionSpaceContext< Exec > context_t
Definition context.hpp:27
Load the value at data and check it is equal to prev. Then, add value to it.