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
segmented_array.hpp
1// SPDX-FileCopyrightText: 2017 - 2024 The Ginkgo authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#ifndef GKO_PUBLIC_CORE_BASE_SEGMENTED_ARRAY_HPP_
6#define GKO_PUBLIC_CORE_BASE_SEGMENTED_ARRAY_HPP_
7
8
9#include <numeric>
10
11#include <ginkgo/config.hpp>
12#include <ginkgo/core/base/array.hpp>
13
14
15namespace gko {
16
26template <typename T>
33 explicit segmented_array(std::shared_ptr<const Executor> exec);
34
42
50 const gko::array<int64>& sizes);
51
59
69 gko::array<int64> offsets);
70
77 segmented_array(std::shared_ptr<const Executor> exec,
78 const segmented_array& other);
79
86 segmented_array(std::shared_ptr<const Executor> exec,
87 segmented_array&& other);
88
89 segmented_array(const segmented_array& other);
90
91 segmented_array(segmented_array&& other) noexcept(false);
92
93 segmented_array& operator=(const segmented_array& other);
94
95 segmented_array& operator=(segmented_array&&) noexcept(false);
96
103
110
117
123 const T* get_const_flat_data() const;
124
130 const gko::array<int64>& get_offsets() const;
131
137 std::shared_ptr<const Executor> get_executor() const;
138
139private:
140 gko::array<T> buffer_;
141 gko::array<int64> offsets_;
142};
143
144
145namespace detail {
146
147
148template <typename T>
149struct temporary_clone_helper<segmented_array<T>> {
150 static std::unique_ptr<segmented_array<T>> create(
151 std::shared_ptr<const Executor> exec, segmented_array<T>* ptr,
152 bool copy_data)
153 {
154 if (copy_data) {
155 return std::make_unique<segmented_array<T>>(
156 make_array_view(exec, ptr->get_size(), ptr->get_flat_data()),
157 ptr->get_offsets());
158 } else {
159 return std::make_unique<segmented_array<T>>(std::move(exec),
160 ptr->get_offsets());
161 }
162 }
163};
164
165template <typename T>
166struct temporary_clone_helper<const segmented_array<T>> {
167 static std::unique_ptr<const segmented_array<T>> create(
168 std::shared_ptr<const Executor> exec, const segmented_array<T>* ptr,
169 bool)
170 {
171 return std::make_unique<segmented_array<T>>(
172 make_array_view(exec, ptr->get_size(), ptr->get_const_flat_data()),
173 ptr->get_offsets());
174 }
175};
176
177
178template <typename T>
179class copy_back_deleter<segmented_array<T>>
180 : public copy_back_deleter_from_assignment<segmented_array<T>> {
181public:
182 using copy_back_deleter_from_assignment<
183 segmented_array<T>>::copy_back_deleter_from_assignment;
184};
185
186
187} // namespace detail
188} // namespace gko
189
190#endif // GKO_PUBLIC_CORE_BASE_SEGMENTED_ARRAY_HPP_
The first step in using the Ginkgo library consists of creating an executor.
Definition executor.hpp:615
An array is a container which encapsulates fixed-sized arrays, stored on the Executor tied to the arr...
Definition logger.hpp:25
The Ginkgo namespace.
Definition abstract_factory.hpp:20
array< ValueType > make_array_view(std::shared_ptr< const Executor > exec, size_type size, ValueType *data)
Helper function to create an array view deducing the value type.
Definition array.hpp:787
std::int64_t int64
64-bit signed integral type.
Definition types.hpp:112
std::size_t size_type
Integral type used for allocation quantities.
Definition types.hpp:89
STL namespace.
A minimal interface for a segmented array.
Definition segmented_array.hpp:27
const T * get_const_flat_data() const
Const-access to the flat buffer.
segmented_array(std::shared_ptr< const Executor > exec, const segmented_array &other)
Copies a segmented array to a different executor.
static segmented_array create_from_offsets(gko::array< T > buffer, gko::array< int64 > offsets)
Creates a segmented array from a flat buffer and offsets.
segmented_array(std::shared_ptr< const Executor > exec)
Create an empty segmented array.
static segmented_array create_from_sizes(gko::array< T > buffer, const gko::array< int64 > &sizes)
Creates a segmented array from a flat buffer and segment sizes.
size_type get_segment_count() const
Get the number of segments.
segmented_array(std::shared_ptr< const Executor > exec, segmented_array &&other)
Moves a segmented array to a different executor.
T * get_flat_data()
Access to the flat buffer.
size_type get_size() const
Get the total size of the stored buffer.
std::shared_ptr< const Executor > get_executor() const
Access the executor.
static segmented_array create_from_sizes(const gko::array< int64 > &sizes)
Creates an uninitialized segmented array with predefined segment sizes.
const gko::array< int64 > & get_offsets() const
Access to the segment offsets.
static segmented_array create_from_offsets(gko::array< int64 > offsets)
Creates an uninitialized segmented array from offsets.