5#ifndef GKO_PUBLIC_CORE_DISTRIBUTED_VECTOR_HPP_
6#define GKO_PUBLIC_CORE_DISTRIBUTED_VECTOR_HPP_
9#include <ginkgo/config.hpp>
15#include <ginkgo/core/base/dense_cache.hpp>
16#include <ginkgo/core/base/mpi.hpp>
17#include <ginkgo/core/distributed/base.hpp>
18#include <ginkgo/core/distributed/lin_op.hpp>
19#include <ginkgo/core/matrix/dense.hpp>
23namespace experimental {
28template <
typename ValueType>
35template <
typename LocalIndexType,
typename GlobalIndexType>
66template <
typename ValueType =
double>
71 public DistributedBase {
76 friend class detail::VectorCache<ValueType>;
81 using ConvertibleTo<Vector<next_precision_base<ValueType>>>::convert_to;
82 using ConvertibleTo<Vector<next_precision_base<ValueType>>>::move_to;
84 using value_type = ValueType;
86 using real_type = absolute_type;
87 using complex_type = Vector<to_complex<value_type>>;
485 size_type get_stride() const noexcept {
return local_.get_stride(); }
498 static std::unique_ptr<Vector>
create(std::shared_ptr<const Executor> exec,
514 static std::unique_ptr<Vector>
create(std::shared_ptr<const Executor> exec,
538 dim<2> global_size, std::unique_ptr<local_vector_type> local_vector);
560 std::unique_ptr<local_vector_type> local_vector);
577 std::unique_ptr<const local_vector_type> local_vector);
593 std::unique_ptr<const local_vector_type> local_vector);
599 explicit Vector(std::shared_ptr<const Executor> exec,
604 dim<2> global_size, std::unique_ptr<local_vector_type> local_vector);
607 std::unique_ptr<local_vector_type> local_vector);
611 template <
typename LocalIndexType,
typename GlobalIndexType>
612 void read_distributed_impl(
614 const Partition<LocalIndexType, GlobalIndexType>* partition);
616 void apply_impl(
const LinOp*,
LinOp*)
const override;
619 LinOp*)
const override;
627 virtual std::unique_ptr<Vector> create_with_same_config()
const;
641 virtual std::unique_ptr<Vector> create_with_type_of_impl(
642 std::shared_ptr<const Executor> exec,
const dim<2>& global_size,
646 local_vector_type local_;
647 ::gko::detail::DenseCache<ValueType> host_reduction_buffer_;
648 ::gko::detail::DenseCache<remove_complex<ValueType>> host_norm_buffer_;
659template <
typename TargetType>
660struct conversion_target_helper;
672template <
typename ValueType>
673struct conversion_target_helper<experimental::distributed::Vector<ValueType>> {
674 using target_type = experimental::distributed::Vector<ValueType>;
676 experimental::distributed::Vector<previous_precision_base<ValueType>>;
678 static std::unique_ptr<target_type> create_empty(
const source_type* source)
680 return target_type::create(source->get_executor(),
681 source->get_communicator());
ConvertibleTo interface is used to mark that the implementer can be converted to the object of Result...
Definition polymorphic_object.hpp:470
The EnableAbsoluteComputation mixin provides the default implementations of compute_absolute_linop an...
Definition lin_op.hpp:794
Definition lin_op.hpp:117
LinOp(const LinOp &)=default
Copy-constructs a LinOp.
An array is a container which encapsulates fixed-sized arrays, stored on the Executor tied to the arr...
Definition array.hpp:166
This type is a device-side equivalent to matrix_data.
Definition device_matrix_data.hpp:36
This mixin does the same as EnableLinOp, but for concrete types that are derived from distributed::Di...
Definition lin_op.hpp:44
This mixin does the same as EnablePolymorphicObject, but for concrete types that are derived from dis...
Definition polymorphic_object.hpp:53
Represents a partition of a range of indices [0, size) into a disjoint set of parts.
Definition partition.hpp:82
value_type at_local(size_type row, size_type col) const noexcept
void compute_mean(ptr_param< LinOp > result) const
Computes the column-wise mean of this (multi-)vector using a global reduction.
static std::unique_ptr< Vector > create(std::shared_ptr< const Executor > exec, mpi::communicator comm, dim< 2 > global_size, dim< 2 > local_size, size_type stride)
Creates an empty distributed vector with a specified size.
void compute_norm2(ptr_param< LinOp > result) const
Computes the Euclidean (L^2) norm of this (multi-)vector using a global reduction.
void read_distributed(const matrix_data< ValueType, int64 > &data, ptr_param< const Partition< int64, int64 > > partition)
Reads a vector from the matrix_data structure and a global row partition.
void make_complex(ptr_param< complex_type > result) const
Writes a complex copy of the original vectors to given complex vectors.
std::unique_ptr< real_type > create_real_view()
Create a real view of the (potentially) complex original multi-vector.
void compute_squared_norm2(ptr_param< LinOp > result, array< char > &tmp) const
Computes the square of the column-wise Euclidean ( ) norm of this (multi-)vector using a global reduc...
static std::unique_ptr< Vector > create(std::shared_ptr< const Executor > exec, mpi::communicator comm, dim< 2 > global_size={}, dim< 2 > local_size={})
Creates an empty distributed vector with a specified size.
std::unique_ptr< real_type > get_real() const
Creates new real vectors and extracts the real part of the original vectors into that.
static std::unique_ptr< const Vector > create_const(std::shared_ptr< const Executor > exec, mpi::communicator comm, dim< 2 > global_size, std::unique_ptr< const local_vector_type > local_vector)
Creates a constant (immutable) distributed Vector from a constant local vector.
std::unique_ptr< const real_type > create_real_view() const
Create a real view of the (potentially) complex original multi-vector.
void fill(ValueType value)
Fill the distributed vectors with a given value.
static std::unique_ptr< Vector > create_with_type_of(ptr_param< const Vector > other, std::shared_ptr< const Executor > exec, const dim< 2 > &global_size, const dim< 2 > &local_size, size_type stride)
Creates an Vector with the same type as another Vector, but on a different executor and with a differ...
static std::unique_ptr< Vector > create_with_config_of(ptr_param< const Vector > other)
Creates a distributed Vector with the same size and stride as another Vector.
value_type & at_local(size_type row, size_type col) noexcept
Returns a single element of the multi-vector.
value_type * get_local_values()
Returns a pointer to the array of local values of the multi-vector.
void compute_norm2(ptr_param< LinOp > result, array< char > &tmp) const
Computes the Euclidean (L^2) norm of this (multi-)vector using a global reduction.
const value_type * get_const_local_values() const
Returns a pointer to the array of local values of the multi-vector.
void compute_conj_dot(ptr_param< const LinOp > b, ptr_param< LinOp > result) const
Computes the column-wise dot product of this (multi-)vector and conj(b) using a global reduction.
void compute_absolute_inplace() override
Compute absolute inplace on each element.
void get_real(ptr_param< real_type > result) const
Extracts the real part of the original vectors into given real vectors.
void compute_squared_norm2(ptr_param< LinOp > result) const
Computes the square of the column-wise Euclidean ( ) norm of this (multi-)vector using a global reduc...
void sub_scaled(ptr_param< const LinOp > alpha, ptr_param< const LinOp > b)
Subtracts b scaled by alpha from the vectors (aka: BLAS axpy).
void compute_dot(ptr_param< const LinOp > b, ptr_param< LinOp > result) const
Computes the column-wise dot product of this (multi-)vector and b using a global reduction.
static std::unique_ptr< const Vector > create_const(std::shared_ptr< const Executor > exec, mpi::communicator comm, std::unique_ptr< const local_vector_type > local_vector)
Creates a constant (immutable) distributed Vector from a constant local vector.
void compute_mean(ptr_param< LinOp > result, array< char > &tmp) const
Computes the column-wise arithmetic mean of this (multi-)vector using a global reduction.
std::unique_ptr< complex_type > make_complex() const
Creates a complex copy of the original vectors.
void compute_norm1(ptr_param< LinOp > result) const
Computes the column-wise (L^1) norm of this (multi-)vector.
static std::unique_ptr< Vector > create(std::shared_ptr< const Executor > exec, mpi::communicator comm, dim< 2 > global_size, std::unique_ptr< local_vector_type > local_vector)
Creates a distributed vector from local vectors with a specified size.
void get_imag(ptr_param< real_type > result) const
Extracts the imaginary part of the original vectors into given real vectors.
std::unique_ptr< absolute_type > compute_absolute() const override
Gets the AbsoluteLinOp.
void compute_dot(ptr_param< const LinOp > b, ptr_param< LinOp > result, array< char > &tmp) const
Computes the column-wise dot product of this (multi-)vector and b using a global reduction.
std::unique_ptr< real_type > get_imag() const
Creates new real vectors and extracts the imaginary part of the original vectors into that.
void inv_scale(ptr_param< const LinOp > alpha)
Scales the vectors with the inverse of a scalar.
void add_scaled(ptr_param< const LinOp > alpha, ptr_param< const LinOp > b)
Adds b scaled by alpha to the vectors (aka: BLAS axpy).
void scale(ptr_param< const LinOp > alpha)
Scales the vectors with a scalar (aka: BLAS scal).
void read_distributed(const device_matrix_data< ValueType, int64 > &data, ptr_param< const Partition< int64, int64 > > partition)
Reads a vector from the device_matrix_data structure and a global row partition.
const local_vector_type * get_local_vector() const
Direct (read) access to the underlying local local_vector_type vectors.
static std::unique_ptr< Vector > create_with_type_of(ptr_param< const Vector > other, std::shared_ptr< const Executor > exec)
Creates an empty Vector with the same type as another Vector, but on a different executor.
ValueType & at_local(size_type idx) noexcept
Returns a single element of the multi-vector.
void compute_norm1(ptr_param< LinOp > result, array< char > &tmp) const
Computes the column-wise (L^1) norm of this (multi-)vector using a global reduction.
ValueType at_local(size_type idx) const noexcept
static std::unique_ptr< Vector > create(std::shared_ptr< const Executor > exec, mpi::communicator comm, std::unique_ptr< local_vector_type > local_vector)
Creates a distributed vector from local vectors.
void compute_conj_dot(ptr_param< const LinOp > b, ptr_param< LinOp > result, array< char > &tmp) const
Computes the column-wise dot product of this (multi-)vector and conj(b) using a global reduction.
A thin wrapper of MPI_Comm that supports most MPI calls.
Definition mpi.hpp:408
Dense is a matrix format which explicitly stores all values of the matrix.
Definition dense.hpp:117
This class is used for function parameters in the place of raw pointers.
Definition utils_helper.hpp:41
The distributed namespace.
Definition precision_dispatch.hpp:309
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_base_impl< T >::type next_precision_base
Obtains the next type in the singly-linked precision list.
Definition math.hpp:421
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
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