Ginkgo  Generated from pipelines/1478841010 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 
122  void sort_row_major();
123 
129  void remove_zeros();
130 
136  void sum_duplicates();
137 
143  std::shared_ptr<const Executor> get_executor() const
144  {
145  return values_.get_executor();
146  }
147 
153  dim<2> get_size() const { return size_; }
154 
160  GKO_DEPRECATED("use get_num_stored_elements()")
162 
168  size_type get_num_stored_elements() const { return values_.get_size(); }
169 
175  index_type* get_row_idxs() { return row_idxs_.get_data(); }
176 
182  const index_type* get_const_row_idxs() const
183  {
184  return row_idxs_.get_const_data();
185  }
186 
192  index_type* get_col_idxs() { return col_idxs_.get_data(); }
193 
199  const index_type* get_const_col_idxs() const
200  {
201  return col_idxs_.get_const_data();
202  }
203 
209  value_type* get_values() { return values_.get_data(); }
210 
216  const value_type* get_const_values() const
217  {
218  return values_.get_const_data();
219  }
220 
227  void resize_and_reset(size_type new_num_entries);
228 
236  void resize_and_reset(dim<2> new_size, size_type new_num_entries);
237 
241  struct arrays {
242  array<index_type> row_idxs;
243  array<index_type> col_idxs;
244  array<value_type> values;
245  };
246 
253  arrays empty_out();
254 
255 private:
256  dim<2> size_;
257  array<index_type> row_idxs_;
258  array<index_type> col_idxs_;
259  array<value_type> values_;
260 };
261 
262 
263 namespace detail {
264 
265 
266 template <typename ValueType, typename IndexType>
267 struct temporary_clone_helper<device_matrix_data<ValueType, IndexType>> {
268  static std::unique_ptr<device_matrix_data<ValueType, IndexType>> create(
269  std::shared_ptr<const Executor> exec,
270  device_matrix_data<ValueType, IndexType>* ptr, bool copy_data)
271  {
272  if (copy_data) {
273  return std::make_unique<device_matrix_data<ValueType, IndexType>>(
274  std::move(exec), *ptr);
275  } else {
276  return std::make_unique<device_matrix_data<ValueType, IndexType>>(
277  std::move(exec), ptr->get_size(),
278  ptr->get_num_stored_elements());
279  }
280  }
281 };
282 
283 template <typename ValueType, typename IndexType>
284 struct temporary_clone_helper<const device_matrix_data<ValueType, IndexType>> {
285  static std::unique_ptr<const device_matrix_data<ValueType, IndexType>>
286  create(std::shared_ptr<const Executor> exec,
287  const device_matrix_data<ValueType, IndexType>* ptr, bool)
288  {
289  return std::make_unique<const device_matrix_data<ValueType, IndexType>>(
290  std::move(exec), *ptr);
291  }
292 };
293 
294 
295 template <typename ValueType, typename IndexType>
296 class copy_back_deleter<device_matrix_data<ValueType, IndexType>>
297  : public copy_back_deleter_from_assignment<
298  device_matrix_data<ValueType, IndexType>> {
299 public:
300  using copy_back_deleter_from_assignment<device_matrix_data<
301  ValueType, IndexType>>::copy_back_deleter_from_assignment;
302 };
303 
304 
305 } // namespace detail
306 } // namespace gko
307 
308 
309 #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:209
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:182
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:143
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:175
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:161
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:192
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:153
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:216
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:168
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:199
gko::device_matrix_data::arrays
Stores the internal arrays of a device_matrix_data object.
Definition: device_matrix_data.hpp:241