[Numpy-discussion] Linking other libm-Implementation

Nathaniel Smith njs at pobox.com
Sun Feb 7 20:15:06 EST 2016


On Sun, Feb 7, 2016 at 4:39 PM, Nils Becker <nilsc.becker at gmail.com> wrote:
> Hi all,
>
> I wanted to know if there is any sane way to build numpy while linking to a
> different implementation of libm?
> A drop-in replacement for libm (e.g. openlibm) should in principle work, I
> guess, but I did not manage to actually make it work. As far as I understand
> the build code, setting MATHLIB=openlibm should suffice, but it did not. The
> build works fine, but in the end when running numpy apparently the functions
> of the system libm.so are used. I could not verify this directly (as I do
> not know how) but noticed that there is no performance difference between
> the builds - while there is one with pure C programs linked against libm and
> openlibm.
> Using amdlibm would require some work as the functions are prefixed with
> "_amd", I guess? Using intels libimf should work when using intels compiler,
> but I did not try this. With gcc I did not get it to work.
>
> A quite general question: At the moment the performance and the accuracy of
> the base mathematical functions depends on the platform and
> libm-Implementation of the system. Although there are functions defined in
> npy_math, they are only used as fall-backs, if they are not provided by a
> library. (correct me if I am wrong here)
> Is there some plan to change this in the future and provide defined
> behaviour (specified accuracy and/or speed) across platforms? As I
> understood it Julia started openlibm for this reason (which is based on
> fdlibm/msun, same as npy_math).

The npy_math functions are used if otherwise unavailable OR if someone
has at some point noticed that say glibc 2.4-2.10 has a bad quality
tan (or whatever) and added a special case hack that checks for those
particular library versions and uses our built-in version instead.
It's not the most convenient setup to maintain, so there's been some
discussion of trying openlibm instead [1], but AFAIK you're the first
person to find the time to actually sit down and try doing it :-).

You should be able to tell what math library you're linked to by
running ldd (on linux) or otool (on OS X) against the .so / .dylib
files inside your built copy of numpy -- e.g.

  ldd numpy/core/umath.cpython-34m.so

(exact filename and command will vary depending on python version and platform).

-n

[1] https://github.com/numpy/numpy/search?q=openlibm&type=Issues&utf8=%E2%9C%93

-- 
Nathaniel J. Smith -- https://vorpus.org



More information about the NumPy-Discussion mailing list