The MPI Interceptor Library handles the typechecking of MPI calls using the TypeART Runtime System. It injects itself between the caller and the callee of every MPI send and/or receive function and logs information about the types and buffer sizes used as arguments to each call and warns when the buffer type does not match the MPI type or the size of any buffer given as an argument is insufficient w.r.t. the arguments of the call.
This document gives an overview of whether and how any given MPI function is typechecked. If for any MPI call TypeART prints an error which you would not expect, please first refer to this document to check whether your usecase is covered by this library. If you think that you found a reasonable usecase that should be typechecked successfully but is not currently covered by this library please create an issue in the TypeART GitHub repository.
The following function are currently not typechecked:
MPI provides a number of type combinators which can create new user-defined types based on existing MPI types. A list of all type combiners can be found here.
- MPI_Type_hvector
- MPI_Type_hindexed
- MPI_Type_create_hindexed_block
- MPI_Type_create_darray
- MPI_Type_create_f90_real
- MPI_Type_create_f90_complex
- MPI_Type_create_f90_integer
- MPI_Type_create_resized
In cases where a variable has a struct type where the first member of that type has an offset of 0 bytes, the runtime cannot discern whether an address to an instance of this struct is meant to have the type of that struct or of the first member. In these cases the runtime first tries to match the MPI type to the struct type and then, if that fails, recursively attempts to match it to the type of the first member.
The original type will be used for the typecheck. No special limitations apply.
Matches any buffer that is an array and can hold at least count elements of a
datatype that matches oldtype.
Matches any buffer that is an array and can hold at least (count - 1) * stride + blocklength
elements of a datatype that matches oldtype.
Note: negative strides are currently unsupported.
Matches any buffer that is an array and can hold at least max(array_of_displacements) + blocklength
elements of a datatype that matches oldtype.
Note: negative displacements are currently unsupported.
Matches any buffer that has a struct type where
- the struct has the same number of members as the MPI type,
- the offset of each member (as determined by the offsetof-operator) matches the displacement in the MPI type,
- the type of each member matches the respective MPI type and
- where the buffer can hold at least
countinstances of the struct type.
Matches any buffer that is an array and can hold at least as many elements as
the product of all array_of_sizes elements of a datatype that matches oldtype.