On Dec 12, 2007, at 7:47 PM, Lisandro Dalcin wrote:

You should, yes.

OK, but now I realize that I cannot simply call libtool dlopen()
inconditionally, as libmpi.so could not exist in a static lib build.

Right. Or it could be libmpi.dylib (OS X). I don't know if other extensions exist out there.

However, in this case, it would be easy enough to just try a few named extensions (libmpi.<foo>) -- they'll either all fail or one of them will succeed. But you would still need to tell if you're linked against libmpi.a or not -- dlopen'ing a shared library version when you already have a static version resident can cause problems (per the chart on the wiki).

Actually, regardless of who does the dlopen -- you or me -- we need to know this info (whether the linked-against libmpi was shared or static). Hmm. I can't think of a good way to do this off the top of my head.

After a little more thought, I think only the application can know this -- the application's build system can know whether it is linking against libmpi.a or libmpi.so and set some #define (or whatever) to know whether it needs to dlopen libmpi or not. :-\

Specifically: it would probably require some significant hackery in the OMPI build process to put in a #define that indicates whether OMPI is being built statically or not. But the AM/LT process shields this information from the build process by design (part of the issue is that AM/LT allows both static and shared libraries to be built simultaneously). We'd then have to introduce some global symbol that could be queried that is outside of the MPI interface. Neither of these things are attractive. :-(

Also, see my later post: doesn't perl/python have some kind of
portable dlopen anyway?  They're opening your module...?

Sorry -- it looks like the post I was referring to got stuck in my outbox and didn't get sent until earlier this morning.

AFAIK, Python does not. It uses specific, private code for this,
handling the loading of extension modules according to the OS's and
their idiosyncracies. However, Python enable users to change the flags
used for dlopen'ing your extension modules; the tricky part is to get
the correct values RTLD_GLOBAL in a portable way.

That's somewhat surprising -- there's no public interfaces for modules to portably load sub-modules? Bummer.

Is there any another way of setting a MCA parameter?
See http://www.open-mpi.org/faq/?category=tuning#setting-mca-params.

OK, it seems there isn't a programatic way. Anyway, putenv() should
not be a souce of portability problems.

No, we have no API for setting MCA params other than altering the environment. Also, most MCA params are read during MPI_INIT and not re-checked later during the run (it would be a bad idea, for example, to check MCA param values during the critical performance path).

--
Jeff Squyres
Cisco Systems

Reply via email to