10 #ifndef TPETRA_DETAILS_STATICVIEW_HPP
11 #define TPETRA_DETAILS_STATICVIEW_HPP
13 #include "TpetraCore_config.h"
15 #include "Kokkos_DualView.hpp"
21 template <
class MemorySpace>
22 class StaticKokkosAllocation {
24 StaticKokkosAllocation() =
delete;
25 ~StaticKokkosAllocation() =
delete;
26 StaticKokkosAllocation(
const StaticKokkosAllocation&) =
delete;
27 StaticKokkosAllocation& operator=(
const StaticKokkosAllocation&) =
delete;
28 StaticKokkosAllocation(StaticKokkosAllocation&&) =
delete;
29 StaticKokkosAllocation& operator=(StaticKokkosAllocation&&) =
delete;
33 static void* resize(MemorySpace space,
const size_t size);
36 #ifdef KOKKOS_ENABLE_CUDA
38 class StaticKokkosAllocation<Kokkos::CudaSpace> {
40 StaticKokkosAllocation() =
delete;
41 ~StaticKokkosAllocation() =
delete;
42 StaticKokkosAllocation(
const StaticKokkosAllocation&) =
delete;
43 StaticKokkosAllocation& operator=(
const StaticKokkosAllocation&) =
delete;
44 StaticKokkosAllocation(StaticKokkosAllocation&&) =
delete;
45 StaticKokkosAllocation& operator=(StaticKokkosAllocation&&) =
delete;
47 static void* resize(Kokkos::CudaSpace space,
const size_t size);
51 class StaticKokkosAllocation<Kokkos::CudaUVMSpace> {
53 StaticKokkosAllocation() =
delete;
54 ~StaticKokkosAllocation() =
delete;
55 StaticKokkosAllocation(
const StaticKokkosAllocation&) =
delete;
56 StaticKokkosAllocation& operator=(
const StaticKokkosAllocation&) =
delete;
57 StaticKokkosAllocation(StaticKokkosAllocation&&) =
delete;
58 StaticKokkosAllocation& operator=(StaticKokkosAllocation&&) =
delete;
60 static void* resize(Kokkos::CudaUVMSpace space,
const size_t size);
64 class StaticKokkosAllocation<Kokkos::CudaHostPinnedSpace> {
66 StaticKokkosAllocation() =
delete;
67 ~StaticKokkosAllocation() =
delete;
68 StaticKokkosAllocation(
const StaticKokkosAllocation&) =
delete;
69 StaticKokkosAllocation& operator=(
const StaticKokkosAllocation&) =
delete;
70 StaticKokkosAllocation(StaticKokkosAllocation&&) =
delete;
71 StaticKokkosAllocation& operator=(StaticKokkosAllocation&&) =
delete;
73 static void* resize(Kokkos::CudaHostPinnedSpace space,
const size_t size);
75 #endif // KOKKOS_ENABLE_CUDA
77 #ifdef KOKKOS_ENABLE_HIP
79 class StaticKokkosAllocation<Kokkos::HIPSpace> {
81 StaticKokkosAllocation() =
delete;
82 ~StaticKokkosAllocation() =
delete;
83 StaticKokkosAllocation(
const StaticKokkosAllocation&) =
delete;
84 StaticKokkosAllocation& operator=(
const StaticKokkosAllocation&) =
delete;
85 StaticKokkosAllocation(StaticKokkosAllocation&&) =
delete;
86 StaticKokkosAllocation& operator=(StaticKokkosAllocation&&) =
delete;
88 static void* resize(Kokkos::HIPSpace space,
const size_t size);
92 class StaticKokkosAllocation<Kokkos::HIPHostPinnedSpace> {
94 StaticKokkosAllocation() =
delete;
95 ~StaticKokkosAllocation() =
delete;
96 StaticKokkosAllocation(
const StaticKokkosAllocation&) =
delete;
97 StaticKokkosAllocation& operator=(
const StaticKokkosAllocation&) =
delete;
98 StaticKokkosAllocation(StaticKokkosAllocation&&) =
delete;
99 StaticKokkosAllocation& operator=(StaticKokkosAllocation&&) =
delete;
101 static void* resize(Kokkos::HIPHostPinnedSpace space,
const size_t size);
103 #endif // KOKKOS_ENABLE_HIP
106 class StaticKokkosAllocation<Kokkos::HostSpace> {
108 StaticKokkosAllocation() =
delete;
109 ~StaticKokkosAllocation() =
delete;
110 StaticKokkosAllocation(
const StaticKokkosAllocation&) =
delete;
111 StaticKokkosAllocation& operator=(
const StaticKokkosAllocation&) =
delete;
112 StaticKokkosAllocation(StaticKokkosAllocation&&) =
delete;
113 StaticKokkosAllocation& operator=(StaticKokkosAllocation&&) =
delete;
115 static void* resize(Kokkos::HostSpace space,
const size_t size);
118 template <
class ValueType,
class MemorySpace>
120 getStaticKokkosMemory(MemorySpace space,
121 const size_t num_entries,
122 const size_t value_size =
sizeof(ValueType)) {
123 void* ptr = StaticKokkosAllocation<MemorySpace>::resize(space, num_entries * value_size);
124 return reinterpret_cast<ValueType*
>(ptr);
129 template <
class ValueType,
class DeviceType>
130 Kokkos::View<ValueType*, DeviceType>
131 getStatic1dView(
const size_t size) {
132 using Impl::getStaticKokkosMemory;
133 using mem_space =
typename DeviceType::memory_space;
134 using view_type = Kokkos::View<ValueType*, DeviceType>;
136 ValueType* ptr = getStaticKokkosMemory<ValueType>(mem_space(), size);
137 return view_type(ptr, size);
140 template <
class ValueType,
class DeviceType>
141 Kokkos::View<ValueType**, Kokkos::LayoutLeft, DeviceType>
142 getStatic2dView(
const size_t num_rows,
const size_t num_cols) {
143 using Impl::getStaticKokkosMemory;
144 using mem_space =
typename DeviceType::memory_space;
145 using view_type = Kokkos::View<ValueType**, Kokkos::LayoutLeft, DeviceType>;
147 const size_t size = num_rows * num_cols;
148 ValueType* ptr = getStaticKokkosMemory<ValueType>(mem_space(), size);
149 return view_type(ptr, num_rows, num_cols);
152 template <
class ValueType,
class DeviceType>
153 Kokkos::DualView<ValueType**, Kokkos::LayoutLeft, DeviceType>
154 getStatic2dDualView(
const size_t num_rows,
const size_t num_cols) {
155 using dual_view_type =
156 Kokkos::DualView<ValueType**, Kokkos::LayoutLeft, DeviceType>;
157 using d_view_type =
typename dual_view_type::t_dev;
158 using h_view_type =
typename dual_view_type::t_host;
160 auto d_view = getStatic2dView<ValueType, DeviceType>(num_rows, num_cols);
165 if (std::is_same<
typename d_view_type::memory_space,
166 typename h_view_type::memory_space>::value) {
167 h_view = Kokkos::create_mirror_view(d_view);
169 h_view = getStatic2dView<ValueType,
170 typename h_view_type::device_type>(num_rows, num_cols);
173 return dual_view_type(d_view, h_view);
179 #endif // TPETRA_DETAILS_STATICVIEW_HPP