Without question, the most important MPI implementation is MPICH, a freely available portable implementation of MPI developed at Argonne National Laboratory and Mississippi State University . MPICH has played an important role in the development of MPI.
MPICH is the parent of a large number of commercial implementations of MPI. These include vendor-supported implementations from Digital, Sun, HP, SGI/Cray, NEC and Fujitsu. In some cases (e.g., SGI and HP) the implementation has evolved far from its roots; in others (e.g., Digital and Sun) the implementation is young and still close to MPICH. Only two of the major vendor-supported implementations are not directly derived from MPICH: the Cray T3D/E implementation (which derives from the CHIMP implementation) and the IBM SP implementation (for which MPICH still provided substantial inspiration). The HP implementation also has a second parent in LAM. MPICH is also the basis for most experimental and research versions of MPI.
The first version of MPICH was written during the MPI standardization process. The experiences of the MPICH authors provided important feedback to the MPI Forum, including a proof-by-example that it was not necessary to define a subset of MPI in order to make the implementation of MPI less burdensome. MPICH was released at approximately the same time as the original MPI 1.0 standard.
The portability of MPICH stems from its two-layer design. The bulk of MPICH code is device independent and is implemented on top of an Abstract Device Interface (ADI). The ADI interface hides most hardware-specific details, allowing MPICH to be easily ported to new architectures. The ADI design allows for efficient layering, and the device-independent top layer takes care of the majority of MPI syntax and semantics.
With release 1.1 of MPICH (current as of this writing) the ADI layer was changed. The new interface, known as ADI-2, is not yet proven on a large number of architectures, though it was designed using lessons learned from ADI-1. ADI-2 should add new opportunities for performance. For example, a set of optional datatype functions expose MPI datatypes to the implementor, allowing him or her to take advantage of special hardware or use optimized techniques for transferring noncontiguous datatypes.
Each implementation of the ADI layer is called a ``device,'' and each MPICH device effectively defines a new implementation. The following sections describe the devices that are distributed with MPICH.