MUDA
Loading...
Searching...
No Matches
device_dense_vector.inl
1#include <muda/check/check_cusparse.h>
2#include <muda/ext/linear_system/type_mapper/data_type_mapper.h>
3
4namespace muda
5{
6template <typename T>
7DeviceDenseVector<T>::DeviceDenseVector(size_t size)
8{
9 this->resize(size);
10}
11template <typename T>
12DeviceDenseVector<T>::~DeviceDenseVector()
13{
14 if(m_descr)
15 checkCudaErrors(cusparseDestroyDnVec(m_descr));
16}
17template <typename T>
18DeviceDenseVector<T>::DeviceDenseVector(const DeviceDenseVector<T>& other)
19 : m_data{other.m_data}
20{
21 checkCudaErrors(cusparseCreateDnVec(
22 &m_descr, m_data.size(), m_data.data(), cuda_data_type<T>()));
23}
24template <typename T>
25DeviceDenseVector<T>::DeviceDenseVector(DeviceDenseVector<T>&& other)
26 : m_data{std::move(other.m_data)}
27 , m_descr{other.m_descr}
28{
29 other.m_descr = nullptr;
30}
31template <typename T>
32DeviceDenseVector<T>& DeviceDenseVector<T>::operator=(const DeviceDenseVector<T>& other)
33{
34 if(this != &other)
35 {
36 m_data = other.m_data;
37 if(m_descr)
38 checkCudaErrors(cusparseDestroyDnVec(m_descr));
39 checkCudaErrors(cusparseCreateDnVec(
40 &m_descr, m_data.size(), m_data.data(), cuda_data_type<T>()));
41 }
42 return *this;
43}
44template <typename T>
45DeviceDenseVector<T>& DeviceDenseVector<T>::operator=(DeviceDenseVector<T>&& other)
46{
47 if(this != &other)
48 {
49 m_data = std::move(other.m_data);
50 m_descr = other.m_descr;
51 other.m_descr = nullptr;
52 }
53 return *this;
54}
55template <typename T>
56void DeviceDenseVector<T>::reserve(size_t size)
57{
58 m_data.reserve(size);
59}
60template <typename T>
61void DeviceDenseVector<T>::resize(size_t size)
62{
63 if(m_descr)
64 {
65 checkCudaErrors(cusparseDestroyDnVec(m_descr));
66 }
67
68 m_data.resize(size);
69
70 checkCudaErrors(
71 cusparseCreateDnVec(&m_descr, size, m_data.data(), cuda_data_type<T>()));
72}
73template <typename T>
74void DeviceDenseVector<T>::fill(T value)
75{
76 m_data.fill(value);
77}
78template <typename T>
79void DeviceDenseVector<T>::copy_to(Eigen::VectorX<T>& vec) const
80{
81 vec.resize(m_data.size());
82 m_data.view().copy_to(vec.data());
83}
84template <typename T>
85void DeviceDenseVector<T>::copy_to(std::vector<T>& vec) const
86{
87 vec.resize(m_data.size());
88 m_data.view().copy_to(vec.data());
89}
90template <typename T>
91DeviceDenseVector<T>::DeviceDenseVector(const Eigen::VectorX<T>& vec)
92{
93 this->resize(vec.size());
94 m_data.view().copy_from(vec.data());
95}
96template <typename T>
97DeviceDenseVector<T>& DeviceDenseVector<T>::operator=(const Eigen::VectorX<T>& vec)
98{
99 this->resize(vec.size());
100 m_data.view().copy_from(vec.data());
101 return *this;
102}
103
104template <typename T>
105CDenseVectorView<T> DeviceDenseVector<T>::view() const
106{
107 return CDenseVectorView<T>{m_data.data(), descr(), 0, 1, (int)size(), (int)size()};
108}
109
110template <typename T>
111DenseVectorView<T> DeviceDenseVector<T>::view()
112{
113 return DenseVectorView<T>{m_data.data(), descr(), 0, 1, (int)size(), (int)size()};
114}
115} // namespace muda