
A mindless task for a lazy weekend: convert all the README and README.txt files to Markdown. Paired with the slow conversion of all of our man pages to Markdown, this gives a uniform language to the Open MPI docs. This commit moved a bunch of copyright headers out of the top-level README.txt file, so I updated the relevant copyright header years in the top-level LICENSE file to match what was removed from README.txt. Additionally, this commit did (very) little to update the actual content of the README files. A very small number of updates were made for topics that I found blatently obvious while Markdown-izing the content, but in general, I did not update content during this commit. For example, there's still quite a bit of text about ORTE that was not meaningfully updated. Signed-off-by: Jeff Squyres <jsquyres@cisco.com> Co-authored-by: Josh Hursey <jhursey@us.ibm.com>
5.7 KiB
Open MPI extension: Example
Overview
This example MPI extension shows how to make an MPI extension for Open MPI.
An MPI extension provides new top-level APIs in Open MPI that are
available to user-level applications (vs. adding new code/APIs that is
wholly internal to Open MPI). MPI extensions are generally used to
prototype new MPI APIs, or provide Open MPI-specific APIs to
applications. This example MPI extension provides a new top-level MPI
API named OMPI_Progress
that is callable in both C and Fortran.
MPI extensions are similar to Open MPI components, but due to complex ordering requirements for the Fortran-based MPI bindings, their build order is a little different.
Note that MPI has 4 different sets of bindings (C, Fortran mpif.h
,
the Fortran mpi
module, and the Fortran mpi_f08
module), and Open
MPI extensions allow adding API calls to all 4 of them. Prototypes
for the user-accessible functions/subroutines/constants are included
in the following publicly-available mechanisms:
- C:
mpi-ext.h
- Fortran mpif.h:
mpif-ext.h
- Fortran "use mpi":
use mpi_ext
- Fortran "use mpi_f08":
use mpi_f08_ext
This example extension defines a new top-level API named
OMPI_Progress()
in all four binding types, and provides test programs
to call this API in each of the four binding types. Code (and
comments) is worth 1,000 words -- see the code in this example
extension to understand how it works and how the build system builds
and inserts each piece into the publicly-available mechansisms (e.g.,
mpi-ext.h
and the mpi_f08_ext
module).
Comparison to General Open MPI MCA Components
Here's the ways that MPI extensions are similar to Open MPI components:
-
Extensions have a top-level
configure.m4
with a well-known m4 macro that is run during Open MPI's configure that determines whether the component wants to build or not.Note, however, that unlike components, extensions must have a
configure.m4
. No other method of configuration is supported. -
Extensions must adhere to normal Automake-based targets. We strongly suggest that you use
Makefile.am
's and have the extension'sconfigure.m4
AC_CONFIG_FILE
eachMakefile.am
in the extension. Using other build systems may work, but are untested and unsupported. -
Extensions create specifically-named libtool convenience archives (i.e.,
*.la
files) that the build system slurps into higher-level libraries.
Unlike components, however, extensions:
- Have a bit more rigid directory and file naming scheme.
- Have up to four different, specifically-named subdirectories (one for each MPI binding type).
- Also install some specifically-named header files (for C and the
Fortran
mpif.h
bindings).
Similar to components, an MPI extension's name is determined by its
directory name: ompi/mpiext/EXTENSION_NAME
Extension requirements
Required: C API
Under this top-level directory, the extension must have a directory
named c
(for the C bindings) that:
- contains a file named
mpiext_EXTENSION_NAME_c.h
- installs
mpiext_EXTENSION_NAME_c.h
to$includedir/openmpi/mpiext/EXTENSION_NAME/c
- builds a Libtool convenience library named
libmpiext_EXTENSION_NAME_c.la
Optional: mpif.h
bindings
Optionally, the extension may have a director named mpif-h
(for the
Fortran mpif.h
bindings) that:
- contains a file named
mpiext_EXTENSION_NAME_mpifh.h
- installs
mpiext_EXTENSION_NAME_mpih.h
to$includedir/openmpi/mpiext/EXTENSION_NAME/mpif-h
- builds a Libtool convenience library named
libmpiext_EXTENSION_NAME_mpifh.la
Optional: mpi
module bindings
Optionally, the extension may have a directory named use-mpi
(for the
Fortran mpi
module) that:
- contains a file named
mpiext_EXTENSION_NAME_usempi.h
NOTE: The MPI extension system does NOT support building an
additional library in the use-mpi
extension directory. It is
assumed that the use-mpi
bindings will use the same back-end symbols
as the mpif.h
bindings, and that the only output product of the
use-mpi
directory is a file to be included in the mpi-ext
module
(i.e., strong Fortran prototypes for the functions/global variables in
this extension).
Optional: mpi_f08
module bindings
Optionally, the extension may have a directory named use-mpi-f08
(for
the Fortran mpi_f08
module) that:
- contains a file named
mpiext_EXTENSION_NAME_usempif08.h
- builds a Libtool convenience library named
libmpiext_EXTENSION_NAME_usempif08.la
See the comments in all the header and source files in this tree to see what each file is for and what should be in each.
Notes
Note that the build order of MPI extensions is a bit strange. The directories in a MPI extensions are NOT traversed top-down in sequential order. Instead, due to ordering requirements when building the Fortran module-based interfaces, each subdirectory in extensions are traversed individually at different times in the overall Open MPI build.
As such, ompi/mpiext/EXTENSION_NAME/Makefile.am
is not traversed
during a normal top-level make all
target. This Makefile.am
exists for two reasons, however:
- For the conveneince of the developer, so that you can issue normal
make
commands at the top of your extension tree (e.g.,make all
will still build all bindings in an extension). - During a top-level
make dist
, extension directories are traversed top-down in sequence order. Having a top-levelMakefile.am
in an extension allowsEXTRA_DIST
ing of files, such as thisREADME.md
file.
This are reasons for this strange ordering, but suffice it to say that
make dist
doesn't have the same ordering requiements as make all
,
and is therefore easier to have a "normal" Automake-usual top-down
sequential directory traversal.
Enjoy!