4.2.2. Message Data

PreviousUpNext
Up: Blocking Send and Receive Operations Next: Message Envelope Previous: Blocking Send

The send buffer specified by the MPI_SEND procedure consists of count successive entries of the type indicated by datatype, starting with the entry at address buf. Note that we specify the message length in terms of number of elements, not number of bytes. The former is machine independent and closer to the application level.

The data part of the message consists of a sequence of count values, each of the type indicated by datatype. count may be zero, in which case the data part of the message is empty. The basic datatypes that can be specified for message data values correspond to the basic datatypes of the host language. Possible values of this argument for Fortran and the corresponding Fortran types are listed in Table 2. Possible values for this argument for C and the corresponding C types are listed in Table 3.


Table 2: Predefined MPI datatypes corresponding to Fortran datatypes

MPI datatype Fortran datatype
MPI_INTEGER INTEGER
MPI_REAL REAL
MPI_DOUBLE_PRECISION DOUBLE PRECISION
MPI_COMPLEX COMPLEX
MPI_LOGICAL LOGICAL
MPI_CHARACTER CHARACTER(1)
MPI_BYTE
MPI_PACKED

Table 3: Predefined MPI datatypes corresponding to C datatypes

MPI datatype C datatype
MPI_CHAR char

(treated as printable character)

MPI_SHORT signed short int
MPI_INT signed int
MPI_LONG signed long int
MPI_LONG_LONG_INT

signed long long int

MPI_LONG_LONG (as a synonym)

signed long long int

MPI_SIGNED_CHAR signed char

(treated as integral value)

MPI_UNSIGNED_CHAR unsigned char

(treated as integral value)

MPI_UNSIGNED_SHORT unsigned short int
MPI_UNSIGNED unsigned int
MPI_UNSIGNED_LONG unsigned long int
MPI_UNSIGNED_LONG_LONG

unsigned long long int

MPI_FLOAT float
MPI_DOUBLE double
MPI_LONG_DOUBLE long double
MPI_WCHAR

wchar_t

(defined in <stddef.h>)

(treated as printable character)

MPI_C_BOOL _Bool
MPI_INT8_T int8_t
MPI_INT16_T int16_t
MPI_INT32_T int32_t
MPI_INT64_T int64_t
MPI_UINT8_T uint8_t
MPI_UINT16_T uint16_t
MPI_UINT32_T uint32_t
MPI_UINT64_T uint64_t
MPI_C_COMPLEX float _Complex
MPI_C_FLOAT_COMPLEX (as a synonym) float _Complex
MPI_C_DOUBLE_COMPLEX double _Complex
MPI_C_LONG_DOUBLE_COMPLEX long double _Complex
MPI_BYTE
MPI_PACKED

Table 4: Predefined MPI datatypes corresponding to both C and Fortran datatypes

MPI datatype C datatype Fortran datatype
MPI_AINT MPI_Aint INTEGER(KIND=MPI_ADDRESS_KIND)
MPI_OFFSET MPI_Offset INTEGER(KIND=MPI_OFFSET_KIND)
MPI_COUNT MPI_Count INTEGER(KIND=MPI_COUNT_KIND)
The datatypes MPI_BYTE and MPI_PACKED do not correspond to a Fortran or C datatype. A value of type MPI_BYTE consists of a byte (8 binary digits). A byte is uninterpreted and is different from a character. Different machines may have different representations for characters, or may use more than one byte to represent characters. On the other hand, a byte has the same binary value on all machines. The use of the type MPI_PACKED is explained in Section Pack and Unpack.

MPI requires support of these datatypes, which match the basic datatypes of Fortran and ISO C. Additional MPI datatypes should be provided if the host language has additional datatypes*: MPI_DOUBLE_COMPLEX for double precision complex in Fortran declared to be of type DOUBLE COMPLEX; MPI_REAL2, MPI_REAL4, MPI_REAL8, and MPI_REAL16 for Fortran reals, declared to be of type REAL*2, REAL*4, REAL*8, and REAL*16, respectively; MPI_INTEGER1, MPI_INTEGER2, MPI_INTEGER4, and MPI_INTEGER8 for Fortran integers, declared to be of type INTEGER*1, INTEGER*2, INTEGER*4, and INTEGER*8, respectively; MPI_COMPLEX4, MPI_COMPLEX8, MPI_COMPLEX16, and MPI_COMPLEX32 for complex numbers in Fortran declared to be of type COMPLEX*4, COMPLEX*8, COMPLEX*16, and COMPLEX*32, respectively; etc.


Rationale.

One goal of the design is to allow for MPI to be implemented as a library, with no need for additional preprocessing or compilation. Thus, one cannot assume that a communication call has information on the datatype of variables in the communication buffer; this information must be supplied by an explicit argument. The need for such datatype information will become clear in Section Data Conversion. ( End of rationale.)
The datatypes MPI_AINT, MPI_OFFSET, and MPI_COUNT correspond to the MPI-defined C types MPI_Aint, MPI_Offset, and MPI_Count and their Fortran equivalents INTEGER(KIND=MPI_ADDRESS_KIND) , INTEGER(KIND=MPI_OFFSET_KIND) , and INTEGER(KIND=MPI_COUNT_KIND) . This is described in Table 4. All predefined datatype handles are available in all language bindings. See Sections MPI Opaque Objects and Interlanguage Communication on page MPI Opaque Objects and Interlanguage Communication for information on interlanguage communication with these types.

If there is an accompanying C++ compiler then the datatypes in Table 5 are also supported in C and Fortran.


Table 5: Predefined MPI datatypes corresponding to C++ datatypes

MPI datatype C++ datatype
MPI_CXX_BOOL bool
MPI_CXX_FLOAT_COMPLEX std::complex<float>
MPI_CXX_DOUBLE_COMPLEX std::complex<double>
MPI_CXX_LONG_DOUBLE_COMPLEX std::complex<long double>


PreviousUpNext
Up: Blocking Send and Receive Operations Next: Message Envelope Previous: Blocking Send


Return to MPI-4.1 Standard Index
Return to MPI Forum Home Page

(Unofficial) MPI-4.1 of November 2, 2023
HTML Generated on November 19, 2023