<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Oct 6, 2015 at 1:04 PM, Nathaniel Smith <span dir="ltr"><<a href="mailto:njs@pobox.com" target="_blank">njs@pobox.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div>On Tue, Oct 6, 2015 at 11:52 AM, David Cournapeau <<a href="mailto:cournape@gmail.com" target="_blank">cournape@gmail.com</a>> wrote:<br>
><br>
><br>
> On Tue, Oct 6, 2015 at 7:30 PM, Nathaniel Smith <<a href="mailto:njs@pobox.com" target="_blank">njs@pobox.com</a>> wrote:<br>
>><br>
>> [splitting this off into a new thread]<br>
>><br>
>> On Tue, Oct 6, 2015 at 3:00 AM, David Cournapeau <<a href="mailto:cournape@gmail.com" target="_blank">cournape@gmail.com</a>><br>
>> wrote:<br>
>> [...]<br>
>> > I also agree the current situation is not sustainable -- as we discussed<br>
>> > privately before, cythonizing numpy.core is made quite more complicated<br>
>> > by<br>
>> > this. I have myself quite a few issues w/ cythonizing the other parts of<br>
>> > umath. I would also like to support the static link better than we do<br>
>> > now<br>
>> > (do we know some static link users we can contact to validate our<br>
>> > approach<br>
>> > ?)<br>
>> ><br>
>> > Currently, what we have in numpy core is the following:<br>
>> ><br>
>> > numpy.core.multiarray -> compilation units in numpy/core/src/multiarray/<br>
>> > +<br>
>> > statically link npymath<br>
>> > numpy.core.umath -> compilation units in numpy/core/src/umath +<br>
>> > statically<br>
>> > link npymath/npysort + some shenanigans to use things in<br>
>> > numpy.core.multiarray<br>
>><br>
>> There are also shenanigans in the other direction - supposedly umath<br>
>> is layered "above" multiarray, but in practice there are circular<br>
>> dependencies (see e.g. np.set_numeric_ops).<br>
><br>
> Indeed, I am not arguing about merging umath and multiarray.<br>
<br>
</div></div>Oh, okay :-).<br>
<span><br>
>> > I would suggest to have a more layered approach, to enable both 'normal'<br>
>> > build and static build, without polluting the public namespace too much.<br>
>> > This is an approach followed by most large libraries (e.g. MKL), and is<br>
>> > fairly flexible.<br>
>> ><br>
>> > Concretely, we could start by putting more common functionalities (aka<br>
>> > the<br>
>> > 'core' library) into its own static library. The API would be considered<br>
>> > private to numpy (no stability guaranteed outside numpy), and every<br>
>> > exported<br>
>> > symbol from that library would be decorated appropriately to avoid<br>
>> > potential<br>
>> > clashes (e.g. '_npy_internal_').<br>
>><br>
>> I don't see why we need this multi-layered complexity, though.<br>
><br>
><br>
> For several reasons:<br>
><br>
>  - when you want to cythonize either extension, it is much easier to<br>
> separate it as cython for CPython API, C for the rest.<br>
<br>
</span>I don't think this will help much, because I think we'll want to have<br>
multiple cython files, and that we'll probably move individual<br>
functions between being implemented in C and Cython (including utility<br>
functions). So that means we need to solve the problem of mixing C and<br>
Cython files inside a single library.<br>
<br>
If you look at Stefan's PR:<br>
  <a href="https://github.com/numpy/numpy/pull/6408" rel="noreferrer" target="_blank">https://github.com/numpy/numpy/pull/6408</a><br>
it does solve most of these problems. It would help if Cython added a<br>
few tweaks to officially support compiling multiple modules into one<br>
.so, and I'm not sure whether the current code quite handles<br>
initialization of the submodule correctly, but it's actually<br>
surprisingly easy to make work.<br>
<br>
(Obviously we won't want to go overboard here -- but the point of<br>
removing the technical constraints is that then it frees us to pick<br>
whatever arrangement makes the most sense, instead of deciding based<br>
on what makes the build system and linker easiest.)<br>
<span><br>
>  - if <a href="http://numpy.core.multiarray.so" rel="noreferrer" target="_blank">numpy.core.multiarray.so</a> is built as cython-based .o + a 'large' C<br>
> static library, it should become much simpler to support static link.<br>
<br>
</span>I don't see this at all, so I must be missing something? Either way<br>
you build a bunch of .o files, and then you have to either combine<br>
them into a shared library or combine them into a static library. Why<br>
does pre-combining some of them into a static library make this<br>
easier?<br>
<span><br>
>  - maybe that's just personal, but I find the whole multiarray + umath quite<br>
> beyond manageable in terms of intertwined complexity. You may argue it is<br>
> not that big, and we all have different preferences in terms of<br>
> organization, but if I look at the binary size of multiarray + umath, it is<br>
> quite larger than the median size of the .so I have in my /usr/lib.<br>
<br>
</span>The binary size isn't a good measure here -- most of that is the<br>
bazillions of copies of slightly tweaked loops that we auto-generate,<br>
which take up a lot of space but don't add much intertwined<br>
complexity. (Though now that I think about it, my LOC estimate was<br>
probably a bit low because cloc is probably ignoring those<br>
autogeneration template files.)<br>
<br>
We definitely could do a better job with our internal APIs -- I just<br>
think that'll be easiest if everything is in the same directory so<br>
there are minimal obstacles to rearranging and refactoring things.<br>
<br>
Anyway, it sounds like we agree that the next step is to merge<br>
multiarray and umath, so possibly we should worry about doing that and<br>
then see what makes sense from there :-).<br>
<div><div><br></div></div></blockquote><div><br></div><div>What about removing the single file build? That seems somewhat orthogonal to this discussion. Would someone explain to me the advantages of the single file build for static linking, apart from possible doing a better job of hiding symbols? If symbols are the problem, it there not a solution we could implement?<br><br></div><div>Chuck<br></div></div></div></div>