Skip to content

Commit 4f8c276

Browse files
authored
Parallel Test: Declare From Some (#671)
Declare records in MPI-parallel writes only from some ranks.
1 parent 18ac98b commit 4f8c276

File tree

1 file changed

+69
-49
lines changed

1 file changed

+69
-49
lines changed

test/ParallelIOTest.cpp

+69-49
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,7 @@ TEST_CASE( "parallel_multi_series_test", "[parallel]" )
9090
allSeries.clear();
9191
}
9292

93-
void write_test_zero_extent( bool fileBased, std::string file_ending, bool writeAllChunks )
94-
{
93+
void write_test_zero_extent( bool fileBased, std::string file_ending, bool writeAllChunks, bool declareFromAll ) {
9594
int mpi_s{-1};
9695
int mpi_r{-1};
9796
MPI_Comm_size(MPI_COMM_WORLD, &mpi_s);
@@ -110,45 +109,47 @@ void write_test_zero_extent( bool fileBased, std::string file_ending, bool write
110109
Iteration it = o.iterations[step];
111110
it.setAttribute("yolo", "yo");
112111

113-
ParticleSpecies e = it.particles["e"];
114-
115-
/* every rank n writes n consecutive cells, increasing values
116-
* rank 0 does a zero-extent write
117-
* two ranks will result in {1}
118-
* three ranks will result in {1, 2, 3}
119-
* four ranks will result in {1, 2, 3, 4, 5, 6} */
120-
uint64_t num_cells = ((size - 1) * (size - 1) + (size - 1)) / 2; /* (n^2 + n) / 2 */
121-
if (num_cells == 0u) {
122-
std::cerr << "Test can only be run with at least two ranks" << std::endl;
123-
return;
124-
}
125-
126-
std::vector<double> position_global(num_cells);
127-
double pos{1.};
128-
std::generate(position_global.begin(), position_global.end(), [&pos] { return pos++; });
129-
std::shared_ptr<double> position_local(new double[rank], [](double const *p) { delete[] p; });
130-
uint64_t offset;
131-
if (rank != 0)
132-
offset = ((rank - 1) * (rank - 1) + (rank - 1)) / 2;
133-
else
134-
offset = 0;
135-
136-
e["position"]["x"].resetDataset(Dataset(determineDatatype(position_local), {num_cells}));
137-
138-
std::vector<uint64_t> positionOffset_global(num_cells);
139-
uint64_t posOff{1};
140-
std::generate(positionOffset_global.begin(), positionOffset_global.end(), [&posOff] { return posOff++; });
141-
std::shared_ptr<uint64_t> positionOffset_local(new uint64_t[rank], [](uint64_t const *p) { delete[] p; });
142-
143-
e["positionOffset"]["x"].resetDataset(Dataset(determineDatatype(positionOffset_local), {num_cells}));
144-
145-
for (uint64_t i = 0; i < rank; ++i) {
146-
position_local.get()[i] = position_global[offset + i];
147-
positionOffset_local.get()[i] = positionOffset_global[offset + i];
148-
}
149-
if (rank != 0 || writeAllChunks) {
150-
e["position"]["x"].storeChunk(position_local, {offset}, {rank});
151-
e["positionOffset"]["x"].storeChunk(positionOffset_local, {offset}, {rank});
112+
if( rank != 0 || declareFromAll ) {
113+
ParticleSpecies e = it.particles["e"];
114+
115+
/* every rank n writes n consecutive cells, increasing values
116+
* rank 0 does a zero-extent write
117+
* two ranks will result in {1}
118+
* three ranks will result in {1, 2, 3}
119+
* four ranks will result in {1, 2, 3, 4, 5, 6} */
120+
uint64_t num_cells = ((size - 1) * (size - 1) + (size - 1)) / 2; /* (n^2 + n) / 2 */
121+
if (num_cells == 0u) {
122+
std::cerr << "Test can only be run with at least two ranks" << std::endl;
123+
return;
124+
}
125+
126+
std::vector<double> position_global(num_cells);
127+
double pos{1.};
128+
std::generate(position_global.begin(), position_global.end(), [&pos] { return pos++; });
129+
std::shared_ptr<double> position_local(new double[rank], [](double const *p) { delete[] p; });
130+
uint64_t offset;
131+
if (rank != 0)
132+
offset = ((rank - 1) * (rank - 1) + (rank - 1)) / 2;
133+
else
134+
offset = 0;
135+
136+
e["position"]["x"].resetDataset(Dataset(determineDatatype(position_local), {num_cells}));
137+
138+
std::vector<uint64_t> positionOffset_global(num_cells);
139+
uint64_t posOff{1};
140+
std::generate(positionOffset_global.begin(), positionOffset_global.end(), [&posOff] { return posOff++; });
141+
std::shared_ptr<uint64_t> positionOffset_local(new uint64_t[rank], [](uint64_t const *p) { delete[] p; });
142+
143+
e["positionOffset"]["x"].resetDataset(Dataset(determineDatatype(positionOffset_local), {num_cells}));
144+
145+
for (uint64_t i = 0; i < rank; ++i) {
146+
position_local.get()[i] = position_global[offset + i];
147+
positionOffset_local.get()[i] = positionOffset_global[offset + i];
148+
}
149+
if (rank != 0 || writeAllChunks) {
150+
e["position"]["x"].storeChunk(position_local, {offset}, {rank});
151+
e["positionOffset"]["x"].storeChunk(positionOffset_local, {offset}, {rank});
152+
}
152153
}
153154
o.flush();
154155
}
@@ -247,8 +248,8 @@ TEST_CASE( "hdf5_write_test", "[parallel][hdf5]" )
247248

248249
TEST_CASE( "hdf5_write_test_zero_extent", "[parallel][hdf5]" )
249250
{
250-
write_test_zero_extent( false, "h5", true );
251-
write_test_zero_extent( true, "h5", true );
251+
write_test_zero_extent( false, "h5", true, true );
252+
write_test_zero_extent( true, "h5", true, true );
252253
}
253254

254255
TEST_CASE( "hdf5_write_test_skip_chunk", "[parallel][hdf5]" )
@@ -257,8 +258,21 @@ TEST_CASE( "hdf5_write_test_skip_chunk", "[parallel][hdf5]" )
257258
auto const hdf5_collective = auxiliary::getEnvString( "OPENPMD_HDF5_INDEPENDENT", "ON" );
258259
if( hdf5_collective == "ON" )
259260
{
260-
write_test_zero_extent( false, "h5", false );
261-
write_test_zero_extent( true, "h5", false );
261+
write_test_zero_extent( false, "h5", false, true );
262+
write_test_zero_extent( true, "h5", false, true );
263+
}
264+
else
265+
REQUIRE(true);
266+
}
267+
268+
TEST_CASE( "hdf5_write_test_skip_declare", "[parallel][hdf5]" )
269+
{
270+
//! @todo add via JSON option instead of environment read
271+
auto const hdf5_collective = auxiliary::getEnvString( "OPENPMD_HDF5_INDEPENDENT", "OFF" );
272+
if( hdf5_collective == "ON" )
273+
{
274+
write_test_zero_extent( false, "h5", false, false );
275+
write_test_zero_extent( true, "h5", false, false );
262276
}
263277
else
264278
REQUIRE(true);
@@ -311,14 +325,20 @@ TEST_CASE( "adios_write_test", "[parallel][adios]" )
311325

312326
TEST_CASE( "adios_write_test_zero_extent", "[parallel][adios]" )
313327
{
314-
write_test_zero_extent( false, "bp", true );
315-
write_test_zero_extent( true, "bp", true );
328+
write_test_zero_extent( false, "bp", true, true );
329+
write_test_zero_extent( true, "bp", true, true );
316330
}
317331

318332
TEST_CASE( "adios_write_test_skip_chunk", "[parallel][adios]" )
319333
{
320-
write_test_zero_extent( false, "bp", false );
321-
write_test_zero_extent( true, "bp", false );
334+
write_test_zero_extent( false, "bp", false, true );
335+
write_test_zero_extent( true, "bp", false, true );
336+
}
337+
338+
TEST_CASE( "adios_write_test_skip_declare", "[parallel][adios]" )
339+
{
340+
write_test_zero_extent( false, "bp", false, false );
341+
write_test_zero_extent( true, "bp", false, false );
322342
}
323343

324344
TEST_CASE( "hzdr_adios_sample_content_test", "[parallel][adios1]" )

0 commit comments

Comments
 (0)