1#ifndef ITERATIVE_SOLVER_BUFFERMANAGER_H
2#define ITERATIVE_SOLVER_BUFFERMANAGER_H
5#include <molpro/linalg/array/DistrArray.h>
6#include <molpro/linalg/array/util/Distribution.h>
21 using VecRef = std::vector<std::reference_wrapper<T>>;
22 using CVecRef = std::vector<std::reference_wrapper<const T>>;
23 auto cwrap(
const std::vector<T>& arrays) {
25 for (
auto it = arrays.begin(); it != arrays.end(); ++it)
26 w.emplace_back(std::cref(*it));
41 m_range(arrays.empty() ? std::pair<typename T::index_type, typename T::index_type>{0, 0}
42 : arrays.front().get().distribution().range(
rank_in(arrays.front().get()))),
44 assert(number_of_buffers > 0 && number_of_buffers < 3);
49 if (array.communicator() == molpro::mpi::comm_global())
50 return molpro::mpi::rank_global();
53 MPI_Comm_rank(array.communicator(), &rank);
118 m_value = m_manager.
next();
129 return (a.m_value.
size() == b.m_value.
size() and b.m_value.
size() == 0)
130 or a.m_value.
data() == b.m_value.
data();
159 const auto hi = std::min(lo + this->m_buffer_size,
m_range.second);
163 for (
size_t iarray = 0; iarray <
m_arrays.size(); ++iarray) {
176 const auto next_hi = std::min(next_lo + this->m_buffer_size,
m_range.second);
178 m_read_future = std::async(std::launch::async, [
this, next_lo, next_hi, next_buffer_id]() {
179 for (
size_t iarray = 0; iarray <
m_arrays.size(); ++iarray)
190 const std::pair<size_t, size_t>
Non-owning container taking a pointer to the data buffer and its size and exposing routines for itera...
Definition Span.h:31
size_type size() const
Definition Span.h:77
iterator data()
Definition Span.h:66
BufferManager provides single-buffered or asynchronous double-buffered read access to the data in a c...
Definition BufferManager.h:20
const CVecRef m_arrays
Definition BufferManager.h:84
size_t buffer_offset() const
Definition BufferManager.h:77
static int rank_in(const T &array)
This process's rank in the array's own communicator, which need not be the global one.
Definition BufferManager.h:48
typename T::value_type value_type
Definition BufferManager.h:80
size_t m_current_segment
Definition BufferManager.h:189
const std::pair< size_t, size_t > m_range
Definition BufferManager.h:191
size_t buffer_size() const
Definition BufferManager.h:67
size_t buffer_stride() const
Definition BufferManager.h:72
Iterator end()
Definition BufferManager.h:142
BufferManager(const std::vector< T > &arrays, size_t buffer_size=8192, int number_of_buffers=2)
Definition BufferManager.h:58
Span< value_type > next(bool initial=false)
Move to the next segment of the arrays and complete loading of the buffer.
Definition BufferManager.h:150
size_t m_current_buffer_size
Definition BufferManager.h:87
const size_t m_buffer_size
Definition BufferManager.h:85
BufferManager(const CVecRef &arrays, size_t buffer_size=8192, int number_of_buffers=2)
Construct a new Buffer Manager object and allocate memory for the chunks.
Definition BufferManager.h:39
BufferManager(const T &array, size_t buffer_size=8192, int number_of_buffers=2)
Definition BufferManager.h:60
Iterator begin()
Definition BufferManager.h:140
std::future< void > m_read_future
Definition BufferManager.h:193
const int m_number_of_buffers
Definition BufferManager.h:86
std::vector< typename T::value_type > m_buffer
Definition BufferManager.h:192
Definition ArrayHandler.h:24
Custom iterator for the BufferManager. This iterator is responsible for loading data into the buffers...
Definition BufferManager.h:94
std::forward_iterator_tag iterator_category
Definition BufferManager.h:96
pointer operator->()
Definition BufferManager.h:115
friend bool operator!=(const Iterator &a, const Iterator &b)
Definition BufferManager.h:133
std::ptrdiff_t difference_type
Definition BufferManager.h:97
Iterator & operator++()
Definition BufferManager.h:117
Iterator(BufferManager &manager, bool begin=false, bool end=false)
Construct a new Iterator object.
Definition BufferManager.h:109
Iterator operator++(int)
Definition BufferManager.h:122
reference operator*() const
Definition BufferManager.h:113
friend bool operator==(const Iterator &a, const Iterator &b)
Definition BufferManager.h:128