kokkos-execution 0.0.1
Loading...
Searching...
No Matches
event.hpp
Go to the documentation of this file.
1#ifndef KOKKOS_EXECUTION_IMPL_EVENT_HPP
2#define KOKKOS_EXECUTION_IMPL_EVENT_HPP
3
4#include <concepts>
5#include <optional>
6
7#include "Kokkos_Core.hpp"
8
9#if defined(KOKKOS_EXECUTION_ENABLE_EVENT_DISPATCH)
11#endif
12
19
21
23template <typename EventType, typename Exec>
24concept event = Kokkos::ExecutionSpace<Exec> && std::default_initializable<EventType> && !std::copyable<EventType>
25 && !std::movable<EventType> && requires(EventType& obj, const Exec& exec) {
26 { obj.record(exec) } -> std::same_as<void>;
27 } && requires(const EventType& obj) {
28 { obj.wait() } -> std::same_as<void>;
29 { obj.m_event_id } -> std::same_as<const uint64_t&>;
30 };
31
33template <Kokkos::ExecutionSpace Exec>
34struct Event;
35
42template <Kokkos::ExecutionSpace Exec>
43struct HasNonBlockingDispatch : std::false_type { };
44
45template <typename Exec>
47
48static constexpr auto invalid_dev_id = Kokkos::Experimental::finite_max_v<uint32_t>;
49static constexpr auto invalid_event_id = Kokkos::Experimental::finite_max_v<uint64_t>;
50
53 uint32_t dev_id = 0;
54 uint64_t event_id = 0;
55
56 constexpr auto operator<=>(const RecordEvent&) const = default;
57
58 friend std::ostream& operator<<(std::ostream& out, const RecordEvent& event) {
59 return out << "RecordEvent: {dev_id = " << event.dev_id << ", event_id = " << event.event_id << '}';
60 }
61};
62
63template <Kokkos::ExecutionSpace Exec>
64void record_event(const Exec& exec, uint64_t& event_id) {
65#if defined(KOKKOS_EXECUTION_ENABLE_EVENT_DISPATCH)
68 RecordEvent{.dev_id = Kokkos::Tools::Experimental::device_id(exec), .event_id = event_id});
69#endif
70}
71
73struct WaitEvent {
74 uint32_t dev_id = 0;
75 uint64_t event_id = 0;
76
77 constexpr auto operator<=>(const WaitEvent&) const = default;
78
79 friend std::ostream& operator<<(std::ostream& out, const WaitEvent& event) {
80 return out << "WaitEvent: {dev_id = " << event.dev_id << ", event_id = " << event.event_id << '}';
81 }
82};
83
84template <Kokkos::ExecutionSpace Exec>
86#if defined(KOKKOS_EXECUTION_ENABLE_EVENT_DISPATCH)
87 Kokkos::utils::callbacks::dispatch(WaitEvent{.dev_id = invalid_dev_id, .event_id = event.m_event_id});
88#endif
89}
90
91template <Kokkos::ExecutionSpace ExecTo, Kokkos::ExecutionSpace ExecFrom>
92void wait_event(const ExecTo& exec, const Event<ExecFrom>& event) {
93#if defined(KOKKOS_EXECUTION_ENABLE_EVENT_DISPATCH)
95 WaitEvent{.dev_id = Kokkos::Tools::Experimental::device_id(exec), .event_id = event.m_event_id});
96#endif
97}
98
107template <Kokkos::ExecutionSpace Exec>
108struct Event {
109 static_assert(!has_non_blocking_dispatch<Exec>);
110
111 std::atomic<bool> m_recorded{false};
112
114
115 Event() = default;
116 Event(const Event&) = delete;
117 Event& operator=(const Event&) = delete;
118 Event(Event&&) noexcept = delete;
119 Event& operator=(Event&&) noexcept = delete;
120 ~Event() = default;
121
122 void record(const Exec&) {
123 m_recorded.store(true, std::memory_order_release);
124 }
125
126 void wait() const {
131 while (!m_recorded.load(std::memory_order_acquire)) {
132 }
133 }
134};
135
137template <Kokkos::ExecutionSpace Exec>
138void record(Event<Exec>& event, const Exec& exec) {
139 record_event(exec, event.m_event_id);
140 event.record(exec);
141}
142
144template <Kokkos::ExecutionSpace Exec>
145void wait(const Event<Exec>& event) {
147 event.wait();
148}
149
150template <Kokkos::ExecutionSpace ExecFrom, Kokkos::ExecutionSpace ExecTo>
151void impl_wait(const ExecTo&, const Event<ExecFrom>& event) {
152 event.wait();
153}
154
160template <Kokkos::ExecutionSpace ExecFrom, Kokkos::ExecutionSpace ExecTo>
161void wait(const ExecTo& exec, const Event<ExecFrom>& event) {
162 wait_event(exec, event);
163 impl_wait(exec, event);
164}
165
166template <Kokkos::ExecutionSpace Exec>
167using event_storage_t = std::optional<Event<Exec>>;
168
169} // namespace Kokkos::Execution::Impl
170
171#if defined(KOKKOS_ENABLE_CUDA)
173#endif
174#if defined(KOKKOS_ENABLE_HIP)
176#endif
177#if defined(KOKKOS_ENABLE_HPX)
179#endif
180#if defined(KOKKOS_ENABLE_SYCL)
182#endif
183
184#endif // KOKKOS_EXECUTION_IMPL_EVENT_HPP
Constrain an EventType type to be a valid event type for Exec execution space type.
Definition event.hpp:24
static constexpr auto invalid_event_id
Definition event.hpp:49
std::optional< Event< Exec > > event_storage_t
Definition event.hpp:167
static constexpr auto invalid_dev_id
Definition event.hpp:48
void record_event(const Exec &exec, uint64_t &event_id)
Definition event.hpp:64
void record(Event< Exec > &event, const Exec &exec)
Record event on exec.
Definition event.hpp:138
void impl_wait(const Kokkos::Cuda &exec, const Event< Kokkos::Cuda > &event)
Definition event.hpp:48
void wait_event(const Event< Exec > &event)
Definition event.hpp:85
void wait(const Event< Exec > &event)
Wait for event to complete.
Definition event.hpp:145
auto get_next_event_id() noexcept
void dispatch(const EventType &event)
An event that can be recorded on an execution space instance.
Definition event.hpp:108
std::atomic< bool > m_recorded
Definition event.hpp:111
Event & operator=(const Event &)=delete
Event(Event &&) noexcept=delete
void record(const Exec &)
Definition event.hpp:122
Event(const Event &)=delete
Determine if the Kokkos backend has non-blocking dispatch.
Definition event.hpp:43
Event to be sent to Kokkos::utils::callbacks::dispatch when calling record.
Definition event.hpp:52
friend std::ostream & operator<<(std::ostream &out, const RecordEvent &event)
Definition event.hpp:58
constexpr auto operator<=>(const RecordEvent &) const =default
Event to be sent to Kokkos::utils::callbacks::dispatch when calling wait.
Definition event.hpp:73
friend std::ostream & operator<<(std::ostream &out, const WaitEvent &event)
Definition event.hpp:79
constexpr auto operator<=>(const WaitEvent &) const =default