11 static_assert(std::is_same_v<T, float> || std::is_same_v<T, double>,
12 "now only support real number");
13 static_assert(!std::is_const_v<T>,
"T must be non-const type");
17 using auto_const_t =
typename Base::template auto_const_t<U>;
20 using CBuffer2DView = CBuffer2DView<T>;
21 using Buffer2DView = Buffer2DView<T>;
22 using ThisBuffer2DView = std::conditional_t<IsConst, CBuffer2DView, Buffer2DView>;
26 using ThisViewer = std::conditional_t<IsConst, ConstViewer, NonConstViewer>;
28 using MatrixType = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor>;
31 Eigen::Map<U, Eigen::AlignmentType::Unaligned, Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>>;
32 using MapMatrix = MapMatrixT<MatrixType>;
33 using CMapMatrix = MapMatrixT<const MatrixType>;
34 using ThisMapMatrix = std::conditional_t<IsConst, CMapMatrix, MapMatrix>;
37 ThisBuffer2DView m_view;
38 size_t m_row_offset = 0;
39 size_t m_col_offset = 0;
40 size_t m_row_size = 0;
41 size_t m_col_size = 0;
50 , m_row_offset(row_offset)
51 , m_col_offset(col_offset)
52 , m_row_size(row_size)
53 , m_col_size(col_size)
59 MUDA_GENERIC
auto as_const()
const
61 return ConstViewer{m_view, m_row_offset, m_col_offset, m_row_size, m_col_size};
64 MUDA_GENERIC
operator ConstViewer()
const {
return as_const(); }
68 MUDA_GENERIC ThisViewer block(
size_t row_offset,
size_t col_offset,
size_t row_size,
size_t col_size);
69 template <
int M,
int N>
70 MUDA_GENERIC ThisViewer block(
int row_offset,
int col_offset)
72 return block(row_offset, col_offset, M, N);
74 MUDA_GENERIC Eigen::Block<ThisMapMatrix> as_eigen();
75 MUDA_GENERIC
operator Eigen::Block<CMapMatrix>();
76 MUDA_GENERIC auto_const_t<T>& operator()(
size_t i,
size_t j);
77 MUDA_GENERIC
auto buffer_view() {
return m_view; }
81 MUDA_GENERIC
ConstViewer block(
size_t row_offset,
size_t col_offset,
size_t row_size,
size_t col_size)
const
83 return remove_const(*this).block(row_offset, col_offset, row_size, col_size);
85 template <
int M,
int N>
86 MUDA_GENERIC
ConstViewer block(
int row_offset,
int col_offset)
const
88 return remove_const(*this).block<M, N>(row_offset, col_offset);
90 MUDA_GENERIC Eigen::Block<CMapMatrix> as_eigen()
const;
91 MUDA_GENERIC
operator Eigen::Block<CMapMatrix>()
const
95 MUDA_GENERIC
const T& operator()(
size_t i,
size_t j)
const
97 return remove_const(*
this)(i, j);
100 MUDA_GENERIC
size_t row()
const {
return m_row_size; }
101 MUDA_GENERIC
size_t col()
const {
return m_col_size; }
102 MUDA_GENERIC
size_t origin_row()
const;
103 MUDA_GENERIC
size_t origin_col()
const;
104 MUDA_GENERIC
auto buffer_view()
const {
return m_view; }
105 MUDA_GENERIC
auto row_offset()
const {
return m_row_offset; }
106 MUDA_GENERIC
auto col_offset()
const {
return m_col_offset; }
146 using MapMatrix =
typename Base::MapMatrix;
147 using CMapMatrix =
typename Base::CMapMatrix;
159 MUDA_GENERIC
DenseMatrixViewer block(
size_t row_offset,
size_t col_offset,
size_t row_size,
size_t col_size)
161 return Base::block(row_offset, col_offset, row_size, col_size);
164 template <
size_t M,
size_t N>
167 return Base::template block<M, N>(row_offset, col_offset);
170 MUDA_DEVICE T atomic_add(
size_t i,
size_t j, T val);
172 template <
int M,
int N>
173 MUDA_DEVICE Eigen::Matrix<T, M, N> atomic_add(
const Eigen::Matrix<T, M, N>& other);
175 template <
int M,
int N>
179 MUDA_GENERIC
void check_size_matching(
int M,
int N)
const;