17#ifndef KOKKOS_GRAPH_HPP
18#define KOKKOS_GRAPH_HPP
19#ifndef KOKKOS_IMPL_PUBLIC_INCLUDE
20#define KOKKOS_IMPL_PUBLIC_INCLUDE
21#define KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_GRAPH
24#include <Kokkos_Macros.hpp>
25#include <impl/Kokkos_Error.hpp>
27#include <Kokkos_Graph_fwd.hpp>
28#include <impl/Kokkos_GraphImpl_fwd.hpp>
31#include <impl/Kokkos_GraphImpl.hpp>
42template <
class ExecutionSpace = DefaultExecutionSpace>
43struct [[nodiscard]] Graph {
50 using execution_space = ExecutionSpace;
52 using root_t = GraphNodeRef<ExecutionSpace>;
61 friend struct Kokkos::Impl::GraphAccess;
69 using impl_t = Kokkos::Impl::GraphImpl<ExecutionSpace>;
70 using root_impl_t =
typename impl_t::root_node_impl_t;
72 std::shared_ptr<impl_t> m_impl_ptr =
nullptr;
73 std::shared_ptr<root_impl_t> m_root =
nullptr;
80 Graph(ExecutionSpace exec = ExecutionSpace{})
81 : m_impl_ptr{std::make_shared<impl_t>(std::move(exec))},
82 m_root{m_impl_ptr->create_root_node_ptr()} {}
84#if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) || \
85 defined(KOKKOS_ENABLE_SYCL)
88#if defined(KOKKOS_ENABLE_CXX20)
89 requires std::same_as<ExecutionSpace, Kokkos::DefaultExecutionSpace>
91 Graph(ExecutionSpace exec, T&& native_graph)
92 : m_impl_ptr{std::make_shared<impl_t>(std::move(exec),
93 std::forward<T>(native_graph))},
94 m_root{m_impl_ptr->create_root_node_ptr()} {
98 ExecutionSpace
const& get_execution_space()
const {
99 return m_impl_ptr->get_execution_space();
106 KOKKOS_EXPECTS(
bool(m_impl_ptr))
107 (*m_impl_ptr).instantiate();
110 auto root_node()
const {
return root_t{m_impl_ptr, m_root}; }
112 void submit(
const execution_space& exec)
const {
113 KOKKOS_EXPECTS(
bool(m_impl_ptr))
114 (*m_impl_ptr).submit(exec);
117 void submit()
const { submit(get_execution_space()); }
119 decltype(
auto) native_graph();
121 decltype(
auto) native_graph_exec();
130template <
class... PredecessorRefs>
135auto when_all(PredecessorRefs&&... arg_pred_refs) {
139 static_assert(
sizeof...(PredecessorRefs) > 0,
140 "when_all() needs at least one predecessor.");
141 auto graph_ptr_impl =
142 Kokkos::Impl::GraphAccess::get_graph_weak_ptr(
143 std::get<0>(std::forward_as_tuple(arg_pred_refs...)))
145 auto node_ptr_impl = graph_ptr_impl->create_aggregate_ptr(arg_pred_refs...);
146 graph_ptr_impl->add_node(node_ptr_impl);
147 (graph_ptr_impl->add_predecessor(node_ptr_impl, arg_pred_refs), ...);
148 return Kokkos::Impl::GraphAccess::make_graph_node_ref(
149 std::move(graph_ptr_impl), std::move(node_ptr_impl));
158template <
class ExecutionSpace,
class Closure>
159Graph<ExecutionSpace> create_graph(ExecutionSpace ex, Closure&& arg_closure) {
165 Graph<ExecutionSpace> rv{std::move(ex)};
167 ((Closure&&)arg_closure)(rv.root_node());
174 class ExecutionSpace = DefaultExecutionSpace,
175 class Closure = Kokkos::Impl::DoNotExplicitlySpecifyThisTemplateParameter>
178 Graph<ExecutionSpace>>
179create_graph(Closure&& arg_closure) {
180 return create_graph(ExecutionSpace{}, (Closure&&)arg_closure);
186template <
class ExecutionSpace>
187decltype(
auto) Graph<ExecutionSpace>::native_graph() {
188 KOKKOS_EXPECTS(
bool(m_impl_ptr));
189#if defined(KOKKOS_ENABLE_CUDA)
190 if constexpr (std::is_same_v<ExecutionSpace, Kokkos::Cuda>) {
191 return m_impl_ptr->cuda_graph();
193#elif defined(KOKKOS_ENABLE_HIP) && defined(KOKKOS_IMPL_HIP_NATIVE_GRAPH)
194 if constexpr (std::is_same_v<ExecutionSpace, Kokkos::HIP>) {
195 return m_impl_ptr->hip_graph();
197#elif defined(KOKKOS_ENABLE_SYCL) && defined(KOKKOS_IMPL_SYCL_GRAPH_SUPPORT)
198 if constexpr (std::is_same_v<ExecutionSpace, Kokkos::SYCL>) {
199 return m_impl_ptr->sycl_graph();
204template <
class ExecutionSpace>
205decltype(
auto) Graph<ExecutionSpace>::native_graph_exec() {
206 KOKKOS_EXPECTS(
bool(m_impl_ptr));
207#if defined(KOKKOS_ENABLE_CUDA)
208 if constexpr (std::is_same_v<ExecutionSpace, Kokkos::Cuda>) {
209 return m_impl_ptr->cuda_graph_exec();
211#elif defined(KOKKOS_ENABLE_HIP) && defined(KOKKOS_IMPL_HIP_NATIVE_GRAPH)
212 if constexpr (std::is_same_v<ExecutionSpace, Kokkos::HIP>) {
213 return m_impl_ptr->hip_graph_exec();
215#elif defined(KOKKOS_ENABLE_SYCL) && defined(KOKKOS_IMPL_SYCL_GRAPH_SUPPORT)
216 if constexpr (std::is_same_v<ExecutionSpace, Kokkos::SYCL>) {
217 return m_impl_ptr->sycl_graph_exec();
227#include <Kokkos_GraphNode.hpp>
229#include <impl/Kokkos_GraphNodeImpl.hpp>
230#include <impl/Kokkos_GraphNodeThenImpl.hpp>
231#include <impl/Kokkos_Default_Graph_Impl.hpp>
232#include <Cuda/Kokkos_Cuda_Graph_Impl.hpp>
233#if defined(KOKKOS_ENABLE_HIP)
235#if defined(KOKKOS_IMPL_HIP_NATIVE_GRAPH)
236#include <HIP/Kokkos_HIP_Graph_Impl.hpp>
239#ifdef KOKKOS_IMPL_SYCL_GRAPH_SUPPORT
240#include <SYCL/Kokkos_SYCL_Graph_Impl.hpp>
242#ifdef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_GRAPH
243#undef KOKKOS_IMPL_PUBLIC_INCLUDE
244#undef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_GRAPH
A thread safe view to a bitset.