[Mpi-forum] ABI

Jeff Hammond jeff.science at gmail.com
Wed Dec 4 19:00:12 CST 2013

1) Intel has a patent on how to do this with PMPI. You're welcome to implement that on your own. 

2) Let me know when PETSc and Trilinos are anything-compatible :-P


Sent from my iPhone

> On Dec 4, 2013, at 6:23 PM, Jed Brown <jedbrown at mcs.anl.gov> wrote:
> "Jeff Squyres (jsquyres)" <jsquyres at cisco.com> writes:
>> Integer vs. pointer is but one of MANY issues that prevent MPI
>> implementations from being ABI compatible.  Let's not also forget:
> Yes, there are a lot of issues, but I don't think it's as insurmountable
> as it may appear.
>> - Values of constants.  Simple integer values are usually easy to
>> device/resolve (but don't forget that some integer values are
>> specifically chosen on specific platforms). Sentinel values like
> Section 2.5.4 (Named Constants) has a very short list of items that are
> actually required to be compile-time constants.  Current implementations
> put the values of far more constants into the ABI than the standard
> requires.
>> - Size/content of MPI_Status.  MPI implementations hide (different)
>> non-public fields in MPI_Status.
> These are not so wildly different.  Note that the non-public fields can
> be used for different things, they just have to add up to the same total
> size.
> typedef struct MPI_Status {
>    int MPI_SOURCE;
>    int MPI_TAG;
>    int MPI_ERROR;
>    MPI_Count count;
>    int cancelled;
>    int abi_slush_fund[2];    
> } MPI_Status;
> struct ompi_status_public_t {
>    /* These fields are publicly defined in the MPI specification.
>       User applications may freely read from these fields. */
>    int MPI_SOURCE;
>    int MPI_TAG;
>    int MPI_ERROR;
>    /* The following two fields are internal to the Open MPI
>       implementation and should not be accessed by MPI applications.
>       They are subject to change at any time.  These are not the
>       droids you're looking for. */
>    int _cancelled;
>    size_t _ucount;
> };
>> - Launcher differences.  The mpirun/mpiexec (or whatever launcher) is
>> inherently different, with different CLI options and configuration,
>> between different MPI implementations.
> Doesn't matter because the launcher sets the environment so that the
> correct library is used.  You would use the MPICH mpiexec to run with
> the MPICH libraries and the OMPI mpiexec to run with OMPI libraries.
> You only ever interact with your library.
>> - Library names.  libmpi.so?  libompi.so?  libmpich.so?  libmpi.a?  And so on.
> libmpi.so, obviously.  ;-)
> This should only expose the standard symbols.  /mpich/lib/libmpi.so and
> /ompi/lib/libmpi.so can link to whatever private libraries they want;
> those are not part of the ABI.
>> - Dependent libraries.  What else do you need to link when linking the
>> application?  You can (usually) hide this when the MPI is a shared
>> library, but a) not always, and b) that doesn't help when MPI is a
>> static library.
> A standard ABI is not useful for static libraries because you have to
> rebuild (it could save you recompiling all the sources, but you're back
> in the build system instead of the runtime).
> Proper shared library etiquette is to always hide dependent libraries.
>> - Compiler ABIs.  MPI middleware cannot solve the fact that C++ and
>> Fortran compilers cannot (and will not) agree on an ABI (for many good
>> reasons, BTW).
> We can't standardize between incompatible compilers, so assume
> compatible compilers.
>> - Compiler options.  Was the MPI library compiled with -O3?  -i8?  -32 or -64?  ...?
> Same problem we have today.  If you compile with the same flags, we'd
> like the ABI to match.
>> The fact of the matter is that the MPI API was *specifically designed
>> with only source compatibility in mind*.  We now have nearly 20 years
>> of momentum in different MPI implementations with different
>> engineering design choices.
>> The term "ABI" is a catchall for many, many different issues.  People
>> seem to think that simply switching libraries at run time is a silver
>> bullet -- "if only I could just change my LD_LIBRARY_PATH and use a
>> different MPI implementation, then the world would be better".  But
>> let's also not forget that most users barely know how to use
>> LD_LIBRARY_PATH (if at all).
> /mpich/bin/mpiexec -n 2 ./myexecutable
> /ompi/bin/mpiexec -n 2 ./myexecutable
> The launcher sets LD_LIBRARY_PATH.  That is feasible (I think) and is
> the change that would save distributions, packagers, and users countless
> hours.
> _______________________________________________
> mpi-forum mailing list
> mpi-forum at lists.mpi-forum.org
> http://lists.mpi-forum.org/mailman/listinfo.cgi/mpi-forum

More information about the mpi-forum mailing list