10 #include "Tpetra_Details_StaticView.hpp"
22 constexpr
size_t minimum_initial_size =
sizeof(double) * 30 * 2;
28 #ifdef KOKKOS_ENABLE_CUDA
30 void* cuda_memory_ =
nullptr;
31 size_t cuda_memory_size_ = 0;
33 void finalize_cuda_memory() {
34 if (cuda_memory_ !=
nullptr) {
35 Kokkos::kokkos_free<Kokkos::CudaSpace>(cuda_memory_);
36 cuda_memory_ =
nullptr;
37 cuda_memory_size_ = 0;
41 void* cuda_uvm_memory_ =
nullptr;
42 size_t cuda_uvm_memory_size_ = 0;
44 void finalize_cuda_uvm_memory() {
45 if (cuda_uvm_memory_ !=
nullptr) {
46 Kokkos::kokkos_free<Kokkos::CudaUVMSpace>(cuda_uvm_memory_);
47 cuda_uvm_memory_ =
nullptr;
48 cuda_uvm_memory_size_ = 0;
52 void* cuda_host_pinned_memory_ =
nullptr;
53 size_t cuda_host_pinned_memory_size_ = 0;
55 void finalize_cuda_host_pinned_memory() {
56 if (cuda_host_pinned_memory_ !=
nullptr) {
57 Kokkos::kokkos_free<Kokkos::CudaHostPinnedSpace>(cuda_host_pinned_memory_);
58 cuda_host_pinned_memory_ =
nullptr;
59 cuda_host_pinned_memory_size_ = 0;
62 #endif // KOKKOS_ENABLE_CUDA
64 #ifdef KOKKOS_ENABLE_HIP
66 void* hip_memory_ =
nullptr;
67 size_t hip_memory_size_ = 0;
69 void finalize_hip_memory() {
70 if (hip_memory_ !=
nullptr) {
71 Kokkos::kokkos_free<Kokkos::HIPSpace>(hip_memory_);
72 hip_memory_ =
nullptr;
77 void* hip_host_pinned_memory_ =
nullptr;
78 size_t hip_host_pinned_memory_size_ = 0;
80 void finalize_hip_host_pinned_memory() {
81 if (hip_host_pinned_memory_ !=
nullptr) {
82 Kokkos::kokkos_free<Kokkos::HIPHostPinnedSpace>(hip_host_pinned_memory_);
83 hip_host_pinned_memory_ =
nullptr;
84 hip_host_pinned_memory_size_ = 0;
87 #endif // KOKKOS_ENABLE_HIP
89 #ifdef KOKKOS_ENABLE_SYCL
91 void* sycl_memory_ =
nullptr;
92 size_t sycl_memory_size_ = 0;
94 void finalize_sycl_memory() {
95 if (sycl_memory_ !=
nullptr) {
96 Kokkos::kokkos_free<Kokkos::Experimental::SYCLDeviceUSMSpace>(sycl_memory_);
97 sycl_memory_ =
nullptr;
98 sycl_memory_size_ = 0;
102 void* sycl_shared_memory_ =
nullptr;
103 size_t sycl_shared_memory_size_ = 0;
105 void finalize_sycl_shared_memory() {
106 if (sycl_shared_memory_ !=
nullptr) {
107 Kokkos::kokkos_free<Kokkos::Experimental::SYCLSharedUSMSpace>(sycl_shared_memory_);
108 sycl_shared_memory_ =
nullptr;
109 sycl_shared_memory_size_ = 0;
112 #endif // KOKKOS_ENABLE_SYCL
114 void* host_memory_ =
nullptr;
115 size_t host_memory_size_ = 0;
117 void finalize_host_memory() {
118 if (host_memory_ !=
nullptr) {
119 Kokkos::kokkos_free<Kokkos::HostSpace>(host_memory_);
120 host_memory_ =
nullptr;
121 host_memory_size_ = 0;
127 #ifdef KOKKOS_ENABLE_CUDA
129 void* StaticKokkosAllocation<Kokkos::CudaSpace>::
130 resize(Kokkos::CudaSpace ,
132 using memory_space = Kokkos::CudaSpace;
133 static bool created_finalize_hook =
false;
135 if (size > cuda_memory_size_) {
136 if (cuda_memory_ !=
nullptr) {
137 Kokkos::kokkos_free<memory_space>(cuda_memory_);
139 const size_t req_size = size > minimum_initial_size ? size : minimum_initial_size;
140 cuda_memory_ = Kokkos::kokkos_malloc<memory_space>(req_size);
141 cuda_memory_size_ = size;
143 if (!created_finalize_hook) {
144 Kokkos::push_finalize_hook(finalize_cuda_memory);
145 created_finalize_hook =
true;
151 void* StaticKokkosAllocation<Kokkos::CudaUVMSpace>::
152 resize(Kokkos::CudaUVMSpace ,
154 using memory_space = Kokkos::CudaUVMSpace;
155 static bool created_finalize_hook =
false;
157 const size_t req_size = size > minimum_initial_size ? size : minimum_initial_size;
158 if (req_size > cuda_uvm_memory_size_) {
159 if (cuda_uvm_memory_ !=
nullptr) {
160 Kokkos::kokkos_free<memory_space>(cuda_uvm_memory_);
162 cuda_uvm_memory_ = Kokkos::kokkos_malloc<memory_space>(req_size);
163 cuda_uvm_memory_size_ = req_size;
165 if (!created_finalize_hook) {
166 Kokkos::push_finalize_hook(finalize_cuda_uvm_memory);
167 created_finalize_hook =
true;
170 return cuda_uvm_memory_;
173 void* StaticKokkosAllocation<Kokkos::CudaHostPinnedSpace>::
174 resize(Kokkos::CudaHostPinnedSpace ,
176 using memory_space = Kokkos::CudaHostPinnedSpace;
177 static bool created_finalize_hook =
false;
179 const size_t req_size = size > minimum_initial_size ? size : minimum_initial_size;
180 if (req_size > cuda_host_pinned_memory_size_) {
181 if (cuda_host_pinned_memory_ !=
nullptr) {
182 Kokkos::kokkos_free<memory_space>(cuda_host_pinned_memory_);
184 cuda_host_pinned_memory_ = Kokkos::kokkos_malloc<memory_space>(req_size);
185 cuda_host_pinned_memory_size_ = req_size;
187 if (!created_finalize_hook) {
188 Kokkos::push_finalize_hook(finalize_cuda_host_pinned_memory);
189 created_finalize_hook =
true;
192 return cuda_host_pinned_memory_;
195 #endif // KOKKOS_ENABLE_CUDA
197 #ifdef KOKKOS_ENABLE_HIP
199 void* StaticKokkosAllocation<Kokkos::HIPSpace>::
200 resize(Kokkos::HIPSpace ,
202 using memory_space = Kokkos::HIPSpace;
203 static bool created_finalize_hook =
false;
205 if (size > hip_memory_size_) {
206 if (hip_memory_ !=
nullptr) {
207 Kokkos::kokkos_free<memory_space>(hip_memory_);
209 const size_t req_size = size > minimum_initial_size ? size : minimum_initial_size;
210 hip_memory_ = Kokkos::kokkos_malloc<memory_space>(req_size);
211 hip_memory_size_ = size;
213 if (!created_finalize_hook) {
214 Kokkos::push_finalize_hook(finalize_hip_memory);
215 created_finalize_hook =
true;
221 void* StaticKokkosAllocation<Kokkos::HIPHostPinnedSpace>::
222 resize(Kokkos::HIPHostPinnedSpace ,
224 using memory_space = Kokkos::HIPHostPinnedSpace;
225 static bool created_finalize_hook =
false;
227 const size_t req_size = size > minimum_initial_size ? size : minimum_initial_size;
228 if (req_size > hip_host_pinned_memory_size_) {
229 if (hip_host_pinned_memory_ !=
nullptr) {
230 Kokkos::kokkos_free<memory_space>(hip_host_pinned_memory_);
232 hip_host_pinned_memory_ = Kokkos::kokkos_malloc<memory_space>(req_size);
233 hip_host_pinned_memory_size_ = req_size;
235 if (!created_finalize_hook) {
236 Kokkos::push_finalize_hook(finalize_hip_host_pinned_memory);
237 created_finalize_hook =
true;
240 return hip_host_pinned_memory_;
243 #endif // KOKKOS_ENABLE_HIP
245 #ifdef KOKKOS_ENABLE_SYCL
248 void* StaticKokkosAllocation<Kokkos::Experimental::SYCLDeviceUSMSpace>::
249 resize(Kokkos::Experimental::SYCLDeviceUSMSpace ,
251 using memory_space = Kokkos::Experimental::SYCLDeviceUSMSpace;
252 static bool created_finalize_hook =
false;
254 if (size > sycl_memory_size_) {
255 if (sycl_memory_ !=
nullptr) {
256 Kokkos::kokkos_free<memory_space>(sycl_memory_);
258 const size_t req_size = size > minimum_initial_size ? size : minimum_initial_size;
259 sycl_memory_ = Kokkos::kokkos_malloc<memory_space>(req_size);
260 sycl_memory_size_ = size;
262 if (!created_finalize_hook) {
263 Kokkos::push_finalize_hook(finalize_sycl_memory);
264 created_finalize_hook =
true;
271 void* StaticKokkosAllocation<Kokkos::Experimental::SYCLSharedUSMSpace>::
272 resize(Kokkos::Experimental::SYCLSharedUSMSpace ,
274 using memory_space = Kokkos::Experimental::SYCLSharedUSMSpace;
275 static bool created_finalize_hook =
false;
277 const size_t req_size = size > minimum_initial_size ? size : minimum_initial_size;
278 if (req_size > sycl_shared_memory_size_) {
279 if (sycl_shared_memory_ !=
nullptr) {
280 Kokkos::kokkos_free<memory_space>(sycl_shared_memory_);
282 sycl_shared_memory_ = Kokkos::kokkos_malloc<memory_space>(req_size);
283 sycl_shared_memory_size_ = req_size;
285 if (!created_finalize_hook) {
286 Kokkos::push_finalize_hook(finalize_sycl_shared_memory);
287 created_finalize_hook =
true;
290 return sycl_shared_memory_;
293 #endif // KOKKOS_ENABLE_SYCL
295 void* StaticKokkosAllocation<Kokkos::HostSpace>::
296 resize(Kokkos::HostSpace ,
298 using memory_space = Kokkos::HostSpace;
299 static bool created_finalize_hook =
false;
301 const size_t req_size = size > minimum_initial_size ? size : minimum_initial_size;
302 if (req_size > host_memory_size_) {
303 if (host_memory_ !=
nullptr) {
304 Kokkos::kokkos_free<memory_space>(host_memory_);
306 host_memory_ = Kokkos::kokkos_malloc<memory_space>(req_size);
307 host_memory_size_ = req_size;
309 if (!created_finalize_hook) {
310 Kokkos::push_finalize_hook(finalize_host_memory);
311 created_finalize_hook =
true;