Class SerializeIO
is a sentry class which performs serialization for mesh database I/O.
This sentry guards serialization of parallel I/O routines. At construction, it blocks the processes via an MPI barrier, releasing them to execute in groups specified by s_groupSize
. At destruction, it continues to block via MPI barriers until all the processor have been released by the constructor.
In the case where the constructor is called, and the sentry is already active and owned by the processes group, the constructor and destructor simply fall through since the serialization is already in place at a higher level.
- Note
- All ranks must call the SerializeIO constructor synchronously.
-
It is recommended to use RAII and keep the area protected by the SerializeIO as small as possible.
The flow is that the ranks are split into groups of the specified size. Assume 3 ranks of group size 1.
- First time through,
- rank 0 falls through and
- ranks 1, 2 sit at the barrier
- rank 0 hits the destructor and then all 3 ranks are in the barrier so they all go to next step
- (rank 1,2 in constructor, rank 0 in destructor)
s_owner
is now equal to m_groupRank
on rank 1, so it falls out of the do while;
- rank 2 still in the constructor do while Barrier
- rank 0 in the destructor do while Barrier
- rank 1 does its work and calls destructor;
- all ranks in Barrier, so they go to next step.
s_owner
now equal to m_groupRank
on rank 2, so if falls out of the do while;
- ranks 0,1 in destructor do while at the Barrier
- rank 2 does it work and calls destructor
- all ranks are now in the destructor Barrier, so they go to next step
- all ranks clear the Destructor and go to next step.