Skip to content

Commit

Permalink
Merge branch 'r2m-pr3213'
Browse files Browse the repository at this point in the history
* r2m-pr3213:
  Fix: BP5 Get() + Close() will retrieve deferred variables. Similarly, if EndStep() was not called, Close() will do it automatically.
  • Loading branch information
Chuck Atkins committed May 12, 2022
2 parents 9c84662 + 4ee8056 commit 0ad97e1
Show file tree
Hide file tree
Showing 2 changed files with 222 additions and 0 deletions.
8 changes: 8 additions & 0 deletions source/adios2/engine/bp5/BP5Reader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -993,6 +993,14 @@ ADIOS2_FOREACH_STDTYPE_1ARG(declare_type)
void BP5Reader::DoClose(const int transportIndex)
{
PERFSTUBS_SCOPED_TIMER("BP5Reader::Close");
if (m_OpenMode == Mode::ReadRandomAccess)
{
PerformGets();
}
else if (m_BetweenStepPairs)
{
EndStep();
}
m_DataFileManager.CloseFiles();
m_MDFileManager.CloseFiles();
}
Expand Down
214 changes: 214 additions & 0 deletions testing/adios2/engine/bp/TestBPWriteReadADIOS2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2081,6 +2081,220 @@ TEST_F(BPWriteReadTestADIOS2, ADIOS2BPWriteReadEmptyProcess)
#endif
}

TEST_F(BPWriteReadTestADIOS2, GetDeferredInClose)
{
// Test if Get() will retrieve data in Close()
const std::string fname("GetDeferredInClose.bp");

int mpiRank = 0, mpiSize = 1;

const std::size_t Nx = 10;

#if ADIOS2_USE_MPI
MPI_Comm_rank(MPI_COMM_WORLD, &mpiRank);
MPI_Comm_size(MPI_COMM_WORLD, &mpiSize);
#endif

std::vector<int64_t> localData(Nx);
std::iota(localData.begin(), localData.end(), mpiRank * Nx);

#if ADIOS2_USE_MPI
adios2::ADIOS adios(MPI_COMM_WORLD);
#else
adios2::ADIOS adios;
#endif
{
adios2::IO io = adios.DeclareIO("StartCountWrite");
if (!engineName.empty())
{
io.SetEngine(engineName);
}
if (!engineParameters.empty())
{
io.SetParameters(engineParameters);
}

io.DefineVariable<int64_t>(
"range", {static_cast<std::size_t>(Nx * mpiSize)},
{static_cast<std::size_t>(Nx * mpiRank)}, {Nx});

adios2::Engine bpWriter = io.Open(fname, adios2::Mode::Write);

bpWriter.Put<int64_t>("range", localData.data());
bpWriter.Close();
}
// Reader
{
adios2::IO io = adios.DeclareIO("StartCountRead");
if (!engineName.empty())
{
io.SetEngine(engineName);
}
if (!engineParameters.empty())
{
io.SetParameters(engineParameters);
}

adios2::Engine bpReader =
io.Open(fname, adios2::Mode::ReadRandomAccess);
adios2::Variable<int64_t> varRange =
io.InquireVariable<int64_t>("range");

std::vector<int64_t> readData(Nx);
varRange.SetSelection({{static_cast<std::size_t>(Nx * mpiRank)}, {Nx}});
bpReader.Get(varRange, readData);
bpReader.Close();

for (size_t j = 0; j < Nx; ++j)
{
EXPECT_EQ(localData[j], readData[j]);
}
}
}

