7 #ifndef HEFFTE_BACKEND_VECTOR_H
8 #define HEFFTE_BACKEND_VECTOR_H
10 #ifdef Heffte_ENABLE_GPU
52 template<
typename scalar_type,
typename manipulator>
56 using value_type = scalar_type;
58 using backend_device =
typename manipulator::backend_device;
60 using stream_type =
typename backend_device::stream_type;
63 device_vector(
size_t num_entries = 0) :
66 device_data(manipulator::template allocate<scalar_type>(device.stream(), num_entries))
69 device_vector(backend_device
const &new_device,
size_t num_entries = 0) :
72 device_data(manipulator::template allocate<scalar_type>(device.stream(), num_entries))
75 device_vector(scalar_type
const *begin, scalar_type
const *end) :
76 device_vector(std::distance(begin, end)){
77 manipulator::copy_device_to_device(device.stream(), begin, num, device_data);
80 device_vector(backend_device
const &new_device, scalar_type
const *begin, scalar_type
const *end) :
81 device_vector(new_device, std::distance(begin, end)){
82 manipulator::copy_device_to_device(device.stream(), begin, num, device_data);
86 device_vector(
const device_vector<scalar_type, manipulator>& other) :
87 device_vector(other.device, other.num){
88 manipulator::copy_device_to_device(device.stream(), other.device_data, num, device_data);
91 device_vector(device_vector<scalar_type, manipulator> &&other) :
98 device_vector(scalar_type* &&raw_pointer,
size_t num_entries) :
104 device_vector(backend_device
const &new_device, scalar_type* &&raw_pointer,
size_t num_entries) :
111 ~device_vector(){ manipulator::free(device.stream(), device_data); }
114 void operator =(device_vector<scalar_type, manipulator>
const &other){
115 device_vector<scalar_type, manipulator> temp(other);
116 device = temp.device;
117 std::swap(num, temp.num);
118 std::swap(device_data, temp.device_data);
122 void operator =(device_vector<scalar_type, manipulator>&& other){
123 device_vector<scalar_type, manipulator> temp(std::move(other));
124 device = temp.device;
125 std::swap(num, temp.num);
126 std::swap(device_data, temp.device_data);
130 scalar_type* data(){
return device_data; }
132 const scalar_type* data()
const{
return device_data; }
135 size_t size()
const{
return num; }
137 bool empty()
const{
return (num == 0); }
140 scalar_type* release(){
146 stream_type device_stream(){
return device.stream(); }
148 stream_type device_stream()
const{
return device.stream(); }
152 backend_device device;
156 scalar_type *device_data;
171 void device_set(
int active_device);
177 void synchronize_default_stream();
T c11_exchange(T &obj, U &&new_value)
Replace with the C++ 2014 std::exchange later.
Definition: heffte_utils.h:36
Namespace containing all HeFFTe methods and classes.
Definition: heffte_backend_cuda.h:38