template <typename scalar_t>
void read(
slate::Matrix<scalar_t> A,
const std::string filename,
const std::string dsname)
{
// hdf5 initialization
H5::H5File file = impl::h5open(filename, dsname);
H5::DataSet dataset = file.openDataSet(dsname);
H5::DataSpace dataspace = dataset.getSpace();
hsize_t start[2]; // Start of the hyperslab
hsize_t count[2]; // Dimensions of the hyperslab
// Read file
int64_t mt = A.mt();
int64_t nt = A.nt();
int64_t i, j, ii, jj, kk;
int64_t mb, nb;
int64_t mm = 0, nn = 0;
for (i = 0; i < mt; i++) {
mb = A.tileMb(i);
nn = 0;
for (j = 0; j < nt; j++) {
nb = A.tileNb(j);
if (A.tileIsLocal(i, j)) {
A.tileGetForWriting(i, j, slate::LayoutConvert::RowMajor);
auto T = A(i, j);
auto tiledata = T.data();
int64_t stride = T.stride();
// hdf5 get data
dataspace.selectNone(); // Make sure dataspace selection is empty
start[0] = mm; start[1] = nn;
count[0] = mb; count[1] = nb;
dataspace.selectHyperslab(H5S_SELECT_SET, count, start);
hsize_t size = mb * nb;
scalar_t data[size];
H5::DataSpace memspace(1, &size);
dataset.read(data, hdf5::datatype<scalar_t>::value, memspace, dataspace);
// populate tile
kk = 0;
for (ii = 0; ii < mb; ii++) {
for (jj = 0; jj < nb; jj++) {
tiledata[jj + ii * stride] = data[kk++];
}
}
}
nn += nb;
}
mm += mb;
}
// Update
A.tileUpdateAllOrigin();
A.releaseWorkspace();
// close stuff
dataset.close();
file.close();
}