hdf5 + hdf5 mpi: clean up

This commit is contained in:
Christian Zimmermann 2025-03-18 15:37:42 -07:00
parent 8b70e3c6dd
commit 97473157f2
6 changed files with 14 additions and 105 deletions

View file

@ -64,13 +64,6 @@ namespace CNORXZ
*/
virtual Dataset& writebase(const RangePtr& dataRange, Sptr<YIndex> pos, const void* data);
/** Read the dataset.
@param dest Pointer to destination.
@param readrange Range of the destination data.
@param beg Position within the file space.
*/
virtual void readbase(void* dest, RangePtr readrange, Sptr<YIndex> beg) const;
/** Read the dataset.
@param dest Pointer to destination.
@param tsize Size of dest data type.
@ -91,7 +84,7 @@ namespace CNORXZ
/** Get the data range.
@return Pointer to the range.
*/
const RangePtr& dataRange() const;
const RangePtr& fileRange() const;
protected:
Vector<hsize_t> mkOff(const Sptr<YIndex>& beg) const;

View file

@ -136,38 +136,6 @@ namespace CNORXZ
H5Sclose(memspace);
return *this;
}
void Dataset::readbase(void* dest, RangePtr readRange, Sptr<YIndex> beg) const
{
// TODO: Check if readRange is compatible with mFileRange!!!
if(not readRange){
readRange = mFileRange;
}
else {
CXZ_ASSERT(readRange->dim() == mFileRange->dim(), "dimension of data range ("
<< readRange->dim() << ") different from dimension of file range ("
<< mFileRange->dim() << ")");
}
Vector<hsize_t> dims(readRange->dim());
for(SizeT i = 0; i != dims.size(); ++i){
dims[i] = readRange->sub(i)->size();
}
if(beg){
CXZ_ASSERT(beg->range()->dim() == mFileRange->dim(), "dimension of position index ("
<< beg->range()->dim() << ") different from dimension of file range ("
<< mFileRange->dim() << ")");
const Vector<hsize_t> fpos = mkOff(beg);
H5Sselect_hyperslab(mFilespace, H5S_SELECT_SET, fpos.data(), NULL, dims.data(), NULL);
}
const hid_t mem_space_id = H5Screate_simple(static_cast<hsize_t>(dims.size()),
dims.data(), nullptr);
const hid_t xfer_plist_id = this->mkdxpl();
const herr_t err = H5Dread(mId, mType, mem_space_id, mFilespace, xfer_plist_id, dest);
CXZ_ASSERT(err >= 0, "error while reading dataset '" << mName
<< "', errorcode :" << err);
H5Pclose(xfer_plist_id);
H5Sclose(mem_space_id);
}
void Dataset::readbase(void* dest, SizeT tsize, Sptr<YIndex> mbeg, Sptr<YIndex> mend,
Sptr<YIndex> fbeg) const
@ -175,12 +143,10 @@ namespace CNORXZ
const SizeT D = mFileRange->dim();
const bool todo = mbeg != nullptr;
Vector<hsize_t> offset(D);
Vector<hsize_t> moffset(D);//!!!
Vector<hsize_t> moffset(D);
Vector<hsize_t> dims(D);
Vector<hsize_t> mdims(D);//!!!
Vector<hsize_t> mdims(D);
if(todo){
//RangePtr dr = mbeg->range();
//const bool parallel = true;
CXZ_ASSERT(mend != nullptr, "no end edge given");
CXZ_ASSERT(fbeg->range()->dim() == D, "dimension of file index ("
<< fbeg->range()->dim() << ") different from dimension of file range ("
@ -229,7 +195,7 @@ namespace CNORXZ
return xfer_plist_id;
}
const RangePtr& Dataset::dataRange() const
const RangePtr& Dataset::fileRange() const
{
return mFileRange;
}

View file

@ -231,7 +231,7 @@ namespace
File h5f(mFileName, true);
h5f.open();
auto dset = h5f.getGroup("gr2")->open().getDataset("dat1", Double{});
YIndex beg(dset->dataRange());
YIndex beg(dset->fileRange());
beg.setSub(0,2);
YIndex end = beg - 1;
end.setSub(0,2);
@ -252,12 +252,12 @@ namespace
File h5f(mFileName, true);
h5f.open();
auto dset = h5f.getGroup("gr2")->open().getDataset("dat1", Double{});
//YIndex beg(dset->dataRange());
//YIndex beg(dset->fileRange());
//beg.setSub(0,2);
//YIndex end = beg - 1;
//end.setSub(0,2);
//auto data = dset->read(beg,end);
Vector<RangePtr> dranges(dset->dataRange()->dim());
Vector<RangePtr> dranges(dset->fileRange()->dim());
EXPECT_EQ(dranges.size(), 5u);
dranges[0] = CRangeFactory(5).create();
dranges[1] = CRangeFactory(2).create();
@ -268,7 +268,7 @@ namespace
MArray<Double> data(drange);
auto mbeg = data.begin();
auto mend = data.begin();
YIndex fbeg(dset->dataRange());
YIndex fbeg(dset->fileRange());
Arr<SizeT,5> mbegpos = { 1,0,0,2,0 };
Arr<SizeT,5> mendpos = { 3,1,3,4,1 };
Arr<SizeT,5> fbegpos = { 3,1,4,2,0 };

View file

@ -40,8 +40,12 @@ namespace CNORXZ
mpi::RArray<T> SRDataset<T>::read(const RangePtr& geom) const
{
auto rr = rangeCast<mpi::RRange<YRange,YRange>>( mpi::rrange(mFileRange, geom) );
auto mbeg = std::make_shared<mpi::RIndex<YIndex,YIndex>>(rr);
auto mend = std::make_shared<mpi::RIndex<YIndex,YIndex>>(rr);
*mend = mend->lmax().val()-1;
auto fbeg = std::make_shared<YIndex>(mFileRange);
mpi::RArray<T> out(rr);
readbase(out.data(), rr, nullptr);
rreadbase(out.data(), sizeof(T), mbeg, mend, fbeg);
return out;
}
@ -60,7 +64,6 @@ namespace CNORXZ
auto mend = std::make_shared<mpi::RIndex<YIndex,YIndex>>(outrange);
*mend = mend->lmax().val()-1;
auto fbeg = std::make_shared<YIndex>(mFileRange);
//readbase(out.data(), outrange, nullptr);
rreadbase(out.data(), sizeof(T), mbeg, mend, fbeg);
return out;
}

