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(molpro::mpi::rank_global())),
44 assert(number_of_buffers > 0 && number_of_buffers < 3);
104 m_value = m_manager.
next();
115 return (a.m_value.
size() == b.m_value.
size() and b.m_value.
size() == 0)
116 or a.m_value.
data() == b.m_value.
data();
145 const auto hi = std::min(lo + this->m_buffer_size,
m_range.second);
149 for (
size_t iarray = 0; iarray <
m_arrays.size(); ++iarray) {
162 const auto next_hi = std::min(next_lo + this->m_buffer_size,
m_range.second);
164 m_read_future = std::async(std::launch::async, [
this, next_lo, next_hi, next_buffer_id]() {
165 for (
size_t iarray = 0; iarray <
m_arrays.size(); ++iarray)
176 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:28
size_type size() const
Definition: Span.h:74
iterator data()
Definition: Span.h:63
BufferManager provides single-buffered or asynchronous double-buffered read access to the data in a c...
Definition: BufferManager.h:20
size_t buffer_offset() const
Definition: BufferManager.h:66
const CVecRef & m_arrays
Definition: BufferManager.h:70
typename T::value_type value_type
Definition: BufferManager.h:69
size_t m_current_segment
Definition: BufferManager.h:175
const std::pair< size_t, size_t > m_range
Definition: BufferManager.h:177
size_t buffer_size() const
Definition: BufferManager.h:56
size_t buffer_stride() const
Definition: BufferManager.h:61
Iterator end()
Definition: BufferManager.h:128
BufferManager(const std::vector< T > &arrays, size_t buffer_size=8192, int number_of_buffers=2)
Definition: BufferManager.h:47
Span< value_type > next(bool initial=false)
Move to the next segment of the arrays and complete loading of the buffer.
Definition: BufferManager.h:136
size_t m_current_buffer_size
Definition: BufferManager.h:73
const size_t m_buffer_size
Definition: BufferManager.h:71
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:49
Iterator begin()
Definition: BufferManager.h:126
std::future< void > m_read_future
Definition: BufferManager.h:179
const int m_number_of_buffers
Definition: BufferManager.h:72
std::vector< typename T::value_type > m_buffer
Definition: BufferManager.h:178
Definition: ArrayHandler.h:23
Custom iterator for the BufferManager. This iterator is responsible for loading data into the buffers...
Definition: BufferManager.h:80
std::forward_iterator_tag iterator_category
Definition: BufferManager.h:82
pointer operator->()
Definition: BufferManager.h:101
friend bool operator!=(const Iterator &a, const Iterator &b)
Definition: BufferManager.h:119
std::ptrdiff_t difference_type
Definition: BufferManager.h:83
Iterator & operator++()
Definition: BufferManager.h:103
Iterator(BufferManager &manager, bool begin=false, bool end=false)
Construct a new Iterator object.
Definition: BufferManager.h:95
Iterator operator++(int)
Definition: BufferManager.h:108
reference operator*() const
Definition: BufferManager.h:99
friend bool operator==(const Iterator &a, const Iterator &b)
Definition: BufferManager.h:114