On Mar 15, 2007, at 5:02 PM, Michael wrote:

I would like to hear just how portable an executable compiled against
OpenMPI shared libraries should be.

This is a hard question to answer:

1. We have not done this explicit kind of testing.
2. Open MPI's libmpi.so itself is plain vanilla C. If you have an application that is already portable, linking it against Open MPI should not cause it to be less portable. 3. Open MPI, however, can use many support libraries (e.g., libmosal in your previous mail). This myriad of extra libraries may create difficulties in creating a truly portable application.

The best practices that I have seen have been:

- start with an application that itself is already portable (without MPI)
- compile everything 100% static

But this has drawbacks as well -- consider if you link in libmosal.a to your MPI application and then take it to another system that has a slightly different version of VAPI (e.g., a kernel interface changed). Although your application will load and start running (i.e., no runtime linker resolution failures), it may fail in unpredictable ways later because the libmosal.a in your application calls down to the kernel in ways that are unsupported by the VAPI/ libmosal on the current system.

Make sense?

This is unfortunately not an MPI (or Open MPI) specific issue; it's a larger problem of creating truly portable software. To have a better chance of success, you probably want to ensure that all relevant points of interaction between your application and the outside system are either the same version or "compatible enough".

- high-speed networking support libraries
- resource manager support libraries
- libc
- ...etc.

Specifically, even though you won't be looking for .so's at runtime, you need to ensure that the way the .a's compiled into your application interact with the system is either the same way or "close enough" to how the corresponding support libraries work on the target machine.

All this being said, Open MPI did try to take steps in its design to be able to effect more portability (e.g., for ISV's). Theoretically -- we have not explicitly tested this -- the following setup may provide a better degree of portability:

- have the same version of Open MPI available on each machine, compiled against whatever support libraries are relevant on that machine (using plugins, not --enable-static).

- compile your application *dynamically* against Open MPI. Note that some of the upper-level configuration of Open MPI must be either the same or "close enough" between machines such that runtime linking will work properly (e.g., don't use a 32 bit libmpi on one machine and a 64 bit libmpi on another, etc. There's more details here, but you get the general idea)

- ensure that other (non-MPI-related) interaction points in your application are the same or "close enough" to be portable

By linking dynamically against Open MPI (which is plain vanilla C), the application will only be looking for Open MPI's plain C support libraries -- not the other support libraries (such as libmosal), because those are linked against OMPI's plugins -- not libmpi.so (etc.). This design effectively takes MPI out of the portability equation.

That's the theory, anyway.  :-)

I skipped many nit-picky details, so I'm sure there will be issues to figure out. But *in theory*, it's possible...

I'm compiling on a Debian Linux system with dual 1.3 GHz AMD Opterons
per node and an internal network of dual gigabit ethernet.

I'm planning on a SUSE Linux Enterprise Server 9 system with dual 3.6
GHz Intel Xeon EM64T per node and an internal network using Myrinet.

I can't speak for how portable Myrinet support libraries are... Myricom?

--
Jeff Squyres
Cisco Systems

Reply via email to