Tpetra parallel linear algebra  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Tpetra_Details_ExecutionSpacesUser.hpp
1 #ifndef TPETRA_DETAILS_EXECUTIONSPACESUSER_HPP
2 #define TPETRA_DETAILS_EXECUTIONSPACESUSER_HPP
3 
4 #include <iostream>
5 #include <sstream>
6 #include <vector>
7 
8 #include <Kokkos_Core.hpp>
9 
10 #include "Teuchos_RCP.hpp"
11 
12 #include "Tpetra_Details_ExecutionSpacesSlot.hpp"
13 
14 namespace Tpetra {
15 namespace Details {
16 namespace Spaces {
17 
25 class User {
26 public:
27 #ifdef KOKKOS_ENABLE_CUDA
28 
37  template <typename ExecSpace,
38  Spaces::Priority priority = Spaces::Priority::medium,
39  Spaces::IsCuda<ExecSpace> = true>
40  Teuchos::RCP<const ExecSpace> space_instance() const {
41  return cudaSlot.space_instance<priority>();
42  }
43 
53  template <typename ExecSpace, Spaces::IsCuda<ExecSpace> = true>
54  Teuchos::RCP<const ExecSpace>
55  space_instance(const Spaces::Priority &priority) const {
56  return cudaSlot.space_instance(priority);
57  }
58 #endif // KOKKOS_ENABLE_CUDA
59 
60 #ifdef KOKKOS_ENABLE_SERIAL
61  template <typename ExecSpace,
62  Spaces::Priority priority = Spaces::Priority::medium,
63  Spaces::IsSerial<ExecSpace> = true>
64  Teuchos::RCP<const ExecSpace> space_instance() const {
65  return serialSlot.space_instance<priority>();
66  }
67  template <typename ExecSpace, Spaces::IsSerial<ExecSpace> = true>
68  Teuchos::RCP<const ExecSpace>
69  space_instance(const Spaces::Priority &priority) const {
70  return serialSlot.space_instance(priority);
71  }
72 #endif // KOKKOS_ENABLE_SERIAL
73 
74 #ifdef KOKKOS_ENABLE_OPENMP
75  template <typename ExecSpace,
76  Spaces::Priority priority = Spaces::Priority::medium,
77  Spaces::IsOpenMP<ExecSpace> = true>
78  Teuchos::RCP<const ExecSpace> space_instance() const {
79  return openMPSlot.space_instance<priority>();
80  }
81  template <typename ExecSpace, Spaces::IsOpenMP<ExecSpace> = true>
82  Teuchos::RCP<const ExecSpace>
83  space_instance(const Spaces::Priority &priority) const {
84  return openMPSlot.space_instance(priority);
85  }
86 #endif // KOKKOS_ENABLE_OPENMP
87 
88 #ifdef KOKKOS_ENABLE_HIP
89  template <typename ExecSpace,
90  Spaces::Priority priority = Spaces::Priority::medium,
91  Spaces::IsHIP<ExecSpace> = true>
92  Teuchos::RCP<const ExecSpace> space_instance() const {
93  return HIPSlot.space_instance<priority>();
94  }
95  template <typename ExecSpace, Spaces::IsHIP<ExecSpace> = true>
96  Teuchos::RCP<const ExecSpace>
97  space_instance(const Spaces::Priority &priority) const {
98  return HIPSlot.space_instance(priority);
99  }
100 #endif // KOKKOS_ENABLE_HIP
101 
102 #ifdef KOKKOS_ENABLE_SYCL
103  template <typename ExecSpace,
104  Spaces::Priority priority = Spaces::Priority::medium,
105  Spaces::IsSYCL<ExecSpace> = true>
106  Teuchos::RCP<const ExecSpace> space_instance() const {
107  return SYCLSlot.space_instance<priority>();
108  }
109  template <typename ExecSpace, Spaces::IsSYCL<ExecSpace> = true>
110  Teuchos::RCP<const ExecSpace>
111  space_instance(const Spaces::Priority &priority) const {
112  return SYCLSlot.space_instance(priority);
113  }
114 #endif // KOKKOS_ENABLE_SYCL
115 
116 #ifdef KOKKOS_ENABLE_SERIAL
117  Slot<Kokkos::Serial> serialSlot;
118 #endif
119 #ifdef KOKKOS_ENABLE_OPENMP
120  Slot<Kokkos::OpenMP> openMPSlot;
121 #endif
122 #ifdef KOKKOS_ENABLE_CUDA
123  Slot<Kokkos::Cuda> cudaSlot;
124 #endif
125 #ifdef KOKKOS_ENABLE_HIP
126  Slot<Kokkos::HIP> HIPSlot;
127 #endif
128 #ifdef KOKKOS_ENABLE_SYCL
130 #endif
131 
132 }; // User
133 } // namespace Spaces
134 } // namespace Details
135 } // namespace Tpetra
136 
137 #endif // TPETRA_DETAILS_EXECUTIONSPACESUSER_HPP
A class can inherit from this if it wants to use Tpetra managed spaces.
Lazily acquires and stores Kokkos Execution Spaces.