hdf5 + hdf5 mpi: clean up
This commit is contained in:
parent
8b70e3c6dd
commit
97473157f2
6 changed files with 14 additions and 105 deletions
src/opt
hdf5
hdf5_mpi
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 };
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue