12 static_assert(std::is_same_v<T, float> || std::is_same_v<T, double>,
13 "now only support real number");
17 using auto_const_t =
typename Base::template auto_const_t<U>;
20 using CBufferView = CBufferView<T>;
21 using BufferView = BufferView<T>;
22 using ThisBufferView = std::conditional_t<IsConst, CBufferView, BufferView>;
26 using ThisViewer = std::conditional_t<IsConst, ConstViewer, NonConstViewer>;
28 using VectorType = Eigen::Vector<T, Eigen::Dynamic>;
31 Eigen::Map<U, Eigen::AlignmentType::Unaligned, Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>>;
32 using MapVector = MapVectorT<VectorType>;
33 using CMapVector = MapVectorT<const VectorType>;
34 using ThisMapVector = std::conditional_t<IsConst, CMapVector, MapVector>;
37 auto_const_t<T>* m_data;
40 int m_origin_size = 0;
47 , m_origin_size(origin_size)
51 MUDA_GENERIC
auto as_const()
const
53 return ConstViewer{m_data, m_offset, m_size, m_origin_size};
56 MUDA_GENERIC
operator ConstViewer()
const {
return as_const(); }
58 MUDA_GENERIC
auto segment(
int offset,
int size)
60 check_segment(offset, size);
61 auto ret = ThisViewer{m_data, m_offset + offset, size, m_origin_size};
62 ret.copy_label(*
this);
67 MUDA_GENERIC
auto segment(
int offset)
69 return segment(offset, N);
72 MUDA_GENERIC
auto segment(
int offset,
int size)
const
74 return remove_const(*this).segment(offset, size);
77 MUDA_GENERIC
const T& operator()(
int i)
const {
return m_data[index(i)]; }
78 MUDA_GENERIC auto_const_t<T>& operator()(
int i) {
return m_data[index(i)]; }
81 MUDA_GENERIC
auto segment(
int offset)
const
83 return remove_const(*this).segment(offset, N);
86 MUDA_GENERIC Eigen::VectorBlock<CMapVector> as_eigen()
const
89 return CMapVector{m_data,
91 Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>{1, 1}}
92 .segment(m_offset, m_size);
95 MUDA_GENERIC
operator Eigen::VectorBlock<CMapVector>()
const
100 MUDA_GENERIC Eigen::VectorBlock<ThisMapVector> as_eigen()
103 return ThisMapVector{m_data,
105 Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>{1, 1}}
106 .segment(m_offset, m_size);
109 MUDA_GENERIC
operator Eigen::VectorBlock<ThisMapVector>()
114 MUDA_GENERIC
auto size()
const {
return m_size; }
115 MUDA_GENERIC
auto offset()
const {
return m_offset; }
116 MUDA_GENERIC
auto origin_data()
const {
return m_data; }
117 MUDA_GENERIC
auto origin_size()
const {
return m_origin_size; }
121 MUDA_INLINE MUDA_GENERIC
void check_size_matching(
int N)
123 MUDA_KERNEL_ASSERT(m_size == N,
124 "DenseVectorViewerBase [%s:%s]: size not match, yours size=%d, expected size=%d",
131 MUDA_INLINE MUDA_GENERIC
int index(
int i)
const
133 MUDA_KERNEL_ASSERT(origin_data(),
134 "DenseVectorViewerBase [%s:%s]: data is null",
136 this->kernel_name());
137 MUDA_KERNEL_ASSERT(i < m_size,
138 "DenseVectorViewerBase [%s:%s]: index out of range, size=%d, yours index=%d",
146 MUDA_INLINE MUDA_GENERIC
void check_data()
const
148 MUDA_KERNEL_ASSERT(origin_data(),
149 "DenseVectorViewerBase [%s:%s]: data is null",
151 this->kernel_name());
154 MUDA_INLINE MUDA_GENERIC
void check_segment(
int offset,
int size)
const
156 MUDA_KERNEL_ASSERT(offset + size <= m_size,
157 "DenseVectorViewerBase [%s:%s]: segment out of range, m_size=%d, offset=%d, size=%d",
206 using MapVector =
typename Base::MapVector;
207 using CMapVector =
typename Base::CMapVector;
223 MUDA_GENERIC
auto segment(
int offset)
225 return segment(offset, N);
228 MUDA_DEVICE T atomic_add(
int i, T val)
230 auto ptr = &this->operator()(i);
231 return muda::atomic_add(ptr, val);
235 MUDA_DEVICE Eigen::Vector<T, N> atomic_add(
const Eigen::Vector<T, N>& val)
237 this->check_size_matching(N);
238 Eigen::Vector<T, N> ret;
240 for(
int i = 0; i < N; ++i)
242 ret(i) = atomic_add(i, val(i));
247 MUDA_DEVICE T atomic_add(
const T& val)
249 this->check_size_matching(1);
250 T ret = atomic_add(0, val);
257 this->check_size_matching(N);
259 for(
int i = 0; i < N; ++i)
261 this->operator()(i) = other(i);