(ADaptive Input Output System v2) library. It acts as a translation layer
converting generic I/O calls from the session interface into specific calls
to the ADIOS2 API.
The adios2_reader_t and adios2_writer_t types defined here extend the
abstract base types from m_io_base and implement required procedures
This backend leverages several key features of the underlying ADIOS2 library
- engine abstraction - the same API can be used for different transport
methods (e.g. BP4, BP5, HDF5)
- Asynchronous I/O - by default ADIOS2 uses a deferred transport mode
which can improve performance by overlapping computation and I/O
- MPI integration - it is designed for large-scale parallel I/O and
integrates with MPI, though serial operation is also supported
GPU-aware writes (built with WITH_ADIOS2_GPU_AWARE, which defines
X3D2_ADIOS2_CUDA) hand device memory straight to ADIOS2:
- the solver backend packs each field into a contiguous, unpadded device
buffer (base_backend_t%export_field_to_device), so this module needs
no knowledge of the backend's field layout or allocator types
- one staging buffer belongs to the open file and is reused across
fields and steps, so no device memory is allocated per write
- puts are synchronous: ADIOS2 2.12's BP5 engine copies GPU buffers
during Put whatever mode is requested, so the buffer is free again as
soon as the put returns
Runtime options, read from the environment when the first writer starts:
- X3D2_ADIOS2_GPU_WRITE_MODE=auto|gpu|host (default auto): host forces
the device-to-host staged path even when GPU-aware writes are available
- X3D2_ADIOS2_IO_BENCH=0|1 (default 0): time Put and EndStep per step and
print a summary when the file closes, excluding the first
bench_warmup_steps steps
Note
This is an internal backend module and should never be used directly.
All user interaction must go through m_io_session.
Nodes of different colours represent the following:
Solid arrows point from a submodule to the (sub)module which it is
descended from. Dashed arrows point from a module or program unit to
modules which it uses.
Where possible, edges connecting nodes are
given different colours to make them easier to distinguish in
large graphs.