MUDA
Loading...
Searching...
No Matches
dense_vector_view.h
1#pragma once
2#include <cusparse_v2.h>
3#include <muda/ext/linear_system/dense_vector_viewer.h>
5#include <muda/view/view_base.h>
6namespace muda
7{
8template <bool IsConst, typename T>
9class DenseVectorViewBase : public ViewBase<IsConst>
10{
11 static_assert(std::is_same_v<T, float> || std::is_same_v<T, double>,
12 "now only support real number");
13
14 using Base = ViewBase<IsConst>;
15 template <typename U>
16 using auto_const_t = typename Base::template auto_const_t<U>;
17
18 public:
22
23 using CBufferView = CBufferView<T>;
24 using BufferView = BufferView<T>;
25 using ThisBufferView = std::conditional_t<IsConst, CBufferView, BufferView>;
26
29 using ThisViewer = std::conditional_t<IsConst, CViewer, Viewer>;
30
31 protected:
32 auto_const_t<T>* m_data = nullptr;
33 mutable cusparseDnVecDescr_t m_descr = nullptr;
34 int m_offset = -1;
35 int m_inc = -1;
36 int m_size = -1;
37 int m_origin_size = -1;
38
39 public:
40 DenseVectorViewBase() = default;
41
42 DenseVectorViewBase(auto_const_t<T>* data,
43 cusparseDnVecDescr_t descr,
44 int offset,
45 int inc,
46 int size,
47 int origin_size)
48 : m_data(data)
49 , m_descr(descr)
50 , m_offset(offset)
51 , m_inc(inc)
52 , m_size(size)
53 , m_origin_size(origin_size)
54 {
55 }
56
57 ConstView as_const() const
58 {
59 return ConstView{m_data, m_descr, m_offset, m_inc, m_size, m_origin_size};
60 }
61 operator ConstView() const { return as_const(); }
62
63 // non-const accessor
64 auto viewer()
65 {
66 return ThisViewer{m_data, m_offset, m_size, m_origin_size};
67 }
68 auto buffer_view()
69 {
70 return ThisBufferView{m_data, size_t(m_offset), size_t(m_inc * m_size)};
71 }
72
73 auto data() { return m_data + m_offset; }
74 auto origin_data() { return m_data; }
75
76 // const accessor
77 auto offset() const { return m_offset; }
78 auto size() const { return m_size; }
79 auto data() const { return m_data + m_offset; }
80 auto origin_data() const { return m_data; }
81
82 CBufferView buffer_view() const
83 {
84 return remove_const(*this).buffer_view();
85 }
86
87 auto cviewer() const
88 {
89 MUDA_KERNEL_ASSERT(inc() == 1, "When using cviewer(), inc!=1 is not allowed");
90 return CViewer{m_data, m_offset, m_size, m_origin_size};
91 }
92
93 auto inc() const { return m_inc; }
94
95 auto descr() const
96 {
97 MUDA_KERNEL_ASSERT(inc() == 1, "When using descr(), inc!=1 is not allowed");
98 return m_descr;
99 }
100
101 auto subview(int offset, int size)
102 {
103 MUDA_KERNEL_ASSERT(inc() == 1, "When using subview(), inc!=1 is not allowed");
104 MUDA_KERNEL_ASSERT(offset + size <= m_size, "subview out of range");
105 return ThisView{m_data, m_descr, m_offset + offset, m_inc, size, m_origin_size};
106 }
107
108 auto subview(int offset, int size) const
109 {
110 MUDA_KERNEL_ASSERT(inc() == 1, "When using subview(), inc!=1 is not allowed");
111 MUDA_KERNEL_ASSERT(offset + size <= m_size, "subview out of range");
112 return ConstView{m_data, m_descr, m_offset + offset, m_inc, size, m_origin_size};
113 }
114};
115
116template <typename Ty>
118template <typename Ty>
120} // namespace muda
121
122namespace muda
123{
124template <typename Ty>
126{
128};
129
130template <typename Ty>
132{
134};
135} // namespace muda
136
137
138#include "details/dense_vector_view.inl"
A view interface for any array-like liner memory, which can be constructed from DeviceBuffer/DeviceVe...
Definition dense_vector_viewer.h:173
Definition dense_vector_view.h:10
Definition dense_vector_viewer.h:202
Definition view_base.h:8
Definition type_modifier.h:22
Definition type_modifier.h:28