On why Fortran is faster, Fortran semantics ensure that function arguments never alias, this allows the optimizer to make assumptions about the function and the arguments. This the main advantage of Fortran over C. But, because of this, it can lead to more memory usage. I know that the newer C++ standards have a keyword to mark arguments to indicate that they won't be aliased, but that requires that the code generator and the compiler support them.
Cheers, Tim. On 2014-08-28, at 2:17 PM, Jason Moore <[email protected]> wrote: > Jim and others, > > Here are the benchmarks I made yesterday: > > http://www.moorepants.info/blog/fast-matrix-eval.html > > The working code is here: > https://gist.github.com/moorepants/6ef8ab450252789a1411 > > Any feedback is welcome. > > > Jason > moorepants.info > +01 530-601-9791 > > > On Wed, Aug 27, 2014 at 11:44 PM, James Crist <[email protected]> wrote: > I was wondering about that. I wasn't sure if the overhead from looping > through the inputs multiple times would outweigh improvements from fast C > loops. Glad that in your case it does. > > I've thrown a WIP PR up: https://github.com/sympy/sympy/pull/7929 > > For some reason, creating the functions in python with numpy calls still > seems to be faster (for micro-benchmarks). This probably has something to do > with function complexity (the example function above is simple), but I'd > still think it'd be faster in pure C. I tried inlining the call, which was a > small improvement, but it was still slower than the pure numpy-python > version. Something to look into. > > > On Wed, Aug 27, 2014 at 10:28 PM, Jason Moore <[email protected]> wrote: > Yeh, but if you simply create a ufunc for each expression in a matrix you > still get substantial speedups. I wrote a bunch of test cases that I'll post > to my blog tomorrow. > > > Jason > moorepants.info > +01 530-601-9791 > > > On Wed, Aug 27, 2014 at 11:26 PM, James Crist <[email protected]> wrote: > Not yet. I wrote it this morning during an extremely boring meeting, and > haven't had a chance to clean it up. This doesn't solve your problem about > broadcasting a matrix calculation though... > > > On Wed, Aug 27, 2014 at 10:23 PM, Jason Moore <[email protected]> wrote: > Awesome. I was working on this today but it looks like you've by passed what > I had working. Do you have a PR with this? > > > Jason > moorepants.info > +01 530-601-9791 > > > On Wed, Aug 27, 2014 at 11:11 PM, Matthew Rocklin <[email protected]> wrote: > Cool > > > On Wed, Aug 27, 2014 at 8:07 PM, James Crist <[email protected]> wrote: > I still need to do some cleanups and add tests, but I finally have this > working and thought I'd share. I'm really happy with this: > > In [1]: from sympy import * > > In [2]: a, b, c = symbols('a, b, c') > > In [3]: expr = (sin(a) + sqrt(b)*c**2)/2 > > In [4]: from sympy.utilities.autowrap import ufuncify > > In [5]: func = ufuncify((a, b, c), expr) > > In [6]: func(1, 2, 3) > Out[6]: 6.7846965230828769 > > In [7]: func([1, 2, 3, 4, 5], [6, 7, 8, 9, 10], 3) > Out[7]: array([ 11.44343933, 12.36052961, 12.79848207, 13.12159875, > 13.75078733]) > > In [8]: from numpy import arange > > In [9]: a = arange(10).reshape((2, 5)) > > In [10]: c = arange(10, 20).reshape((2, 5)) > > In [11]: b = 25 > > In [12]: func(a, b, c) > Out[12]: > array([[ 250. , 302.92073549, 360.45464871, 422.57056 , > 489.62159875], > [ 562.02053786, 639.86029225, 722.8284933 , 810.49467912, > 902.70605924]]) > > In [13]: type(func) > Out[13]: numpy.ufunc > > This now does everything a numpy `ufunc` does normally, as it *is* a ufunc. > Codegen is hooked up to numpy api. Type conversion and broadcasting are done > automagically. > > Caveats: only functions with a single output are accepted (this could be > changed to accept multi-output without much effort though). Also, as with all > unfuncs, input/outputs must all be scalars (no matrix/Indexed operations > allowed). > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/sympy. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/76e0fbbe-5ce4-43b7-855b-6ac821f6b8ae%40googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/sympy. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/CAJ8oX-EHZXbd5aFFNRy7gJ0hcydpAsG2qxv7Py65DQ9cA9VUUA%40mail.gmail.com. > > For more options, visit https://groups.google.com/d/optout. > > > -- > You received this message because you are subscribed to a topic in the Google > Groups "sympy" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/sympy/azVZHLOv9Vc/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > [email protected]. > > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/sympy. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/CAP7f1AieaeoOFtc_S4XPxWOX2jr2zmda9VCRpWpzHMTGLkmHPQ%40mail.gmail.com. > > For more options, visit https://groups.google.com/d/optout. > > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/sympy. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/CAJ2L7mfL_xO%3DO-ZRMx-zfpZzJKJ-%2BUdTzSCz5jYf%2B%3DdovR%2B_7Q%40mail.gmail.com. > > For more options, visit https://groups.google.com/d/optout. > > > -- > You received this message because you are subscribed to a topic in the Google > Groups "sympy" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/sympy/azVZHLOv9Vc/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/sympy. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/CAP7f1AjcHrsopXjwK5uYdALeSrokxLMwA7xebTikHyhwL-%2BOVg%40mail.gmail.com. > > For more options, visit https://groups.google.com/d/optout. > > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/sympy. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/CAJ2L7me73iJmkWm%3D_LiyWrsuOCZm%2B4OZbqD%2BkwwScWWx23HVdg%40mail.gmail.com. > > For more options, visit https://groups.google.com/d/optout. > > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/sympy. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/CAP7f1Agdi_X-o0B%2B9mH2CGOSN-TyYGVwgZm4q8%3DYwxieBzZkzA%40mail.gmail.com. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/sympy. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/307E8764-48DF-4F32-B319-8174BF5B71BC%40gmail.com. For more options, visit https://groups.google.com/d/optout.
