Our goal is to define an abstract device interface (ADI) on which MPI [1] can be efficiently implemented. This discussion is in terms of the MPICH implementation, a freely available, widely used version of MPI. The ADI provides basic, point-to-point message-passing services for the MPICH implementation of MPI. The MPICH code handles the rest of the MPI standard, including the management of datatypes, and communicators, and the implementation of collective operations with point-to-point operations. Because many of the issues involve understanding details of the MPI specification (particularly the obscure corners that users can ignore but that an implemenation must handle), familarity with Version 1.1 of the MPI standard is assumed in this paper [2].
This note also discusses changes to the MPICH implementation to improve performance, particularly with respect to the organization of MPI_Request. To fully understand these comments, some familiarity with the MPICH implementation of MPI is required.
To make the discussion more concrete, we sometimes use ``ADI'' to refer to a particular implementation of the ADI. However, the ADI is defined by the specification of the interface, not by any particular implementation.
The rest of this paper is organized as follows. Section Principles describes the guiding design principles and objectives. Section The Contiguous Routines describes the routines for moving contiguous data. Section Noncontiguous Operations discusses the support for the noncontiguous and heterogeneous data types. Section Other Functions discusses the other, supporting functions provided by the ADI. Section Special Considerations discusses some of the unusual cases that the MPI standard requires be handled. Finally, Section Examples shows some simple message-passing programs that use only the ADI functions defined here.