Program Listing for File RdmaAccumulatorBundle.hpp¶
↰ Return to documentation for file (include/uitsl/distributed/RdmaAccumulatorBundle.hpp)
#pragma once
#ifndef UITSL_DISTRIBUTED_RDMAACCUMULATORBUNDLE_HPP_INCLUDE
#define UITSL_DISTRIBUTED_RDMAACCUMULATORBUNDLE_HPP_INCLUDE
#include <algorithm>
#include <cassert>
#include <cstring>
#include <vector>
#include "../utility/NamedArrayElement.hpp"
namespace uitsl {
template<typename T>
class RdmaAccumulatorBundle {
size_t data_size;
// holds data within size then epoch past the end
// within reserved capacity
std::vector<T> buff;
public:
T* data() { return buff.data(); }
const T* data() const { return buff.data(); }
size_t byte_size() const {
assert( buff.size() == data_size );
assert( buff.capacity() == data_size + 1);
return sizeof(T) * (data_size + 1);
}
std::vector<T>& GetData() { return buff; }
const std::vector<T>& GetData() const { return buff; }
void Reset() {
buff.reserve( data_size + 1 ); // +1 for epoch
buff.resize(data_size);
std::fill( std::begin(buff), std::end(buff), T{} );
SetEpoch( T{} );
}
T GetEpoch() const {
assert( buff.size() == data_size );
assert( buff.capacity() == data_size + 1);
T res;
std::memcpy(
&res,
buff.data() + data_size,
sizeof(T)
);
return res;
}
void SetEpoch(const T val) {
assert( buff.size() == data_size );
assert( buff.capacity() == data_size + 1);
std::memcpy(
buff.data() + data_size,
&val,
sizeof(T)
);
}
void BumpEpoch(const T amt=1) { SetEpoch( GetEpoch() + amt ); }
void BumpData(const std::vector<T>& bumps) {
assert( bumps.size() == data_size );
assert( buff.size() == data_size );
std::transform(
std::begin(bumps),
std::end(bumps),
std::begin(buff),
std::begin(buff),
std::plus<T>{}
);
}
RdmaAccumulatorBundle(const size_t data_size_)
: data_size( data_size_ )
{ Reset(); }
RdmaAccumulatorBundle(const std::vector<T>& data)
: data_size( data.size() )
, buff( data )
{ buff.reserve( data_size + 1 ); SetEpoch( T{} ); }
RdmaAccumulatorBundle(std::vector<T>&& data)
: data_size( data.size() )
, buff( std::move(data) )
{ buff.reserve( data_size + 1 ); SetEpoch( T{} ); }
RdmaAccumulatorBundle(RdmaAccumulatorBundle &&) = default;
RdmaAccumulatorBundle& operator=(RdmaAccumulatorBundle &&) = default;
};
} // namespace uitsl
#endif // #ifndef UITSL_DISTRIBUTED_RDMAACCUMULATORBUNDLE_HPP_INCLUDE