View file

@ -36,14 +36,10 @@ namespace CNORXZ
@param _parent Parent content object.
*/
RDataset(const String& name, const ContentBase* _parent);
//virtual ~RDataset();
virtual RDataset& initbase(const RangePtr& fileRange, hid_t type) override;
virtual RDataset& writebase(const RangePtr& writeRange, Sptr<YIndex> pos,
const void* data) override;
virtual void readbase(void* dest, RangePtr readrange, Sptr<YIndex> beg) const override;
//virtual void readbase(void* dest, Sptr<YIndex> mbeg, Sptr<YIndex> mend,
// Sptr<YIndex> fbeg) const override;
virtual hid_t mkdxpl() const override;

View file

@ -153,56 +153,7 @@ namespace CNORXZ
Dataset::readbase(dest, tsize, mbegl, mendl, fbegl);
}
}
void RDataset::readbase(void* dest, RangePtr readRange, Sptr<YIndex> beg) const
{
RangePtr dr = readRange;
if(not dr){
dr = mFileRange;
}
bool parallel = dr->stype() == "R";
if(parallel){
dr = readRange->sub(1);
}
CXZ_ASSERT(dr->dim() == mFileRange->dim(), "dimension of data range ("
<< dr->dim() << ") different from dimension of file range ("
<< mFileRange->dim() << ")");
Vector<hsize_t> offset(mFileRange->dim());
if(parallel){
mpi::RIndex<YIndex,YIndex> idx(readRange);
idx.localize();
const SizeT rat = mpi::getNumRanks() / idx.rankI()->lmax().val();
assert(rat == 1); // for now...
assert(mpi::getRankNumber() == idx.rankI()->lex());
for(SizeT i = 0; i != offset.size(); ++i){
offset[i] = idx.rankI()->pack().get(i)->lex() * dr->savesub(i)->size();
}
}
if(beg){
CXZ_ASSERT(beg->range()->dim() == mFileRange->dim(), "dimension of position index ("
<< beg->range()->dim() << ") different from dimension of file range ("
<< mFileRange->dim() << ")");
for(SizeT i = 0; i != offset.size(); ++i){
offset[i] += beg->pack().get(i)->lex();
}
}
Vector<hsize_t> dims(mFileRange->dim());
for(SizeT i = 0; i != dims.size(); ++i){
dims[i] = dr->sub(i)->size();
}
H5Sselect_hyperslab(mFilespace, H5S_SELECT_SET, offset.data(), NULL, dims.data(), NULL);
const hid_t mem_space_id = H5Screate_simple(static_cast<hsize_t>(dims.size()),
dims.data(), nullptr);
const hid_t xfer_plist_id = this->mkdxpl();
const herr_t err = H5Dread(mId, mType, mem_space_id, mFilespace, xfer_plist_id, dest);
CXZ_ASSERT(err >= 0, "error while reading dataset '" << mName
<< "', errorcode :" << err);
H5Pclose(xfer_plist_id);
H5Sclose(mem_space_id);
MPI_Barrier(MPI_COMM_WORLD);
}
hid_t RDataset::mkdxpl() const
{
const hid_t xfer_plist_id = H5Pcreate(H5P_DATASET_XFER);