ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
memory_op.h
Go to the documentation of this file.
1#ifndef MODULE_DEVICE_MEMORY_H_
2#define MODULE_DEVICE_MEMORY_H_
3
4#include "types.h"
5
6#include <complex>
7#include <cstddef>
8
9namespace base_device
10{
11
12namespace memory
13{
14
15template <typename FPTYPE, typename Device>
17{
26 void operator()(FPTYPE*& arr, const size_t size, const char* record_in = nullptr);
27};
28
29template <typename FPTYPE, typename Device>
31{
40 void operator()(FPTYPE* arr, const int var, const size_t size);
41};
42
43template <typename FPTYPE, typename Device_out, typename Device_in>
45{
54 void operator()(FPTYPE* arr_out,
55 const FPTYPE* arr_in,
56 const size_t size);
57};
58
59template <typename FPTYPE_out, typename FPTYPE_in, typename Device_out, typename Device_in>
61{
70 void operator()(FPTYPE_out* arr_out,
71 const FPTYPE_in* arr_in,
72 const size_t size);
73};
74
75template <typename FPTYPE, typename Device>
77{
82 void operator()(FPTYPE* arr);
83};
84
85template <typename FPTYPE>
86void resize_memory(FPTYPE* arr, const size_t size, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
87
88template <typename FPTYPE>
89void set_memory(FPTYPE* arr, const int var, const size_t size, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
90
91template <typename FPTYPE>
92void synchronize_memory(FPTYPE* arr_out, const FPTYPE* arr_in, const size_t size, base_device::AbacusDevice_t device_type_out, base_device::AbacusDevice_t device_type_in);
93
94template <typename FPTYPE_out, typename FPTYPE_in>
95void cast_memory(FPTYPE_out* arr_out, const FPTYPE_in* arr_in, const size_t size, base_device::AbacusDevice_t device_type_out, base_device::AbacusDevice_t device_type_in);
96
97template <typename FPTYPE>
99
100#if __CUDA || __UT_USE_CUDA || __ROCM || __UT_USE_ROCM
101// Partially specialize operator for base_device::GpuDevice.
102template <typename FPTYPE>
103struct resize_memory_op<FPTYPE, base_device::DEVICE_GPU>
104{
105 void operator()(FPTYPE*& arr,
106 const size_t size,
107 const char* record_in = nullptr);
108};
109
110template <typename FPTYPE>
111struct set_memory_op<FPTYPE, base_device::DEVICE_GPU>
112{
113 void operator()(FPTYPE* arr, const int var, const size_t size);
114};
115
116template <typename FPTYPE>
117struct synchronize_memory_op<FPTYPE, base_device::DEVICE_CPU, base_device::DEVICE_GPU>
118{
119 void operator()(FPTYPE* arr_out,
120 const FPTYPE* arr_in,
121 const size_t size);
122};
123template <typename FPTYPE>
124struct synchronize_memory_op<FPTYPE, base_device::DEVICE_GPU, base_device::DEVICE_CPU>
125{
126 void operator()(FPTYPE* arr_out,
127 const FPTYPE* arr_in,
128 const size_t size);
129};
130template <typename FPTYPE>
131struct synchronize_memory_op<FPTYPE, base_device::DEVICE_GPU, base_device::DEVICE_GPU>
132{
133 void operator()(FPTYPE* arr_out,
134 const FPTYPE* arr_in,
135 const size_t size);
136
137};
138
139template <typename FPTYPE>
140struct delete_memory_op<FPTYPE, base_device::DEVICE_GPU>
141{
142 void operator()(FPTYPE* arr);
143};
144#endif // __CUDA || __UT_USE_CUDA || __ROCM || __UT_USE_ROCM
145
146#ifdef __DSP
147
148template <typename FPTYPE, typename Device>
149struct resize_memory_op_mt
150{
159 void operator()(FPTYPE*& arr, const size_t size, const char* record_in = nullptr);
160};
161
162template <typename FPTYPE, typename Device>
163struct delete_memory_op_mt
164{
169 void operator()(FPTYPE* arr);
170};
171
172#endif // __DSP
173
174} // end of namespace memory
175} // end of namespace base_device
176
181
186
191
196
201
206
219
221 = base_device::memory::synchronize_memory_op<std::complex<float>, base_device::DEVICE_CPU, base_device::DEVICE_CPU>;
223 = base_device::memory::synchronize_memory_op<std::complex<float>, base_device::DEVICE_GPU, base_device::DEVICE_CPU>;
225 = base_device::memory::synchronize_memory_op<std::complex<float>, base_device::DEVICE_CPU, base_device::DEVICE_GPU>;
227 = base_device::memory::synchronize_memory_op<std::complex<double>, base_device::DEVICE_CPU, base_device::DEVICE_CPU>;
229 = base_device::memory::synchronize_memory_op<std::complex<double>, base_device::DEVICE_GPU, base_device::DEVICE_CPU>;
231 = base_device::memory::synchronize_memory_op<std::complex<double>, base_device::DEVICE_CPU, base_device::DEVICE_GPU>;
232
245
246using castmem_c2z_h2h_op = base_device::memory::
247 cast_memory_op<std::complex<double>, std::complex<float>, base_device::DEVICE_CPU, base_device::DEVICE_CPU>;
248using castmem_c2z_h2d_op = base_device::memory::
249 cast_memory_op<std::complex<double>, std::complex<float>, base_device::DEVICE_GPU, base_device::DEVICE_CPU>;
250using castmem_c2z_d2h_op = base_device::memory::
251 cast_memory_op<std::complex<double>, std::complex<float>, base_device::DEVICE_CPU, base_device::DEVICE_GPU>;
252using castmem_z2c_h2h_op = base_device::memory::
253 cast_memory_op<std::complex<float>, std::complex<double>, base_device::DEVICE_CPU, base_device::DEVICE_CPU>;
254using castmem_z2c_h2d_op = base_device::memory::
255 cast_memory_op<std::complex<float>, std::complex<double>, base_device::DEVICE_GPU, base_device::DEVICE_CPU>;
256using castmem_z2c_d2h_op = base_device::memory::
257 cast_memory_op<std::complex<float>, std::complex<double>, base_device::DEVICE_CPU, base_device::DEVICE_GPU>;
258
259static base_device::DEVICE_CPU* cpu_ctx = {};
260static base_device::DEVICE_GPU* gpu_ctx = {};
261#endif // MODULE_DEVICE_MEMORY_H_
void cast_memory(FPTYPE_out *arr_out, const FPTYPE_in *arr_in, const size_t size, base_device::AbacusDevice_t device_type_out, base_device::AbacusDevice_t device_type_in)
Definition memory_op.cpp:424
void synchronize_memory(FPTYPE *arr_out, const FPTYPE *arr_in, const size_t size, base_device::AbacusDevice_t device_type_out, base_device::AbacusDevice_t device_type_in)
Definition memory_op.cpp:408
void resize_memory(FPTYPE *arr, const size_t size, base_device::AbacusDevice_t device_type)
Definition memory_op.cpp:387
void set_memory(FPTYPE *arr, const int var, const size_t size, base_device::AbacusDevice_t device_type)
Definition memory_op.cpp:398
void delete_memory(FPTYPE *arr, base_device::AbacusDevice_t device_type)
Definition memory_op.cpp:441
Definition device.cpp:21
AbacusDevice_t
Definition types.h:12
@ CpuDevice
Definition types.h:14
Definition memory_op.h:61
void operator()(FPTYPE_out *arr_out, const FPTYPE_in *arr_in, const size_t size)
memcpy for multi-device
Definition memory_op.h:77
void operator()(FPTYPE *arr)
free memory for multi-device
Definition memory_op.h:17
void operator()(FPTYPE *&arr, const size_t size, const char *record_in=nullptr)
Allocate memory for a given pointer. Note this op will free the pointer first.
Definition memory_op.h:31
void operator()(FPTYPE *arr, const int var, const size_t size)
memset for multi-device
void operator()(FPTYPE *arr_out, const FPTYPE *arr_in, const size_t size)
memcpy for multi-device