1
0
mirror of https://github.com/paboyle/Grid.git synced 2025-04-15 00:20:45 +01:00

Hadrons: faster A2A matrix load

This commit is contained in:
Antonin Portelli 2019-01-11 16:12:49 +00:00
parent efe000341d
commit de8b2dcca3

View File

@ -62,6 +62,9 @@ using A2AMatrixSet = Eigen::TensorMap<Eigen::Tensor<T, 5, Eigen::RowMajor>>;
template <typename T>
using A2AMatrix = Eigen::Matrix<T, -1, -1, Eigen::RowMajor>;
template <typename T>
using A2AMatrixMap = Eigen::Map<A2AMatrix<T>>;
template <typename T>
using A2AMatrixTr = Eigen::Matrix<T, -1, -1, Eigen::ColMajor>;
@ -108,7 +111,7 @@ public:
void saveBlock(const A2AMatrixSet<T> &m, const unsigned int ext, const unsigned int str,
const unsigned int i, const unsigned int j);
template <template <class> class Vec, typename VecT>
void load(Vec<VecT> &v, double *tRead = nullptr);
void load(Vec<VecT> &v, double *tRead = nullptr, const bool useCache = true);
private:
std::string filename_{""}, dataname_{""};
unsigned int nt_{0}, ni_{0}, nj_{0};
@ -495,7 +498,7 @@ void A2AMatrixIo<T>::saveBlock(const A2AMatrixSet<T> &m,
template <typename T>
template <template <class> class Vec, typename VecT>
void A2AMatrixIo<T>::load(Vec<VecT> &v, double *tRead)
void A2AMatrixIo<T>::load(Vec<VecT> &v, double *tRead, const bool useCache)
{
#ifdef HAVE_HDF5
Hdf5Reader reader(filename_);
@ -532,6 +535,24 @@ void A2AMatrixIo<T>::load(Vec<VecT> &v, double *tRead)
nj_ = hdim[2];
}
if (useCache)
{
std::vector<T> buf(nt_*ni_*nj_);
T *pt;
dataset.read(buf.data(), datatype);
pt = buf.data();
for (unsigned int t = 0; t < nt_; ++t)
{
A2AMatrixMap<T> bufMap(pt, ni_, nj_);
v[t] = bufMap.template cast<VecT>();
pt += ni_*nj_;
}
}
// if useCache = false, do I/O timeslice per timeslice (much slower)
else
{
A2AMatrix<T> buf(ni_, nj_);
std::vector<hsize_t> count = {1, static_cast<hsize_t>(ni_),
static_cast<hsize_t>(nj_)},
@ -562,6 +583,7 @@ void A2AMatrixIo<T>::load(Vec<VecT> &v, double *tRead)
v[t] = buf.template cast<VecT>();
}
std::cout << std::endl;
}
#else
HADRONS_ERROR(Implementation, "all-to-all matrix I/O needs HDF5 library");
#endif