[Numpy-discussion] Proposed fix for MKL and dynamic loading

Dag Sverre Seljebotn dagss at student.matnat.uio.no
Thu Jan 21 06:59:15 EST 2010


Dag Sverre Seljebotn wrote:
> (Apologies if this has been fixed in trunk; I base this on 1.4.0 and no 
> related comments of MKL on the mailing list)
>
> I finally got the latest version of MKL working. What appears to have 
> changed is that the MKL shared libraries will themselves dynamically 
> load different other libraries, depending on the detected CPU.
>
> This is in some ways great news for me, because it means I can avoid 
> worrying about miscompiles when compiling one single version of 
> NumPy/SciPy to use for our heterogenous cluster. So I'd rather *not* 
> link statically [1].
>
> Anyway, after modifying site.cfg [2], things almost work, but not quite. 
> The problem is that Python by default imports shared libs using 
> RTLD_LOCAL. With this patch to NumPy it does:
>
> Change in numpy/linalg/linalg.py:
>
> from numpy.linalg import lapack_lite
>
> to:
>
> try:
>     import sys
>     import ctypes
>     _old_rtld = sys.getdlopenflags()
>     sys.setdlopenflags(_old_rtld|ctypes.RTLD_GLOBAL)
>     from numpy.linalg import lapack_lite
> finally:
>     sys.setdlopenflags(_old_rtld)
>     del sys; del ctypes; del _old_rtld
>
> Questions:
>
> a) Should I submit a patch?
> b) Negative consequences? Perhaps another Python module can now not load 
> a different BLAS implementation? (That still seems better than not being 
> able to use MKL IMO).
> c) Should this only be enabled by a flag somewhere? Where? Or can one 
> just do it regardless of BLAS?
> d) Do I need a "if hasattr" for Windows, or will Windows just ignore it, 
> or does this apply to Windows too?
>
> [1] BTW, I could not figure out how to link statically if I wanted -- is 
> "search_static_first = 1" supposed to work? Perhaps MKL will insist on 
> loading some parts dynamically even then *shrug*.
>   
Forgot this:

[2] Here's my site.cfg:

[mkl]
library_dirs=/mn/corcaroli/d1/dagss/intel/mkl/10.2.3.029/lib/em64t
include_dirs = /mn/corcaroli/d1/dagss/intel/mkl/10.2.3.029/include
lapack_libs = mkl_lapack
mkl_libs = mkl_intel_lp64, mkl_intel_thread, mkl_core, iomp5

Then I need to set LD_LIBRARY_PATH as well prior to running (which I'm 
quite OK with).

Dag Sverre



More information about the NumPy-Discussion mailing list