5.2. Open MPI extensions
Open MPI contains a framework for extending the MPI API that is available to applications. Each extension is usually a standalone set of functionality that is distinct from other extensions (similar to how Open MPI’s plugins are usually unrelated to each other). These extensions provide new functions and/or constants that are available to MPI applications.
Warning
These extensions are neither standard nor portable to other MPI implementations!
They are a mechanism for the Open MPI developer community to provide new functionality to users, typically before it becomes standardized by the MPI Forum.
5.2.1. Available extensions
The following extensions are included in this version of Open MPI:
shortfloat
: Provides MPI datatypesMPIX_C_FLOAT16
,MPIX_SHORT_FLOAT
,MPIX_SHORT_FLOAT
, andMPIX_CXX_SHORT_FLOAT_COMPLEX
if corresponding language types are available. Seeompi/mpiext/shortfloat/README.txt
for details.affinity
: Provides theOMPI_Affinity_str()
API, which returns a string indicating the resources which a process is bound. For more details, see its man page.cuda
: When the library is compiled with CUDA-aware support, it provides two things. First, a macroMPIX_CUDA_AWARE_SUPPORT
. Secondly, the functionMPIX_Query_cuda_support()
that can be used to query for support.example
: A non-functional extension; its only purpose is to provide an example for how to create other extensions.ftmpi
: An implementation of the User Level Fault Mitigation (ULFM) proposal. See its documentation section for more details.
5.2.2. Compiling the extensions
Open MPI extensions are all enabled by default; they can be disabled
via the --disable-mpi-ext
command line switch.
Since extensions are meant to be used by advanced users only, this
file does not document which extensions are available or what they do.
Look in the ompi/mpiext
directory in a distribution Open MPI
tarball to see the extensions; each subdirectory of that directory
contains an extension. Each has a README
file that describes what
it does.
5.2.3. Using the extensions
To reinforce the fact that these extensions are non-standard, you must
include a separate header file after <mpi.h>
to obtain the function
prototypes, constant declarations, etc. For example:
#include <mpi.h>
#if defined(OPEN_MPI) && OPEN_MPI
#include <mpi-ext.h>
#endif
int main() {
MPI_Init(NULL, NULL);
#if defined(OPEN_MPI) && OPEN_MPI
char ompi_bound[OMPI_AFFINITY_STRING_MAX];
char current_binding[OMPI_AFFINITY_STRING_MAX];
char exists[OMPI_AFFINITY_STRING_MAX];
OMPI_Affinity_str(OMPI_AFFINITY_LAYOUT_FMT, ompi_bound,
current_bindings, exists);
#endif
MPI_Finalize();
return 0;
}
Notice that the Open MPI-specific code is surrounded by the #if
statement to ensure that it is only ever compiled by Open MPI.
The Open MPI wrapper compilers (mpicc
and friends) should
automatically insert all relevant compiler and linker flags necessary
to use the extensions. No special flags or steps should be necessary
compared to “normal” MPI applications.