Ginkgo Generated from branch based on main. Ginkgo version 1.9.0
A numerical linear algebra library targeting many-core architectures
Loading...
Searching...
No Matches
sellp.hpp
1// SPDX-FileCopyrightText: 2017 - 2024 The Ginkgo authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#ifndef GKO_PUBLIC_CORE_MATRIX_SELLP_HPP_
6#define GKO_PUBLIC_CORE_MATRIX_SELLP_HPP_
7
8
9#include <ginkgo/core/base/array.hpp>
10#include <ginkgo/core/base/lin_op.hpp>
11
12
13namespace gko {
14namespace matrix {
15
16
17constexpr int default_slice_size = 64;
18constexpr int default_stride_factor = 1;
19
20
21template <typename ValueType>
22class Dense;
23
24template <typename ValueType, typename IndexType>
25class Csr;
26
42template <typename ValueType = default_precision, typename IndexType = int32>
43class Sellp : public EnableLinOp<Sellp<ValueType, IndexType>>,
44 public ConvertibleTo<Sellp<next_precision<ValueType>, IndexType>>,
45#if GINKGO_ENABLE_HALF
46 public ConvertibleTo<
47 Sellp<next_precision<next_precision<ValueType>>, IndexType>>,
48#endif
49 public ConvertibleTo<Dense<ValueType>>,
50 public ConvertibleTo<Csr<ValueType, IndexType>>,
51 public DiagonalExtractable<ValueType>,
52 public ReadableFromMatrixData<ValueType, IndexType>,
53 public WritableToMatrixData<ValueType, IndexType>,
55 remove_complex<Sellp<ValueType, IndexType>>> {
56 friend class EnablePolymorphicObject<Sellp, LinOp>;
57 friend class Dense<ValueType>;
58 friend class Csr<ValueType, IndexType>;
59 friend class Sellp<to_complex<ValueType>, IndexType>;
60
61public:
62 using EnableLinOp<Sellp>::convert_to;
63 using EnableLinOp<Sellp>::move_to;
64 using ConvertibleTo<
65 Sellp<next_precision<ValueType>, IndexType>>::convert_to;
66 using ConvertibleTo<Sellp<next_precision<ValueType>, IndexType>>::move_to;
67 using ConvertibleTo<Dense<ValueType>>::convert_to;
68 using ConvertibleTo<Dense<ValueType>>::move_to;
71 using ReadableFromMatrixData<ValueType, IndexType>::read;
72
73 using value_type = ValueType;
74 using index_type = IndexType;
77 using absolute_type = remove_complex<Sellp>;
78
79 friend class Sellp<previous_precision<ValueType>, IndexType>;
80
81 void convert_to(
82 Sellp<next_precision<ValueType>, IndexType>* result) const override;
83
84 void move_to(Sellp<next_precision<ValueType>, IndexType>* result) override;
85
86#if GINKGO_ENABLE_HALF
87 friend class Sellp<previous_precision<previous_precision<ValueType>>,
88 IndexType>;
90 IndexType>>::convert_to;
91 using ConvertibleTo<
93
94 void convert_to(Sellp<next_precision<next_precision<ValueType>>, IndexType>*
95 result) const override;
96
97 void move_to(Sellp<next_precision<next_precision<ValueType>>, IndexType>*
98 result) override;
99#endif
100
101 void convert_to(Dense<ValueType>* other) const override;
102
103 void move_to(Dense<ValueType>* other) override;
104
105 void convert_to(Csr<ValueType, IndexType>* other) const override;
106
107 void move_to(Csr<ValueType, IndexType>* other) override;
108
109 void read(const mat_data& data) override;
110
111 void read(const device_mat_data& data) override;
112
113 void read(device_mat_data&& data) override;
114
115 void write(mat_data& data) const override;
116
117 std::unique_ptr<Diagonal<ValueType>> extract_diagonal() const override;
118
119 std::unique_ptr<absolute_type> compute_absolute() const override;
120
122
128 value_type* get_values() noexcept { return values_.get_data(); }
129
137 const value_type* get_const_values() const noexcept
138 {
139 return values_.get_const_data();
140 }
141
147 index_type* get_col_idxs() noexcept { return col_idxs_.get_data(); }
148
156 const index_type* get_const_col_idxs() const noexcept
157 {
158 return col_idxs_.get_const_data();
159 }
160
167 {
168 return slice_lengths_.get_data();
169 }
170
178 const size_type* get_const_slice_lengths() const noexcept
179 {
180 return slice_lengths_.get_const_data();
181 }
182
188 size_type* get_slice_sets() noexcept { return slice_sets_.get_data(); }
189
197 const size_type* get_const_slice_sets() const noexcept
198 {
199 return slice_sets_.get_const_data();
200 }
201
207 size_type get_slice_size() const noexcept { return slice_size_; }
208
214 size_type get_stride_factor() const noexcept { return stride_factor_; }
215
221 size_type get_total_cols() const noexcept
222 {
223 return values_.get_size() / slice_size_;
224 }
225
232 {
233 return values_.get_size();
234 }
235
248 value_type& val_at(size_type row, size_type slice_set,
249 size_type idx) noexcept
250 {
251 return values_.get_data()[this->linearize_index(row, slice_set, idx)];
252 }
253
257 value_type val_at(size_type row, size_type slice_set,
258 size_type idx) const noexcept
259 {
260 return values_
261 .get_const_data()[this->linearize_index(row, slice_set, idx)];
262 }
263
276 index_type& col_at(size_type row, size_type slice_set,
277 size_type idx) noexcept
278 {
279 return this->get_col_idxs()[this->linearize_index(row, slice_set, idx)];
280 }
281
285 index_type col_at(size_type row, size_type slice_set,
286 size_type idx) const noexcept
287 {
288 return this
289 ->get_const_col_idxs()[this->linearize_index(row, slice_set, idx)];
290 }
291
302 static std::unique_ptr<Sellp> create(std::shared_ptr<const Executor> exec,
303 const dim<2>& size = {},
304 size_type total_cols = 0);
305
318 static std::unique_ptr<Sellp> create(std::shared_ptr<const Executor> exec,
319 const dim<2>& size,
320 size_type slice_size,
321 size_type stride_factor,
322 size_type total_cols);
323
329
336
341 Sellp(const Sellp&);
342
349
350protected:
351 Sellp(std::shared_ptr<const Executor> exec, const dim<2>& size = {},
352 size_type total_cols = {});
353
354 Sellp(std::shared_ptr<const Executor> exec, const dim<2>& size,
355 size_type slice_size, size_type stride_factor, size_type total_cols);
356
357 void apply_impl(const LinOp* b, LinOp* x) const override;
358
359 void apply_impl(const LinOp* alpha, const LinOp* b, const LinOp* beta,
360 LinOp* x) const override;
361
362 size_type linearize_index(size_type row, size_type slice_set,
363 size_type col) const noexcept
364 {
365 return (slice_set + col) * slice_size_ + row;
366 }
367
368private:
369 array<value_type> values_;
370 array<index_type> col_idxs_;
371 array<size_type> slice_lengths_;
372 array<size_type> slice_sets_;
373 size_type slice_size_;
374 size_type stride_factor_;
375};
376
377
378} // namespace matrix
379} // namespace gko
380
381
382#endif // GKO_PUBLIC_CORE_MATRIX_SELLP_HPP_
ConvertibleTo interface is used to mark that the implementer can be converted to the object of Result...
Definition polymorphic_object.hpp:470
The diagonal of a LinOp implementing this interface can be extracted.
Definition lin_op.hpp:743
The EnableAbsoluteComputation mixin provides the default implementations of compute_absolute_linop an...
Definition lin_op.hpp:794
The EnableLinOp mixin can be used to provide sensible default implementations of the majority of the ...
Definition lin_op.hpp:879
This mixin inherits from (a subclass of) PolymorphicObject and provides a base implementation of a ne...
Definition polymorphic_object.hpp:662
Definition lin_op.hpp:117
A LinOp implementing this interface can read its data from a matrix_data structure.
Definition lin_op.hpp:605
A LinOp implementing this interface can write its data to a matrix_data structure.
Definition lin_op.hpp:660
value_type * get_data() noexcept
Returns a pointer to the block of memory used to store the elements of the array.
Definition array.hpp:673
const value_type * get_const_data() const noexcept
Returns a constant pointer to the block of memory used to store the elements of the array.
Definition array.hpp:682
size_type get_size() const noexcept
Returns the number of elements in the array.
Definition array.hpp:656
This type is a device-side equivalent to matrix_data.
Definition device_matrix_data.hpp:36
CSR is a matrix format which stores only the nonzero coefficients by compressing each row of the matr...
Definition sparsity_csr.hpp:21
Dense is a matrix format which explicitly stores all values of the matrix.
Definition sparsity_csr.hpp:25
SELL-P is a matrix format similar to ELL format.
Definition sellp.hpp:55
size_type get_slice_size() const noexcept
Returns the size of a slice.
Definition sellp.hpp:207
value_type & val_at(size_type row, size_type slice_set, size_type idx) noexcept
Returns the idx-th non-zero element of the row-th row with slice_set slice set.
Definition sellp.hpp:248
static std::unique_ptr< Sellp > create(std::shared_ptr< const Executor > exec, const dim< 2 > &size, size_type slice_size, size_type stride_factor, size_type total_cols)
Creates an uninitialized Sellp matrix of the specified size.
index_type & col_at(size_type row, size_type slice_set, size_type idx) noexcept
Returns the idx-th column index of the row-th row with slice_set slice set.
Definition sellp.hpp:276
Sellp(const Sellp &)
Copy-assigns a Sellp matrix.
std::unique_ptr< absolute_type > compute_absolute() const override
Gets the AbsoluteLinOp.
value_type * get_values() noexcept
Returns the values of the matrix.
Definition sellp.hpp:128
Sellp & operator=(Sellp &&)
Move-assigns a Sellp matrix.
size_type get_stride_factor() const noexcept
Returns the stride factor(t) of SELL-P.
Definition sellp.hpp:214
const size_type * get_const_slice_sets() const noexcept
Returns the offsets of slices.
Definition sellp.hpp:197
index_type * get_col_idxs() noexcept
Returns the column indexes of the matrix.
Definition sellp.hpp:147
size_type get_total_cols() const noexcept
Returns the total column number.
Definition sellp.hpp:221
index_type col_at(size_type row, size_type slice_set, size_type idx) const noexcept
Returns the idx-th column index of the row-th row with slice_set slice set.
Definition sellp.hpp:285
size_type * get_slice_lengths() noexcept
Returns the lengths(columns) of slices.
Definition sellp.hpp:166
Sellp & operator=(const Sellp &)
Copy-assigns a Sellp matrix.
void compute_absolute_inplace() override
Compute absolute inplace on each element.
static std::unique_ptr< Sellp > create(std::shared_ptr< const Executor > exec, const dim< 2 > &size={}, size_type total_cols=0)
Creates an uninitialized Sellp matrix of the specified size.
size_type * get_slice_sets() noexcept
Returns the offsets of slices.
Definition sellp.hpp:188
size_type get_num_stored_elements() const noexcept
Returns the number of elements explicitly stored in the matrix.
Definition sellp.hpp:231
value_type val_at(size_type row, size_type slice_set, size_type idx) const noexcept
Returns the idx-th non-zero element of the row-th row with slice_set slice set.
Definition sellp.hpp:257
const index_type * get_const_col_idxs() const noexcept
Returns the column indexes of the matrix.
Definition sellp.hpp:156
Sellp(Sellp &&)
Move-assigns a Sellp matrix.
std::unique_ptr< Diagonal< ValueType > > extract_diagonal() const override
Extracts the diagonal entries of the matrix into a vector.
const size_type * get_const_slice_lengths() const noexcept
Returns the lengths(columns) of slices.
Definition sellp.hpp:178
const value_type * get_const_values() const noexcept
Returns the values of the matrix.
Definition sellp.hpp:137
The Ginkgo namespace.
Definition abstract_factory.hpp:20
typename detail::remove_complex_s< T >::type remove_complex
Obtain the type which removed the complex of complex/scalar type or the template parameter of class b...
Definition math.hpp:260
typename detail::next_precision_impl< T >::type next_precision
Obtains the next type in the singly-linked precision list with half.
Definition math.hpp:438
typename detail::to_complex_s< T >::type to_complex
Obtain the type which adds the complex of complex/scalar type or the template parameter of class by a...
Definition math.hpp:279
std::size_t size_type
Integral type used for allocation quantities.
Definition types.hpp:89
std::unique_ptr< MatrixType > read(StreamType &&is, MatrixArgs &&... args)
Reads a matrix stored in matrix market format from an input stream.
Definition mtx_io.hpp:159
A type representing the dimensions of a multidimensional object.
Definition dim.hpp:26
This structure is used as an intermediate data type to store a sparse matrix.
Definition matrix_data.hpp:126