RMA Test Cases
LocalConcurrency test cases
Combines different operations with different RMA sync modes to cover all possible conflict/sync variants for local concurrency problems / local buffer races.
Operations / Calls covered:
- Buffer accesses: buffer read, buffer write
- Local buffer write: MPI_Get, MPI_Rget
- Local buffer read: MPI_Put, MPI_Rput, MPI_Accumulate, MPI_Raccumulate, MPI_Get_accumulate, MPI_Rget_accumulate, MPI_Fetch_and_op, MPI_Compare_and_swap (Note: MPI_Get_accumulate and others may also write results in another local buffer, but we only consider the reading accesses here.)
Synchronization modes covered:
- Fences: MPI_Win_fence
- Lockall + Flush_all + Unlock_all
- Lockall + Flush_local_all + Unlock_all
- Lock + Flush + Unlock: MPI_Win_(lock|flush|unlock)
- Lock + Unlock
- Requests: MPI_R(put|get|accumulate|get_accumulate) + MPI_Wait
- PSCW
- Currently missing: Lock_all + Unlock_all
Currently missing compared to MBI (for LocalConcurrency):
- Conflict between MPI RMA operation and (non-)blocking P2P, e.g. MPI_Get + MPI_Isend/Send on the same buffer
- The conflicting access could be on a separate buffer or on the window itself (i.e., the window memory itself could be target of a local buffer access).
GlobalConcurrency test cases
Operations / Calls covered:
- Buffer accesses: buffer read, buffer write
- Local buffer read/write: MPI_Put / MPI_Get (we do not consider all other possibilities of local buffer accesses to avoid a test case explosion)
- Remote read: MPI_Get, MPI_Put
- Remote write: MPI_Put, MPI_Rput, MPI_Accumulate, MPI_Raccumulate, MPI_Get_accumulate, MPI_Rget_accumulate, MPI_Fetch_and_op, MPI_Compare_and_swap
Synchronization modes covered:
- Fences: MPI_Win_fence
- Lockall + Flush_all + Barrier + Unlock_all
- Lock + Unlock: Exclusive vs. Shared
- Requests: MPI_R(put|get|accumulate|get_accumulate) + MPI_Wait
- PSCW
- Optional (currently missing): Lock + Unlock, Lock_all + Unlock_all
Invalid Argument test cases
- Invalid target rank (-1, >= nranks, ...)
- Invalid buffer (NULL)
- Invalid Datatype (MPI_DATATYPE_NULL, freed data type)
- Invalid window (no window initialized, window freed to early)
Epoch Lifecycle
- RMA access before epoch is opened
- RMA access without closing epoch
- Double open of access epoch (double lock, non-collective fence)
- Mixing RMA access modes (fence + lock)