42 #include "Tpetra_Details_StaticView.hpp"
54 constexpr
size_t minimum_initial_size =
sizeof (double) * 30 * 2;
60 #ifdef KOKKOS_ENABLE_CUDA
62 void* cuda_memory_ =
nullptr;
63 size_t cuda_memory_size_ = 0;
65 void finalize_cuda_memory ()
67 if (cuda_memory_ !=
nullptr) {
68 Kokkos::kokkos_free<Kokkos::CudaSpace> (cuda_memory_);
69 cuda_memory_ =
nullptr;
70 cuda_memory_size_ = 0;
74 void* cuda_uvm_memory_ =
nullptr;
75 size_t cuda_uvm_memory_size_ = 0;
77 void finalize_cuda_uvm_memory ()
79 if (cuda_uvm_memory_ !=
nullptr) {
80 Kokkos::kokkos_free<Kokkos::CudaUVMSpace> (cuda_uvm_memory_);
81 cuda_uvm_memory_ =
nullptr;
82 cuda_uvm_memory_size_ = 0;
86 void* cuda_host_pinned_memory_ =
nullptr;
87 size_t cuda_host_pinned_memory_size_ = 0;
89 void finalize_cuda_host_pinned_memory ()
91 if (cuda_host_pinned_memory_ !=
nullptr) {
92 Kokkos::kokkos_free<Kokkos::CudaHostPinnedSpace> (cuda_host_pinned_memory_);
93 cuda_host_pinned_memory_ =
nullptr;
94 cuda_host_pinned_memory_size_ = 0;
97 #endif // KOKKOS_ENABLE_CUDA
99 #ifdef KOKKOS_ENABLE_HIP
101 void* hip_memory_ =
nullptr;
102 size_t hip_memory_size_ = 0;
104 void finalize_hip_memory ()
106 if (hip_memory_ !=
nullptr) {
107 Kokkos::kokkos_free<Kokkos::HIPSpace> (hip_memory_);
108 hip_memory_ =
nullptr;
109 hip_memory_size_ = 0;
113 void* hip_host_pinned_memory_ =
nullptr;
114 size_t hip_host_pinned_memory_size_ = 0;
116 void finalize_hip_host_pinned_memory ()
118 if (hip_host_pinned_memory_ !=
nullptr) {
119 Kokkos::kokkos_free<Kokkos::HIPHostPinnedSpace> (hip_host_pinned_memory_);
120 hip_host_pinned_memory_ =
nullptr;
121 hip_host_pinned_memory_size_ = 0;
124 #endif // KOKKOS_ENABLE_HIP
126 #ifdef KOKKOS_ENABLE_SYCL
128 void* sycl_memory_ =
nullptr;
129 size_t sycl_memory_size_ = 0;
131 void finalize_sycl_memory ()
133 if (sycl_memory_ !=
nullptr) {
134 Kokkos::kokkos_free<Kokkos::Experimental::SYCLDeviceUSMSpace> (sycl_memory_);
135 sycl_memory_ =
nullptr;
136 sycl_memory_size_ = 0;
140 void* sycl_shared_memory_ =
nullptr;
141 size_t sycl_shared_memory_size_ = 0;
143 void finalize_sycl_shared_memory ()
145 if (sycl_shared_memory_ !=
nullptr) {
146 Kokkos::kokkos_free<Kokkos::Experimental::SYCLSharedUSMSpace> (sycl_shared_memory_);
147 sycl_shared_memory_ =
nullptr;
148 sycl_shared_memory_size_ = 0;
151 #endif // KOKKOS_ENABLE_SYCL
153 void* host_memory_ =
nullptr;
154 size_t host_memory_size_ = 0;
156 void finalize_host_memory ()
158 if (host_memory_ !=
nullptr) {
159 Kokkos::kokkos_free<Kokkos::HostSpace> (host_memory_);
160 host_memory_ =
nullptr;
161 host_memory_size_ = 0;
167 #ifdef KOKKOS_ENABLE_CUDA
170 StaticKokkosAllocation<Kokkos::CudaSpace>::
171 resize (Kokkos::CudaSpace ,
174 using memory_space = Kokkos::CudaSpace;
175 static bool created_finalize_hook =
false;
177 if (size > cuda_memory_size_) {
178 if (cuda_memory_ !=
nullptr) {
179 Kokkos::kokkos_free<memory_space> (cuda_memory_);
181 const size_t req_size = size > minimum_initial_size ? size : minimum_initial_size;
182 cuda_memory_ = Kokkos::kokkos_malloc<memory_space> (req_size);
183 cuda_memory_size_ = size;
185 if (! created_finalize_hook) {
186 Kokkos::push_finalize_hook (finalize_cuda_memory);
187 created_finalize_hook =
true;
194 StaticKokkosAllocation<Kokkos::CudaUVMSpace>::
195 resize (Kokkos::CudaUVMSpace ,
198 using memory_space = Kokkos::CudaUVMSpace;
199 static bool created_finalize_hook =
false;
201 const size_t req_size = size > minimum_initial_size ? size : minimum_initial_size;
202 if (req_size > cuda_uvm_memory_size_) {
203 if (cuda_uvm_memory_ !=
nullptr) {
204 Kokkos::kokkos_free<memory_space> (cuda_uvm_memory_);
206 cuda_uvm_memory_ = Kokkos::kokkos_malloc<memory_space> (req_size);
207 cuda_uvm_memory_size_ = req_size;
209 if (! created_finalize_hook) {
210 Kokkos::push_finalize_hook (finalize_cuda_uvm_memory);
211 created_finalize_hook =
true;
214 return cuda_uvm_memory_;
218 StaticKokkosAllocation<Kokkos::CudaHostPinnedSpace>::
219 resize (Kokkos::CudaHostPinnedSpace ,
222 using memory_space = Kokkos::CudaHostPinnedSpace;
223 static bool created_finalize_hook =
false;
225 const size_t req_size = size > minimum_initial_size ? size : minimum_initial_size;
226 if (req_size > cuda_host_pinned_memory_size_) {
227 if (cuda_host_pinned_memory_ !=
nullptr) {
228 Kokkos::kokkos_free<memory_space> (cuda_host_pinned_memory_);
230 cuda_host_pinned_memory_ = Kokkos::kokkos_malloc<memory_space> (req_size);
231 cuda_host_pinned_memory_size_ = req_size;
233 if (! created_finalize_hook) {
234 Kokkos::push_finalize_hook (finalize_cuda_host_pinned_memory);
235 created_finalize_hook =
true;
238 return cuda_host_pinned_memory_;
241 #endif // KOKKOS_ENABLE_CUDA
243 #ifdef KOKKOS_ENABLE_HIP
246 StaticKokkosAllocation<Kokkos::HIPSpace>::
247 resize (Kokkos::HIPSpace ,
250 using memory_space = Kokkos::HIPSpace;
251 static bool created_finalize_hook =
false;
253 if (size > hip_memory_size_) {
254 if (hip_memory_ !=
nullptr) {
255 Kokkos::kokkos_free<memory_space> (hip_memory_);
257 const size_t req_size = size > minimum_initial_size ? size : minimum_initial_size;
258 hip_memory_ = Kokkos::kokkos_malloc<memory_space> (req_size);
259 hip_memory_size_ = size;
261 if (! created_finalize_hook) {
262 Kokkos::push_finalize_hook (finalize_hip_memory);
263 created_finalize_hook =
true;
270 StaticKokkosAllocation<Kokkos::HIPHostPinnedSpace>::
271 resize (Kokkos::HIPHostPinnedSpace ,
274 using memory_space = Kokkos::HIPHostPinnedSpace;
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 > hip_host_pinned_memory_size_) {
279 if (hip_host_pinned_memory_ !=
nullptr) {
280 Kokkos::kokkos_free<memory_space> (hip_host_pinned_memory_);
282 hip_host_pinned_memory_ = Kokkos::kokkos_malloc<memory_space> (req_size);
283 hip_host_pinned_memory_size_ = req_size;
285 if (! created_finalize_hook) {
286 Kokkos::push_finalize_hook (finalize_hip_host_pinned_memory);
287 created_finalize_hook =
true;
290 return hip_host_pinned_memory_;
293 #endif // KOKKOS_ENABLE_HIP
295 #ifdef KOKKOS_ENABLE_SYCL
299 StaticKokkosAllocation<Kokkos::Experimental::SYCLDeviceUSMSpace>::
300 resize (Kokkos::Experimental::SYCLDeviceUSMSpace ,
303 using memory_space = Kokkos::Experimental::SYCLDeviceUSMSpace;
304 static bool created_finalize_hook =
false;
306 if (size > sycl_memory_size_) {
307 if (sycl_memory_ !=
nullptr) {
308 Kokkos::kokkos_free<memory_space> (sycl_memory_);
310 const size_t req_size = size > minimum_initial_size ? size : minimum_initial_size;
311 sycl_memory_ = Kokkos::kokkos_malloc<memory_space> (req_size);
312 sycl_memory_size_ = size;
314 if (! created_finalize_hook) {
315 Kokkos::push_finalize_hook (finalize_sycl_memory);
316 created_finalize_hook =
true;
324 StaticKokkosAllocation<Kokkos::Experimental::SYCLSharedUSMSpace>::
325 resize (Kokkos::Experimental::SYCLSharedUSMSpace ,
328 using memory_space = Kokkos::Experimental::SYCLSharedUSMSpace;
329 static bool created_finalize_hook =
false;
331 const size_t req_size = size > minimum_initial_size ? size : minimum_initial_size;
332 if (req_size > sycl_shared_memory_size_) {
333 if (sycl_shared_memory_ !=
nullptr) {
334 Kokkos::kokkos_free<memory_space> (sycl_shared_memory_);
336 sycl_shared_memory_ = Kokkos::kokkos_malloc<memory_space> (req_size);
337 sycl_shared_memory_size_ = req_size;
339 if (! created_finalize_hook) {
340 Kokkos::push_finalize_hook (finalize_sycl_shared_memory);
341 created_finalize_hook =
true;
344 return sycl_shared_memory_;
347 #endif // KOKKOS_ENABLE_SYCL
350 StaticKokkosAllocation<Kokkos::HostSpace>::
351 resize (Kokkos::HostSpace ,
354 using memory_space = Kokkos::HostSpace;
355 static bool created_finalize_hook =
false;
357 const size_t req_size = size > minimum_initial_size ? size : minimum_initial_size;
358 if (req_size > host_memory_size_) {
359 if (host_memory_ !=
nullptr) {
360 Kokkos::kokkos_free<memory_space> (host_memory_);
362 host_memory_ = Kokkos::kokkos_malloc<memory_space> (req_size);
363 host_memory_size_ = req_size;
365 if (! created_finalize_hook) {
366 Kokkos::push_finalize_hook (finalize_host_memory);
367 created_finalize_hook =
true;