The known corrections to MPI-2 are listed in this document. All page and line numbers are for the official version of the MPI-2 document available from the MPI Forum home page at http://www.mpi-forum.org. Information on reporting mistakes in the MPI documents is also located on the MPI Forum home page.
This is a DRAFT and is not official.
3.2.11 MPI_GET_COUNT with zero-length datatypes
The value returned as the count argument of
MPI_GET_COUNT for a datatype of length zero where zero bytes
have been transferred is zero. If the number of bytes transfered is
greater than zero, MPI_UNDEFINED is returned.
Rationale.
Zero-length datatypes may be created in a number of cases. In MPI-2,
an important case is MPI_TYPE_CREATE_DARRAY, where the
definition of the particular darry results in an empty block on some
MPI process. Programs written in an SPMD style will not check for
this special case and may want to use MPI_GET_COUNT to check
the status.
( End of rationale.)
3.2.12 MPI_GROUP_TRANSLATE_RANKS and MPI_PROC_NULL
MPI_PROC_NULL is a valid rank for input to MPI_GROUP_TRANSLATE_RANKS, which returns MPI_PROC_NULL as the translated rank.
MPI_Errhandler MPI_Errhandler_f2c(MPI_Fint errhandler)
MPI_Fint MPI_Errhandler_c2f(MPI_Errhandler errhandler)
These were overlooked.
void cpp_lib_call(MPI::Comm& cpp_comm);but should read
void cpp_lib_call(MPI::Comm cpp_comm);
char name[MPI_MAX_NAME_STRING];but should read
char name[MPI_MAX_OBJECT_NAME];since MPI_MAX_NAME_STRING is not an MPI-defined constant.
MPI_{COMM,WIN,FILE}_GET_ERRHANDLER behave as if a new error handler object is created. That is, once the error handler is no longer needed, MPI_ERRHANDLER_FREE should be called with the error handler returned from MPI_ERRHANDLER_GET or MPI_{COMM,WIN,FILE}_GET_ERRHANDLER to mark the error handler for deallocation. This provides behavior similar to that of MPI_COMM_GROUP and MPI_GROUP_FREE.
MPI_BYTE should be used to send and receive data that is packed using MPI_PACK_EXTERNAL.
Rationale.
MPI_PACK_EXTERNAL specifies that there is no header on the message
and further
specifies the exact format of the data. Since MPI_PACK may (and is
allowed
to) use a header, the datatype MPI_PACKED cannot be used for data
packed with
MPI_PACK_EXTERNAL.
( End of rationale.)
Many of the descriptions of the collective routines provide illustrations in terms of blocking MPI point-to-point routines. These are intended solely to indicate what data is sent or received by what process. Many of these examples are not correct MPI programs; for purposes of simplicity, they often assume infinite buffering.
MPI_PROC_NULL is a valid target rank in the MPI RMA calls MPI_ACCUMULATE, MPI_GET, and MPI_PUT. The effect is the same as for MPI_PROC_NULL in MPI point-to-point communication.
void MPI::Win::Get(const void *origin_addr, int origin_count, const MPI::Datatype& origin_datatype, int target_rank, MPI::Aint target_disp, int target_count, const MPI::Datatype& target_datatype) const
but should read
void MPI::Win::Get(void *origin_addr, int origin_count, const
MPI::Datatype& origin_datatype, int target_rank, MPI::Aint target_disp,
int target_count, const MPI::Datatype& target_datatype) const
MPI_REPLACE, like the other predefined operations, is defined only for the predefined MPI datatypes.
Rationale.
The rationale for this is that, for consistency, MPI_REPLACE
should have the same limitations as the other operations. Extending
it to all datatypes doesn't provide any real benefit.
( End of rationale.)
Both groups should provide the same count value.
but should read
Both groups should provide count and datatype arguments that specify the same type signature.
Advice
to implementors.
High quality implementations should raise an error when a keyval
that was created by a call to MPI_XXX_CREATE_KEYVAL is
used with an object of the wrong type with a call to
MPI_YYY_GET_ATTR, MPI_YYY_SET_ATTR, MPI_YYY_DELETE_ATTR, or
MPI_YYY_FREE_KEYVAL. To do so, it is necessary to maintain, with
each keyval, information on the type of the associated user
function.
( End of advice to implementors.)
bool MPI::Win::Get_attr(const MPI::Win& win, int win_keyval, void* attribute_val) const
but should read
bool MPI::Win::Get_attr(int win_keyval, void* attribute_val) const
MPI_DISPLACEMENT_CURRENT is invalid unless the amode for the file has MPI_MODE_SEQUENTIAL set.
If MPI_MODE_SEQUENTIAL mode was specified when the file was opened, it is erroneous to call the routines in this section.
but should read
If MPI_MODE_SEQUENTIAL mode was specified when the file was opened, it is erroneous to call the routines in this section, with the exception of MPI_FILE_GET_BYTE_OFFSET.
MPI_LONG_LONG 8but should read
MPI_LONG_LONG_INT 8In addition, the type MPI_LONG_LONG should be added as an optional type; it is a synonym for MPI_LONG_LONG_INT.
typedef MPI::Datarep_extent_function(const MPI::Datatype& datatype,but should read
typedef void MPI::Datarep_extent_function(const MPI::Datatype& datatype,
typedef MPI::Datarep_conversion_function(void* userbuf, MPI::Datatype& datatype, int count, void* filebuf, MPI::Offset position, void* extra_state);
but should read
typedef void MPI::Datarep_conversion_function(void* userbuf, MPI::Datatype& datatype, int count, void* filebuf, MPI::Offset position, void* extra_state);
void Send(void* buf, int count, const MPI::Datatype& type,but should read
void Send(const void* buf, int count, const MPI::Datatype& type,
void MPI::Win::Get(const void *origin_addr, int origin_count, constbut should read
void MPI::Win::Get(void *origin_addr, int origin_count, const
typedef MPI::Datarep_conversion_function(void* userbuf,but should read
typedef void MPI::Datarep_conversion_function(void* userbuf,
typedef MPI::Datarep_extent_function(const MPI::Datatype& Datatype,but should read
typedef void MPI::Datarep_extent_function(const MPI::Datatype& Datatype,
Remove the const from const MPI::Datatype.
Remove the const from const MPI::Datatype.
Remove the const from const MPI::Datatype.
// Type: MPI::Errhandlerbut should read
// Type: const MPI::Errhandler
void Get_version(int& version, int& subversion);
but should read
void Get_version(int& version, int& subversion)
Exception::Exception(int error_code);
int Exception::Get_error_code() const;
int Exception::Get_error_class() const;
const char* Exception::Get_error_string() const;
but should read
Exception::Exception(int error_code)
int Exception::Get_error_code() const
int Exception::Get_error_class() const
const char* Exception::Get_error_string() const
but should read
but should read