diff --git a/examples/groupless/multistep/reader_allsteps.cpp b/examples/groupless/multistep/reader_allsteps.cpp index d710647fd7a57bd7c92017611aaa0e5994cac49a..07341753ab6a7c0a696dfd4b9177e1609e4dad8e 100644 --- a/examples/groupless/multistep/reader_allsteps.cpp +++ b/examples/groupless/multistep/reader_allsteps.cpp @@ -134,7 +134,8 @@ int main(int argc, char *argv[]) adios::Variable<int> *vNproc = bpReader->InquireVariableInt("Nproc"); Nwriters = vNproc->m_Data[0]; - std::cout << "# of writers = " << Nwriters << std::endl; + if (rank == 0) + std::cout << "# of writers = " << Nwriters << std::endl; /* NX */ /* There is a single value written once. @@ -144,7 +145,8 @@ int main(int argc, char *argv[]) bpReader->InquireVariableUInt("NX"); Nx = vNX->m_Data[0]; // bpReader->Read<unsigned int>("NX", &Nx); - std::cout << "NX = " << Nx << std::endl; + if (rank == 0) + std::cout << "NX = " << Nx << std::endl; /* NY */ /* We can read all into a 1D array with a step selection. @@ -159,7 +161,8 @@ int main(int argc, char *argv[]) // ? How do we make a selection for an arbitrary list of steps ? vNY->SetStepSelection(0, vNY->GetNSteps()); bpReader->Read<unsigned int>(*vNY, Nys.data()); - Print1DArray(Nys.data(), Nys.size(), "NY"); + if (rank == 0) + Print1DArray(Nys.data(), Nys.size(), "NY"); /* ProcessID */ adios::Variable<int> *vProcessID = @@ -172,7 +175,8 @@ int main(int argc, char *argv[]) } ProcessID.resize(vProcessID->m_Shape[0]); bpReader->Read<int>(*vProcessID, ProcessID.data()); - Print1DArray(ProcessID.data(), ProcessID.size(), "ProcessID"); + if (rank == 0) + Print1DArray(ProcessID.data(), ProcessID.size(), "ProcessID"); /* Nparts */ // Nparts local scalar is presented as a 1D array of Nwriters @@ -184,8 +188,10 @@ int main(int argc, char *argv[]) Make2DArray<unsigned int>(vNparts->GetNSteps(), Nwriters); vNparts->SetStepSelection(0, vNparts->GetNSteps()); bpReader->Read<unsigned int>(*vNparts, Nparts[0]); - Print2DArray(Nparts, vNparts->GetNSteps(), Nwriters, "Nparts"); + if (rank == 0) + Print2DArray(Nparts, vNparts->GetNSteps(), Nwriters, "Nparts"); Delete2DArray(Nparts); + MPI_Barrier(MPI_COMM_WORLD); /* * GlobalArrayFixedDims @@ -209,6 +215,9 @@ int main(int argc, char *argv[]) count = gdim - (count * (nproc - 1)); } + if (rank == 0) + std::cout << "GlobalArrayFixedDims parallel read" << std::endl; + double **GlobalArrayFixedDims = Make2DArray<double>(vGlobalArrayFixedDims->GetNSteps(), count); @@ -218,8 +227,19 @@ int main(int argc, char *argv[]) vGlobalArrayFixedDims->SetStepSelection( 0, vGlobalArrayFixedDims->GetNSteps()); bpReader->Read<double>(*vGlobalArrayFixedDims, GlobalArrayFixedDims[0]); + MPI_Barrier(MPI_COMM_WORLD); + MPI_Status status; + int token = 0; + if (rank > 0) + MPI_Recv(&token, 1, MPI_INT, rank - 1, 0, MPI_COMM_WORLD, &status); + std::cout << "Rank " << rank << " read start = " << start + << " count = " << count << std::endl; Print2DArray(GlobalArrayFixedDims, vGlobalArrayFixedDims->GetNSteps(), count, "GlobalArrayFixedDims"); + if (rank < nproc - 1) + MPI_Send(&token, 1, MPI_INT, rank + 1, 0, MPI_COMM_WORLD); + Delete2DArray(GlobalArrayFixedDims); + MPI_Barrier(MPI_COMM_WORLD); /* * LocalArrayFixedDims @@ -236,6 +256,7 @@ int main(int argc, char *argv[]) } std::cout << "LocalArrayFixedDims is irregular. Cannot read this " "variable yet...\n"; + MPI_Barrier(MPI_COMM_WORLD); /* * LocalArrayFixedDimsJoined @@ -243,9 +264,25 @@ int main(int argc, char *argv[]) // inquiry about a variable, whose name we know adios::Variable<float> *vLocalArrayFixedDimsJoined = bpReader->InquireVariableFloat("LocalArrayFixedDimsJoined"); - std::cout << "LocalArrayFixedDimsJoined [" - << vLocalArrayFixedDimsJoined->m_Shape[0] << "]"; - std::cout << " = Cannot read this variable yet...\n"; + float **LocalArrayFixedDimsJoined = + Make2DArray<float>(vLocalArrayFixedDimsJoined->GetNSteps(), + vLocalArrayFixedDimsJoined->m_Shape[0]); + + // Make a 1D selection to describe the local dimensions of the variable + // we READ and its offsets in the global spaces + vLocalArrayFixedDimsJoined->SetSelection( + {0}, {vLocalArrayFixedDimsJoined->m_Shape[0]}); + vLocalArrayFixedDimsJoined->SetStepSelection( + 0, vLocalArrayFixedDimsJoined->GetNSteps()); + bpReader->Read<float>(*vLocalArrayFixedDimsJoined, + LocalArrayFixedDimsJoined[0]); + if (rank == 0) + Print2DArray(LocalArrayFixedDimsJoined, + vLocalArrayFixedDimsJoined->GetNSteps(), + vLocalArrayFixedDimsJoined->m_Shape[0], + "LocalArrayFixedDimsJoined"); + Delete2DArray(LocalArrayFixedDimsJoined); + MPI_Barrier(MPI_COMM_WORLD); /* * GlobalArray which changes size over time @@ -262,6 +299,7 @@ int main(int argc, char *argv[]) "dimension is supposed to be adios::IrregularDim indicating an " "Irregular array\n"); } + MPI_Barrier(MPI_COMM_WORLD); // Close file/stream bpReader->Close(); @@ -292,6 +330,7 @@ int main(int argc, char *argv[]) } #ifdef ADIOS2_HAVE_MPI + MPI_Barrier(MPI_COMM_WORLD); MPI_Finalize(); #endif return 0; diff --git a/source/adios2/engine/adios1/ADIOS1Reader.cpp b/source/adios2/engine/adios1/ADIOS1Reader.cpp index 1fd84c523fc92274a409d062971d6e8bd93c2b08..2571139cbf93b40488b78787872b9b5412e47a82 100644 --- a/source/adios2/engine/adios1/ADIOS1Reader.cpp +++ b/source/adios2/engine/adios1/ADIOS1Reader.cpp @@ -173,99 +173,6 @@ ADIOS1Reader::InquireVariableCompound(const std::string &variableName, return nullptr; } -//#include "core/adios_selection_util.h" -//#include "core/util.h" -void ADIOS1Reader::ReadJoinedArray(const std::string &name, const Dims &offs, - const Dims &ldims, const int fromStep, - const int nSteps, void *data) -{ -#if 0 - ADIOS_VARINFO *vi = adios_inq_var(m_fh, name.c_str()); - if (vi) - { - /* Update blockinfo: calculate start offsets now */ - adios_inq_var_blockinfo(m_fh, vi); - int block = 0; - int firstblock = 0; // first block in fromStep - for (int step = 0; step < vi->nsteps; step++) - { - uint64_t offs = 0; - if (step == fromStep) - firstblock = block; - for (int j = 0; j < vi->nblocks[step]; j++) - { - vi->blockinfo[block].start[0] = offs; - offs += vi->blockinfo[block].count[0]; - ++block; - } - } - ADIOS_SELECTION *bb = - adios_selection_boundingbox(vi->ndim, offs.data(), ldims.data()); - /* Implement block-based reading here and now */ - for (int step = fromStep; step < fromStep + nSteps && step < vi->nsteps; - step++) - { - /* read blocks that intersect with the selection */ - block = firstblock; - for (int j = 0; j < vi->nblocks[step]; j++) - { - ADIOS_SELECTION *blockbb = adios_selection_boundingbox( - vi->ndim, vi->blockinfo[block].start, - vi->blockinfo[block].count); - ADIOS_SELECTION *intersectbb = - adios_selection_intersect_global(bb, blockbb); - if (intersectbb) - { - size_t ele_num = 0; - for (int i = 0; i < vi->ndim; i++) - ele_num += vi->blockinfo[block].count[i]; - int size_of_type = adios_type_size(vi->type, nullptr); - char *blockdata = malloc(ele_num * size_of_type); - ADIOS_SELECTION *wb = adios_selection_writeblock(j); - adios_schedule_read(m_fh, wb, name.c_str(), step, 1, - blockdata); - adios_perform_reads(m_fh, 1); - - /* Copy data into place */ - uint64_t dst_stride; - uint64_t src_stride; - uint64_t dst_offset; - uint64_t src_offset; - std::vector<uint64_t> size_in_dset[32]; - - /* determine how many (fastest changing) dimensions can we - * copy in one swoop */ - int i; - for (i = vi->ndim - 1; i > -1; i--) - { - if (blockbb->u.bb.start[i] == offs[i] && - blockbb->u.bb.count[i] == ldims[i]) - { - datasize *= ldims[i]; - } - else - break; - } - - adios_util_copy_data(data, blockdata, 0, vi->ndim, - size_in_dset.data(), bbsize, - ldims.data(), dst_stride, src_stride, - dst_offset, src_offset, ele_num, - size_of_type, adios_flag_no, vi->type); - - adios_selection_delete(intersectbb); - free(blockdata); - } - adios_selection_delete(blockbb); - block++; - } - } - adios_selection_delete(bb); - } - adios_free_varinfo(vi); -#endif -} - void ADIOS1Reader::ScheduleReadCommon(const std::string &name, const Dims &offs, const Dims &ldims, const int fromStep, const int nSteps, @@ -298,10 +205,6 @@ void ADIOS1Reader::ScheduleReadCommon(const std::string &name, const Dims &offs, } } } - else if (readAsJoinedArray) - { - ReadJoinedArray(name, offs, ldims, fromStep, nSteps, data); - } else { uint64_t start[32], count[32]; @@ -313,7 +216,7 @@ void ADIOS1Reader::ScheduleReadCommon(const std::string &name, const Dims &offs, ADIOS_SELECTION *sel = nullptr; if (ldims.size() > 0) { - adios_selection_boundingbox(ldims.size(), start, count); + sel = adios_selection_boundingbox(ldims.size(), start, count); } adios_schedule_read(m_fh, sel, name.c_str(), (int)fromStep, (int)nSteps, data);