TEST_F(BPWriteReadTestADIOS2, GetDeferredInEndStep)
{
// Test if Get() will retrieve data in EndStep()
const std::string fname("GetDeferredInEndStep.bp");

int mpiRank = 0, mpiSize = 1;

const std::size_t Nx = 10;

#if ADIOS2_USE_MPI
MPI_Comm_rank(MPI_COMM_WORLD, &mpiRank);
MPI_Comm_size(MPI_COMM_WORLD, &mpiSize);
#endif

std::vector<int64_t> localData(Nx);
std::iota(localData.begin(), localData.end(), mpiRank * Nx);

#if ADIOS2_USE_MPI
adios2::ADIOS adios(MPI_COMM_WORLD);
#else
adios2::ADIOS adios;
#endif
{
adios2::IO io = adios.DeclareIO("StartCountWrite");
if (!engineName.empty())
{
io.SetEngine(engineName);
}
if (!engineParameters.empty())
{
io.SetParameters(engineParameters);
}

io.DefineVariable<int64_t>(
"range", {static_cast<std::size_t>(Nx * mpiSize)},
{static_cast<std::size_t>(Nx * mpiRank)}, {Nx});

adios2::Engine bpWriter = io.Open(fname, adios2::Mode::Write);

bpWriter.Put<int64_t>("range", localData.data());
bpWriter.Close();
}
// Reader
{
adios2::IO io = adios.DeclareIO("StartCountRead");
if (!engineName.empty())
{
io.SetEngine(engineName);
}
if (!engineParameters.empty())
{
io.SetParameters(engineParameters);
}

adios2::Engine bpReader = io.Open(fname, adios2::Mode::Read);
bpReader.BeginStep();
adios2::Variable<int64_t> varRange =
io.InquireVariable<int64_t>("range");

std::vector<int64_t> readData(Nx);
varRange.SetSelection({{static_cast<std::size_t>(Nx * mpiRank)}, {Nx}});
bpReader.Get(varRange, readData);
bpReader.EndStep();
for (size_t j = 0; j < Nx; ++j)
{
EXPECT_EQ(localData[j], readData[j]);
}
bpReader.Close();
}
}

TEST_F(BPWriteReadTestADIOS2, GetDeferredWithoutEndStep)
{
// Test if Get() will retrieve data in Close() when EndStep() is not called
const std::string fname("GetDeferredWithoutEndStep.bp");

int mpiRank = 0, mpiSize = 1;

const std::size_t Nx = 10;

#if ADIOS2_USE_MPI
MPI_Comm_rank(MPI_COMM_WORLD, &mpiRank);
MPI_Comm_size(MPI_COMM_WORLD, &mpiSize);
#endif

std::vector<int64_t> localData(Nx);
std::iota(localData.begin(), localData.end(), mpiRank * Nx);

#if ADIOS2_USE_MPI
adios2::ADIOS adios(MPI_COMM_WORLD);
#else
adios2::ADIOS adios;
#endif
{
adios2::IO io = adios.DeclareIO("StartCountWrite");
if (!engineName.empty())
{
io.SetEngine(engineName);
}
if (!engineParameters.empty())
{
io.SetParameters(engineParameters);
}

io.DefineVariable<int64_t>(
"range", {static_cast<std::size_t>(Nx * mpiSize)},
{static_cast<std::size_t>(Nx * mpiRank)}, {Nx});

adios2::Engine bpWriter = io.Open(fname, adios2::Mode::Write);

bpWriter.Put<int64_t>("range", localData.data());
bpWriter.Close();
}
// Reader
{
adios2::IO io = adios.DeclareIO("StartCountRead");
if (!engineName.empty())
{
io.SetEngine(engineName);
}
if (!engineParameters.empty())
{
io.SetParameters(engineParameters);
}

adios2::Engine bpReader = io.Open(fname, adios2::Mode::Read);
bpReader.BeginStep();
adios2::Variable<int64_t> varRange =
io.InquireVariable<int64_t>("range");

std::vector<int64_t> readData(Nx);
varRange.SetSelection({{static_cast<std::size_t>(Nx * mpiRank)}, {Nx}});
bpReader.Get(varRange, readData);
/* Missing call to bpReader.EndStep(); */
bpReader.Close();

for (size_t j = 0; j < Nx; ++j)
{
EXPECT_EQ(localData[j], readData[j]);
}
}
}

//******************************************************************************
// main
//******************************************************************************
Expand Down

0 comments on commit 0ad97e1

Please sign in to comment.