Ginkgo  Generated from pipelines/1556235455 branch based on develop. Ginkgo version 1.9.0
A numerical linear algebra library targeting many-core architectures
device_matrix_data.hpp
1 // SPDX-FileCopyrightText: 2017 - 2024 The Ginkgo authors
2 //
3 // SPDX-License-Identifier: BSD-3-Clause
4 
5 #ifndef GKO_PUBLIC_CORE_BASE_DEVICE_MATRIX_DATA_HPP_
6 #define GKO_PUBLIC_CORE_BASE_DEVICE_MATRIX_DATA_HPP_
7 
8 
9 #include <ginkgo/core/base/array.hpp>
10 #include <ginkgo/core/base/dim.hpp>
11 #include <ginkgo/core/base/exception_helpers.hpp>
12 #include <ginkgo/core/base/executor.hpp>
13 #include <ginkgo/core/base/matrix_data.hpp>
14 #include <ginkgo/core/base/temporary_clone.hpp>
15 
16 
17 namespace gko {
18 
19 
35 template <typename ValueType, typename IndexType>
37 public:
38  using value_type = ValueType;
39  using index_type = IndexType;
42 
52  explicit device_matrix_data(std::shared_ptr<const Executor> exec,
53  dim<2> size = {}, size_type num_entries = 0);
54 
63  device_matrix_data(std::shared_ptr<const Executor> exec,
64  const device_matrix_data& data);
65 
74  device_matrix_data(std::shared_ptr<const Executor> exec, dim<2> size,
75  array<index_type> row_idxs, array<index_type> col_idxs,
76  array<value_type> values);
77 
82  template <typename InputValueType, typename RowIndexType,
83  typename ColIndexType>
84  GKO_DEPRECATED(
85  "explicitly construct the gko::array arguments instead of passing "
86  "initializer lists")
87  device_matrix_data(std::shared_ptr<const Executor> exec, dim<2> size,
88  std::initializer_list<RowIndexType> row_idxs,
89  std::initializer_list<ColIndexType> col_idxs,
90  std::initializer_list<InputValueType> values)
91  : device_matrix_data{exec, size,
92  array<index_type>{exec, std::move(row_idxs)},
93  array<index_type>{exec, std::move(col_idxs)},
94  array<value_type>{exec, std::move(values)}}
95  {}
96 
103  host_type copy_to_host() const;
104 
115  std::shared_ptr<const Executor> exec, const host_type& data);
116 
120  void fill_zero();
121 
127  void sort_row_major();
128 
134  void remove_zeros();
135 
141  void sum_duplicates();
142 
148  std::shared_ptr<const Executor> get_executor() const
149  {
150  return values_.get_executor();
151  }
152 
158  dim<2> get_size() const { return size_; }
159 
165  GKO_DEPRECATED("use get_num_stored_elements()")
167 
173  size_type get_num_stored_elements() const { return values_.get_size(); }
174 
180  index_type* get_row_idxs() { return row_idxs_.get_data(); }
181 
187  const index_type* get_const_row_idxs() const
188  {
189  return row_idxs_.get_const_data();
190  }
191 
197  index_type* get_col_idxs() { return col_idxs_.get_data(); }
198 
204  const index_type* get_const_col_idxs() const
205  {
206  return col_idxs_.get_const_data();
207  }
208 
214  value_type* get_values() { return values_.get_data(); }
215 
221  const value_type* get_const_values() const
222  {
223  return values_.get_const_data();
224  }
225 
232  void resize_and_reset(size_type new_num_entries);
233 
241  void resize_and_reset(dim<2> new_size, size_type new_num_entries);
242 
246  struct arrays {
247  array<index_type> row_idxs;
248  array<index_type> col_idxs;
249  array<value_type> values;
250  };
251 
258  arrays empty_out();
259 
260 private:
261  dim<2> size_;
262  array<index_type> row_idxs_;
263  array<index_type> col_idxs_;
264  array<value_type> values_;
265 };
266 
267 
268 namespace detail {
269 
270 
271 template <typename ValueType, typename IndexType>
272 struct temporary_clone_helper<device_matrix_data<ValueType, IndexType>> {
273  static std::unique_ptr<device_matrix_data<ValueType, IndexType>> create(
274  std::shared_ptr<const Executor> exec,
275  device_matrix_data<ValueType, IndexType>* ptr, bool copy_data)
276  {
277  if (copy_data) {
278  return std::make_unique<device_matrix_data<ValueType, IndexType>>(
279  std::move(exec), *ptr);
280  } else {
281  return std::make_unique<device_matrix_data<ValueType, IndexType>>(
282  std::move(exec), ptr->get_size(),
283  ptr->get_num_stored_elements());
284  }
285  }
286 };
287 
288 template <typename ValueType, typename IndexType>
289 struct temporary_clone_helper<const device_matrix_data<ValueType, IndexType>> {
290  static std::unique_ptr<const device_matrix_data<ValueType, IndexType>>
291  create(std::shared_ptr<const Executor> exec,
292  const device_matrix_data<ValueType, IndexType>* ptr, bool)
293  {
294  return std::make_unique<const device_matrix_data<ValueType, IndexType>>(
295  std::move(exec), *ptr);
296  }
297 };
298 
299 
300 template <typename ValueType, typename IndexType>
301 class copy_back_deleter<device_matrix_data<ValueType, IndexType>>
302  : public copy_back_deleter_from_assignment<
303  device_matrix_data<ValueType, IndexType>> {
304 public:
305  using copy_back_deleter_from_assignment<device_matrix_data<
306  ValueType, IndexType>>::copy_back_deleter_from_assignment;
307 };
308 
309 
310 } // namespace detail
311 } // namespace gko
312 
313 
314 #endif // GKO_PUBLIC_CORE_BASE_DEVICE_MATRIX_DATA_HPP_
gko::device_matrix_data::copy_to_host
host_type copy_to_host() const
Copies the device_matrix_data entries to the host to return a regular matrix_data object with the sam...
gko::device_matrix_data::get_values
value_type * get_values()
Returns a pointer to the value array.
Definition: device_matrix_data.hpp:214
gko::device_matrix_data::get_const_row_idxs
const index_type * get_const_row_idxs() const
Returns a pointer to the constant row index array.
Definition: device_matrix_data.hpp:187
gko::matrix_data_entry
Type used to store nonzeros.
Definition: matrix_data.hpp:60
gko::device_matrix_data::get_executor
std::shared_ptr< const Executor > get_executor() const
Returns the executor used to store the device_matrix_data entries.
Definition: device_matrix_data.hpp:148
gko::device_matrix_data::get_row_idxs
index_type * get_row_idxs()
Returns a pointer to the row index array.
Definition: device_matrix_data.hpp:180
gko::device_matrix_data::create_from_host
static device_matrix_data create_from_host(std::shared_ptr< const Executor > exec, const host_type &data)
Creates a device_matrix_data object from the given host data on the given executor.
gko::size_type
std::size_t size_type
Integral type used for allocation quantities.
Definition: types.hpp:86
gko::device_matrix_data::remove_zeros
void remove_zeros()
Removes all zero entries from the storage.
gko::device_matrix_data::empty_out
arrays empty_out()
Moves out the internal arrays of the device_matrix_data object and resets it to an empty 0x0 matrix.
gko::device_matrix_data::sum_duplicates
void sum_duplicates()
Sums up all duplicate entries pointing to the same non-zero location.
gko
The Ginkgo namespace.
Definition: abstract_factory.hpp:20
gko::device_matrix_data::get_num_elems
size_type get_num_elems() const
Returns the number of stored elements of the matrix.
Definition: device_matrix_data.hpp:166
gko::array< index_type >
gko::device_matrix_data::get_col_idxs
index_type * get_col_idxs()
Returns a pointer to the column index array.
Definition: device_matrix_data.hpp:197
gko::dim< 2 >
gko::matrix_data
This structure is used as an intermediate data type to store a sparse matrix.
Definition: matrix_data.hpp:126
gko::array::get_data
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
gko::device_matrix_data::get_size
dim< 2 > get_size() const
Returns the dimensions of the matrix.
Definition: device_matrix_data.hpp:158
gko::device_matrix_data::get_const_values
const value_type * get_const_values() const
Returns a pointer to the constant value array.
Definition: device_matrix_data.hpp:221
gko::array::get_executor
std::shared_ptr< const Executor > get_executor() const noexcept
Returns the Executor associated with the array.
Definition: array.hpp:689
gko::device_matrix_data::get_num_stored_elements
size_type get_num_stored_elements() const
Returns the number of stored elements of the matrix.
Definition: device_matrix_data.hpp:173
gko::device_matrix_data::fill_zero
void fill_zero()
Fills the matrix entries with zeros.
gko::Executor
The first step in using the Ginkgo library consists of creating an executor.
Definition: executor.hpp:615
gko::array::get_const_data
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
gko::device_matrix_data::sort_row_major
void sort_row_major()
Sorts the matrix entries in row-major order This means that they will be sorted by row index first,...
gko::array::get_size
size_type get_size() const noexcept
Returns the number of elements in the array.
Definition: array.hpp:656
gko::device_matrix_data::device_matrix_data
device_matrix_data(std::shared_ptr< const Executor > exec, dim< 2 > size={}, size_type num_entries=0)
Initializes a new device_matrix_data object.
gko::device_matrix_data
This type is a device-side equivalent to matrix_data.
Definition: device_matrix_data.hpp:36
gko::device_matrix_data::resize_and_reset
void resize_and_reset(size_type new_num_entries)
Resizes the internal storage to the given number of stored matrix entries.
gko::device_matrix_data::get_const_col_idxs
const index_type * get_const_col_idxs() const
Returns a pointer to the constant column index array.
Definition: device_matrix_data.hpp:204
gko::device_matrix_data::arrays
Stores the internal arrays of a device_matrix_data object.
Definition: device_matrix_data.hpp:246