Sorry, it wasn't merged. He found that the --fast-math flag in the complier takes care of this.
Jason moorepants.info +01 530-601-9791 On Fri, Aug 29, 2014 at 10:37 AM, Jason Moore <[email protected]> wrote: > Here is some work on the pow issue: > https://github.com/sympy/sympy/pull/7519 > > Looks like it was merged so the ccode printer should print x*x*x... for > less that 10 x's. > > > Jason > moorepants.info > +01 530-601-9791 > > > On Fri, Aug 29, 2014 at 7:33 AM, Jason Moore <[email protected]> wrote: > >> >> >> >> Jason >> moorepants.info >> +01 530-601-9791 >> >> >> On Fri, Aug 29, 2014 at 2:38 AM, James Crist <[email protected]> wrote: >> >>> I was planning on going to bed, but ended up working on this instead. I >>> have no self control... >>> >>> Anyway, I've uncovered some things: >>> >>> 1. Addition of the restrict keyword to tell the compiler we're not >>> aliasing offers marginal gains. Gain a couple microseconds here and there. >>> This requires a c99 compiler, but it's 2014, everyone should have one by >>> now. >>> >>> 2. Inlining the function call resulted in smaller gains than 1, but >>> still *slightly* measurable. I suspect that for larger expression sizes >>> this will be negligible to none. >>> >>> 3. Here's the big one: For small powers, pow(c, n) is considerably >>> slower than c*c*c*c... Changing the ccode Pow handler to print all pows >>> less than 5 (arbitrary number) out as multiplication I was able to >>> match/beat (slightly) all of jason's benchmarks with the C + numpy ufuncs. >>> >> >> Oh yes! I knew that. In fact, I feel like I read in the current code >> somewhere. I forget, but that seems like a standard way we should be >> handling pows in C. Nice find! >> >> >>> >>> >>> On Thursday, August 28, 2014 1:38:30 PM UTC-5, Tim Lahey wrote: >>> >>>> 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-EHZXbd5aFFNRy7gJ0hcydpAsG2qxv7 >>>> Py65DQ9cA9VUUA%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_S4XPxWOX2jr2zmda9VCRpWpzHMTGLk >>>> mHPQ%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/6cfe63df-df00-4c36-a88a-6c477becc924%40googlegroups.com >>> <https://groups.google.com/d/msgid/sympy/6cfe63df-df00-4c36-a88a-6c477becc924%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >>> 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/CAP7f1AhNvQAwJ3V8y7uvSb2nDTpKDd8u8eiKVmjkOT-JZX4S2w%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
