BioCMAMC-ST
kokkos_eigen.hpp
1#ifndef __KOKKOS_EIGEN_HPP__
2#define __KOKKOS_EIGEN_HPP__
3
4#include <Eigen/Core>
5#include <Eigen/Sparse>
6#include <Kokkos_Core.hpp>
7#include <Kokkos_DualView.hpp>
8#include <type_traits>
9
10namespace KokkosEigen
11{
12
13 static constexpr int CompileMatrixSizeEigen = -1;
14
21 template <typename _layout>
22 static consteval auto
24 {
25 if constexpr (std::is_same_v<_layout, Kokkos::LayoutLeft>)
26 {
27 return Eigen::ColMajor;
28 }
29 else if constexpr (std::is_same_v<_layout, Kokkos::LayoutRight>)
30 {
31 return Eigen::RowMajor;
32 }
33 else
34 {
35 static_assert(std::is_same_v<_layout, void>, "Unsupported layout");
36 }
37 }
38
47 template <typename data_type,
48 typename layout = Kokkos::LayoutLeft,
49 typename exec = void,
50 typename args = void>
52 {
53
55 static constexpr auto eigen_layout = get_eigen_layout<layout>();
57 using view_type = Kokkos::DualView<data_type**, layout, exec, args>;
59 using eigen_mat_type = Eigen::Matrix<data_type,
63
65 using eigen_array_type = Eigen::Array<data_type,
69
70 public:
72 using eigen_map_type = Eigen::Map<eigen_mat_type>;
73
74 private:
77
78 template <typename m_type>
79 auto
81 {
82 return m_type(
83 m_view.view_host().data(), m_view.extent(0), m_view.extent(1));
84 }
85
86 public:
87 using view_layout = layout;
88 using float_type = data_type;
90 using host_view_type = view_type::t_host;
92 using device_view_type = view_type::t_dev;
94 using const_device_view_type = view_type::t_dev_const;
95
100 KokkosEigen2D(std::string label, std::size_t n, std::size_t m)
101 : m_view(label, n, m), m_eigen_map(get_map<eigen_map_type>())
102 {
103 }
104
105 KokkosEigen2D() : m_view(), m_eigen_map(nullptr, 0, 0)
106 {
107 }
108
110
111 KokkosEigen2D& operator=(KokkosEigen2D&& rhs) noexcept = delete;
112
114 KokkosEigen2D(const KokkosEigen2D&) = delete;
115 ~KokkosEigen2D() = default;
116
119 {
120 return m_eigen_map;
121 }
122
123 const eigen_map_type&
124 cst_eigen() const
125 {
126 return m_eigen_map;
127 }
128
129 view_type&
131 {
132 return m_view;
133 }
134
137 {
138 return m_view.view_host();
139 }
140
143 {
144 return m_view.view_device();
145 }
146
149 {
150 return m_view.view_device();
151 }
152
153 [[nodiscard]] std::size_t
154 n_row() const
155 {
156 return m_view.extent(0);
157 }
158 [[nodiscard]] std::size_t
159 n_col() const
160 {
161 return m_view.extent(1);
162 }
163
164 void
166 {
167 m_view.template modify<typename view_type::host_mirror_space>();
168 m_view.template sync<typename view_type::execution_space>();
169 }
170
171 void
173 {
174 m_view.template modify<typename view_type::execution_space>();
175 m_view.template sync<typename view_type::host_mirror_space>();
176 }
177
180 {
181 return m_eigen_map.array();
182 }
183
185 as_array() const
186 {
187 return m_eigen_map.array();
188 }
189
190 void
191 set_host(std::size_t i_r, std::size_t i_c, data_type&& value)
192 {
193 m_view.view_host()(i_r, i_c) = value;
194 }
195 data_type&
196 get_host(std::size_t i_r, std::size_t i_c)
197 {
198 return m_view.view_host()(i_r, i_c);
199 }
200
201 [[nodiscard]] std::span<const double>
202 get_span() const
203 {
204 const auto size = n_col() * n_row();
205 return { m_view.view_host().data(), size };
206 }
207
208 std::span<double>
210 {
211 const auto size = n_col() * n_row();
212 return { m_view.view_host().data(), size };
213 }
214 };
215
216 namespace Alias
217 {
218
223 template <typename ftype>
224 requires(std::is_floating_point_v<ftype>)
225 using DiagonalType = Eigen::DiagonalMatrix<ftype, CompileMatrixSizeEigen>;
226
233 template <typename Layout, typename ftype>
234 using MatrixType = Eigen::Matrix<ftype,
238
243 template <typename ftype>
244 requires(std::is_floating_point_v<ftype>)
246
251 template <typename Layout, typename ftype>
252 requires(std::is_floating_point_v<ftype>)
254 = Eigen::SparseMatrix<ftype, get_eigen_layout<Layout>()>;
255
256 } // namespace Alias
257
258} // namespace KokkosEigen
259
260#endif
view_type::t_dev device_view_type
underlying const device view
Definition kokkos_eigen.hpp:92
std::span< double > get_span()
Definition kokkos_eigen.hpp:209
void set_host(std::size_t i_r, std::size_t i_c, data_type &&value)
Definition kokkos_eigen.hpp:191
KokkosEigen2D(const KokkosEigen2D &)=delete
eigen_array_type as_array()
Definition kokkos_eigen.hpp:179
Eigen::Matrix< data_type, CompileMatrixSizeEigen, CompileMatrixSizeEigen, eigen_layout > eigen_mat_type
dynamic Eigen array type
Definition kokkos_eigen.hpp:59
const_device_view_type device_view_cst() const
Definition kokkos_eigen.hpp:142
host_view_type host_view()
Definition kokkos_eigen.hpp:136
data_type & get_host(std::size_t i_r, std::size_t i_c)
Definition kokkos_eigen.hpp:196
void device_to_host_sync()
Definition kokkos_eigen.hpp:172
eigen_array_type as_array() const
Definition kokkos_eigen.hpp:185
std::size_t n_col() const
Definition kokkos_eigen.hpp:159
Eigen::Array< data_type, CompileMatrixSizeEigen, CompileMatrixSizeEigen, eigen_layout > eigen_array_type
Definition kokkos_eigen.hpp:65
view_type & view()
Definition kokkos_eigen.hpp:130
data_type float_type
underlying host view
Definition kokkos_eigen.hpp:88
view_type::t_host host_view_type
underlying device view
Definition kokkos_eigen.hpp:90
Eigen::Map< eigen_mat_type > eigen_map_type
< map over raw data type
Definition kokkos_eigen.hpp:72
layout view_layout
Definition kokkos_eigen.hpp:87
std::span< const double > get_span() const
Definition kokkos_eigen.hpp:202
eigen_map_type & eigen()
Definition kokkos_eigen.hpp:118
view_type::t_dev_const const_device_view_type
Definition kokkos_eigen.hpp:94
device_view_type device_view() const
Definition kokkos_eigen.hpp:148
const eigen_map_type & cst_eigen() const
Definition kokkos_eigen.hpp:124
void host_to_device_sync()
Definition kokkos_eigen.hpp:165
Kokkos::DualView< data_type **, layout, exec, args > view_type
dynamic Eigen matrix type
Definition kokkos_eigen.hpp:57
KokkosEigen2D(KokkosEigen2D &&)=delete
std::size_t n_row() const
Definition kokkos_eigen.hpp:154
KokkosEigen2D & operator=(KokkosEigen2D &&rhs) noexcept=delete
auto get_map()
Definition kokkos_eigen.hpp:80
KokkosEigen2D & operator=(const KokkosEigen2D &)=delete
KokkosEigen2D(std::string label, std::size_t n, std::size_t m)
Allocates Object of shape (n x m) on host and device.
Definition kokkos_eigen.hpp:100
KokkosEigen2D()
Definition kokkos_eigen.hpp:105
Definition kokkos_eigen.hpp:217
Eigen::SparseMatrix< ftype, get_eigen_layout< Layout >()> SparseMatrixType
Template type for eigen sparse matrix object.
Definition kokkos_eigen.hpp:253
Eigen::Matrix< ftype, CompileMatrixSizeEigen, CompileMatrixSizeEigen, get_eigen_layout< Layout >()> MatrixType
Template type for eigen matrix object.
Definition kokkos_eigen.hpp:234
Eigen::DiagonalMatrix< ftype, CompileMatrixSizeEigen > DiagonalType
Template type for eigen diagonal object.
Definition kokkos_eigen.hpp:225
MatrixType< Kokkos::LayoutLeft, ftype > ColMajorMatrixtype
Template type for colmajor eigen matrix object.
Definition kokkos_eigen.hpp:245
Definition kokkos_eigen.hpp:11
static constexpr int CompileMatrixSizeEigen
Definition kokkos_eigen.hpp:13
static consteval auto get_eigen_layout()
Maps a Kokkos layout type to its Eigen storage order equivalent.
Definition kokkos_eigen.hpp:23