openPMD-api is designed to support both serial as well as parallel I/O. The latter is implemented through the Message Passing Interface (MPI).
A collective operation needs to be executed by all MPI ranks of the MPI communicator that was passed to openPMD::Series
. Contrarily, independent operations can also be called by a subset of these MPI ranks. For more information, please see the MPI standard documents, for example MPI-3.1 in "Section 2.4 - Semantic Terms".
Functionality | Behavior | Description |
---|---|---|
Series |
collective | open and close |
::flush() |
collective | read and write |
Iteration 1 |
independent | declare and open |
::open() 2 |
collective | explicit open |
Mesh 3 |
independent | declare, open, write |
ParticleSpecies 4 |
independent | declare, open, write |
::setAttribute 5 |
backend-specific | declare, write |
::getAttribute |
independent | open, reading |
RecordComponent 6 |
independent | declare, open, write |
::resetDataset 78 |
backend-specific | declare, write |
::makeConstant 9 |
backend-specific | declare, write |
::storeChunk 10 |
independent | write |
::loadChunk |
independent | read |
::availableChunks 11 |
collective | read, immediate result |
Alternatively, iterations might be accessed for the first time by immediate operations such as ::availableChunks()
.
Tip
Just because an operation is independent does not mean it is allowed to be inconsistent. For example, undefined behavior will occur if ranks pass differing values to ::setAttribute
or try to use differing names to describe the same mesh.
Note
This section is a stub. We will improve it in future versions.
Write as large data set chunks as possible in ::storeChunk
operations.
Read in large, non-overlapping subsets of the stored data (::loadChunk
). Ideally, read the same chunk extents as were written, e.g. through ParticlePatches
(example to-do).
See the implemented I/O backends <backends-overview>
for individual tuning options.
Individual backends, i.e.
parallel HDF5 <backends-hdf5>
, will only support independent operations if the default, non-collective (aka independent) behavior is kept. Otherwise these operations are collective.↩We usually open iterations delayed on first access. This first access is usually the
flush()
call after astoreChunk
/loadChunk
operation. If the first access is non-collective, an explicit, collectiveIteration::open()
can be used to have the files already open.↩Individual backends, i.e.
parallel HDF5 <backends-hdf5>
, will only support independent operations if the default, non-collective (aka independent) behavior is kept. Otherwise these operations are collective.↩Individual backends, i.e.
parallel HDF5 <backends-hdf5>
, will only support independent operations if the default, non-collective (aka independent) behavior is kept. Otherwise these operations are collective.↩HDF5 <backends-hdf5>
only supports collective attribute definitions/writes;ADIOS1 <backends-adios1>
andADIOS2 <backends-adios2>
attributes can be written independently. If you want to support all backends equally, treat as a collective operation. Note that openPMD represents constant record components with attributes, thus inheriting this for::makeConstant
.↩Individual backends, i.e.
parallel HDF5 <backends-hdf5>
, will only support independent operations if the default, non-collective (aka independent) behavior is kept. Otherwise these operations are collective.↩Individual backends, i.e.
parallel HDF5 <backends-hdf5>
, will only support independent operations if the default, non-collective (aka independent) behavior is kept. Otherwise these operations are collective.↩Dataset declarations in
parallel HDF5 <backends-hdf5>
are only non-collective ifchunking <backendconfig-hdf5>
is set tonone
(auto
by default). Otherwise these operations are collective.↩HDF5 <backends-hdf5>
only supports collective attribute definitions/writes;ADIOS1 <backends-adios1>
andADIOS2 <backends-adios2>
attributes can be written independently. If you want to support all backends equally, treat as a collective operation. Note that openPMD represents constant record components with attributes, thus inheriting this for::makeConstant
.↩Individual backends, i.e.
parallel HDF5 <backends-hdf5>
, will only support independent operations if the default, non-collective (aka independent) behavior is kept. Otherwise these operations are collective.↩We usually open iterations delayed on first access. This first access is usually the
flush()
call after astoreChunk
/loadChunk
operation. If the first access is non-collective, an explicit, collectiveIteration::open()
can be used to have the files already open.↩