Sure, I'll do some benchmarks on that soon.
Jason moorepants.info +01 530-601-9791 On Tue, Nov 5, 2013 at 9:27 PM, Aaron S. Meurer <[email protected]> wrote: > Assumedly if it doesn't, then you would be able to tell just by applying > the sympy cse and seeing if it makes a significant difference in the run > time. > > Aaron Meurer > > On Nov 5, 2013, at 6:45 PM, Matthew Rocklin <[email protected]> wrote: > > Sadly I'm not an expert in C compilers and I no longer have an awesome > compilers-post-doc-office-mate. I don't know what they'll do in this > situation. His no-CSE statement would still hold if the input pointers > point to dynamically allocated memory. I don't recall what he said if they > point to statically allocated memory; I think it was a big nebulous "it > depends." > > > On Tue, Nov 5, 2013 at 5:35 PM, Jason Moore <[email protected]> wrote: > >> Got it. >> >> SymPy's code generators in codegen and autowrap don't support evaluating >> a SymPy matrix as the expression. I'd like to improve those so that you can >> pass in a sequences of Matrices and it returns a function that evaluates >> all of the matrices in a single C/Fortran/etc file. >> >> Here is a simple example of the c file I'm generating from two SymPy >> matrices: >> https://github.com/PythonDynamics/pydy-code-gen/blob/master/pydy_code_gen/tests/expected_cython/desired_mass_forcing_c.c >> >> >> Jason >> moorepants.info >> +01 530-601-9791 >> >> >> On Tue, Nov 5, 2013 at 5:41 PM, Matthew Rocklin <[email protected]>wrote: >> >>> My previous statement was that Theano won over autowrap.ufuncify because >>> theano did CSE internally (theano's basic data structure is a DAG). >>> >>> My understanding is that your C friend is correct IF the code is written >>> in the standard way, declaring each variable individually. I remember >>> looking at older code of your groups in which all of the variables were >>> stored in a dynamically allocated array. My C friend mentioned that most >>> compilers won't dare touch such a structure because it's verify that >>> transformations are safe. I have no idea what your various code generators >>> are doing under the hood. >>> >>> By the way I did not intend to raise the issue of CSE. I'm mostly >>> curious about the poor performance of Theano and I don't think this is that >>> issue. >>> >>> >>> On Tue, Nov 5, 2013 at 10:48 AM, Aaron Meurer <[email protected]>wrote: >>> >>>> I would still benchmark running cse and not. If cse() is fast enough, >>>> it might out-balance the overhead of the code generation, especially >>>> if it significantly reduces the resulting code size. >>>> >>>> Aaron Meurer >>>> >>>> On Tue, Nov 5, 2013 at 11:36 AM, Jason Moore <[email protected]> >>>> wrote: >>>> > My roommate who's a C guy suggested that CSE was a waste of time if >>>> you have >>>> > a good compiler. He claimed that the compiler will do CSE anyways, so >>>> doing >>>> > it in the C code was not useful. I need to compare my Cython code >>>> output >>>> > with and without CSE (it currently uses CSE). >>>> > >>>> > How would I use CSE with theano_function? I'm not doing that >>>> currently and >>>> > it wasn't apparent to me how to go about that. >>>> > >>>> > >>>> > Jason >>>> > moorepants.info >>>> > +01 530-601-9791 >>>> > >>>> > >>>> > On Tue, Nov 5, 2013 at 1:30 PM, Matthew Rocklin <[email protected]> >>>> wrote: >>>> >> >>>> >> In my experiments with sympy-theano earlier this year I found that >>>> it was >>>> >> competitive with our Fortran code generation (autowrap.ufuncify) on >>>> single >>>> >> array outputs and outperformed it when CSE were involved. I don't >>>> have >>>> >> anything recorded that profiles scalar operations. >>>> >> >>>> >> Frederic might have some intuition on Theano's performance on large >>>> scalar >>>> >> computations. I've brought this up in the past and don't actually >>>> remember >>>> >> the answer. >>>> >> >>>> >> >>>> >> On Tue, Nov 5, 2013 at 9:51 AM, Jason Moore <[email protected]> >>>> wrote: >>>> >>> >>>> >>> Ok, so I think I'm comparing things correctly then. It is >>>> surprising that >>>> >>> the compiled Theano code doesn't seem to execute that fast. The >>>> functions >>>> >>> I'm generating are essentially evaluating very long sympy >>>> expressions, maybe >>>> >>> Theano isn't great at that... >>>> >>> >>>> >>> >>>> >>> Jason >>>> >>> moorepants.info >>>> >>> +01 530-601-9791 >>>> >>> >>>> >>> >>>> >>> On Tue, Nov 5, 2013 at 12:48 PM, Matthew Rocklin < >>>> [email protected]> >>>> >>> wrote: >>>> >>>> >>>> >>>> `sympy.printing.theanocode.theano_function` calls `theano.function` >>>> >>>> >>>> >>>> The result of `theano_function` is a compiled theano function. >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> On Tue, Nov 5, 2013 at 9:27 AM, Jason Moore <[email protected]> >>>> >>>> wrote: >>>> >>>>> >>>> >>>>> >>>> >>>>> >>>> >>>>> >>>> >>>>> Jason >>>> >>>>> moorepants.info >>>> >>>>> +01 530-601-9791 >>>> >>>>> >>>> >>>>> >>>> >>>>> On Tue, Nov 5, 2013 at 8:46 AM, Frédéric Bastien <[email protected] >>>> > >>>> >>>>> wrote: >>>> >>>>>> >>>> >>>>>> Hi, >>>> >>>>>> >>>> >>>>>> Just to know, witch version of Theano did you used? I have speed >>>> up a >>>> >>>>>> little the optimization phase of the compilation and I have a PR >>>> that >>>> >>>>>> will optimize this more. >>>> >>>>> >>>> >>>>> >>>> >>>>> I'm using the master branch of Theano as of last week. >>>> >>>>> >>>> >>>>>> >>>> >>>>>> >>>> >>>>>> Also, Theano cache the compilation of the c code. Where this >>>> timming >>>> >>>>>> done with a empty theano cache or a filled Theano cache? If you >>>> ran >>>> >>>>>> the same benchmark multiple time on the same computer, only the >>>> first >>>> >>>>>> time Theano will compile the c code, the other time it will >>>> reuse what >>>> >>>>>> is in the cache. >>>> >>>>> >>>> >>>>> >>>> >>>>> I time two things wrt to Theano: >>>> >>>>> >>>> >>>>> 1. The time it takes to call >>>> sympy.printing.theanocode.theano_function >>>> >>>>> >>>> >>>>> and >>>> >>>>> >>>> >>>>> 2. The time it takes to call the function generated from 1. >>>> >>>>> >>>> >>>>> When does the Theano compilation happen? Is it in the call to >>>> >>>>> theano_function or the first time I use the generated function? >>>> >>>>> >>>> >>>>> If it is the latter then my timing comparisons aren't really >>>> comparing >>>> >>>>> apples to apples. >>>> >>>>> >>>> >>>>>> >>>> >>>>>> >>>> >>>>>> thanks >>>> >>>>>> >>>> >>>>>> Frédéric >>>> >>>>>> >>>> >>>>>> On Sun, Nov 3, 2013 at 3:22 PM, Ronan Lamy <[email protected] >>>> > >>>> >>>>>> wrote: >>>> >>>>>> > Le 03/11/13 14:19, Jason Moore a écrit : >>>> >>>>>> > >>>> >>>>>> >> Ronan, >>>> >>>>>> >> >>>> >>>>>> >> Thanks for looking at the derivation code. We haven't ever >>>> really >>>> >>>>>> >> had >>>> >>>>>> >> any review of it outside of our mechanical engineer group, so >>>> this >>>> >>>>>> >> very >>>> >>>>>> >> helpful. >>>> >>>>>> >> >>>> >>>>>> >> I'll review your PR and look into the second two items. >>>> >>>>>> >> >>>> >>>>>> >> Why do you think the dictionary representation will be so much >>>> >>>>>> >> faster? >>>> >>>>>> > >>>> >>>>>> > >>>> >>>>>> > Using a dict would make Vector.__eq__ a lot less expensive, >>>> and make >>>> >>>>>> > canonicalisation (as currently done in Vector.__init__) >>>> O(len(args)) >>>> >>>>>> > instead >>>> >>>>>> > of O(len(args)**2). >>>> >>>>>> > >>>> >>>>>> > However, it seems that the main performance issue is that >>>> >>>>>> > instantiating >>>> >>>>>> > Matrix objects is expensive. Using a dict isn't strictly >>>> required to >>>> >>>>>> > solve >>>> >>>>>> > this, but the structure I suggest would allow e.g. dot >>>> products of >>>> >>>>>> > vectors >>>> >>>>>> > to be decomposed as combinations of multiplications of >>>> components >>>> >>>>>> > and dot >>>> >>>>>> > products of base vectors, which can be optimised or cached >>>> >>>>>> > separately. There >>>> >>>>>> > would be no need for intermediate Matrix objects. >>>> >>>>>> > >>>> >>>>>> > >>>> >>>>>> >> >>>> >>>>>> >> On Sat, Nov 2, 2013 at 10:11 PM, Ronan Lamy < >>>> [email protected] >>>> >>>>>> >> <mailto:[email protected]>> wrote: >>>> >>>>>> >> >>>> >>>>>> >> Le 01/11/13 11:54, Jason Moore a écrit : >>>> >>>>>> >> >>>> >>>>>> >> I've been tinkering with code generation for ODE's >>>> that >>>> >>>>>> >> sympy.physics.mechanics spits out and have some >>>> results: >>>> >>>>>> >> >>>> >>>>>> >> http://www.moorepants.info/__blog/pydy-code-gen.html >>>> >>>>>> >> >>>> >>>>>> >> <http://www.moorepants.info/blog/pydy-code-gen.html> >>>> >>>>>> >> >>>> >>>>>> >> Several people have posted topics on this recently. >>>> We need >>>> >>>>>> >> to >>>> >>>>>> >> build in >>>> >>>>>> >> a code generator for solving ODE's into SymPy that >>>> would >>>> >>>>>> >> play >>>> >>>>>> >> well with >>>> >>>>>> >> the codegen and autowrap modules. I think I can use >>>> this >>>> >>>>>> >> code I >>>> >>>>>> >> wrote as >>>> >>>>>> >> a base to start working on that but would need some >>>> help >>>> >>>>>> >> generalizing it >>>> >>>>>> >> beyond our systems. Feedback is welcome. >>>> >>>>>> >> >>>> >>>>>> >> >>>> >>>>>> >> I've only looked at the derivation part, it's an >>>> interesting >>>> >>>>>> >> real-world(ish) benchmark for expression manipulation. >>>> However, >>>> >>>>>> >> it >>>> >>>>>> >> incurs a lot of avoidable overhead: >>>> >>>>>> >> * Extracting some loop constants out of their loops cuts >>>> down >>>> >>>>>> >> the >>>> >>>>>> >> run-time by 40%, cf. >>>> https://github.com/sympy/__sympy/pull/2570 >>>> >>>>>> >> >>>> >>>>>> >> <https://github.com/sympy/sympy/pull/2570> >>>> >>>>>> >> * The creation of temporary objects by the Vector class >>>> takes >>>> >>>>>> >> up >>>> >>>>>> >> most of the run-time. >>>> >>>>>> >> * The internal representation of Vector objects seems >>>> >>>>>> >> inefficient. I >>>> >>>>>> >> think it should be switched to a dict-based >>>> representation as a >>>> >>>>>> >> linear combination of base vectors (e.g. using {I.x: l0, >>>> B.y: >>>> >>>>>> >> -l1} >>>> >>>>>> >> for l0 * I.x - l1 * B.y). >>>> >>>>>> >> >>>> >>>>>> >> >>>> >>>>>> >> -- >>>> >>>>>> >> 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 sympy+unsubscribe@__googlegroups.com >>>> >>>>>> >> <mailto:sympy%[email protected]>. >>>> >>>>>> >> >>>> >>>>>> >> To post to this group, send email to >>>> [email protected] >>>> >>>>>> >> <mailto:[email protected]>. >>>> >>>>>> >> Visit this group at >>>> http://groups.google.com/__group/sympy >>>> >>>>>> >> <http://groups.google.com/group/sympy>. >>>> >>>>>> >> For more options, visit >>>> >>>>>> >> https://groups.google.com/__groups/opt_out >>>> >>>>>> >> <https://groups.google.com/groups/opt_out>. >>>> >>>>>> >> >>>> >>>>>> >> >>>> >>>>>> >> >>>> >>>>>> >> -- >>>> >>>>>> >> 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. >>>> >>>>>> >> For more options, visit >>>> https://groups.google.com/groups/opt_out. >>>> >>>>>> > >>>> >>>>>> > >>>> >>>>>> > -- >>>> >>>>>> > 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. >>>> >>>>>> > For more options, visit >>>> https://groups.google.com/groups/opt_out. >>>> >>>>>> >>>> >>>>>> -- >>>> >>>>>> 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. >>>> >>>>>> For more options, visit https://groups.google.com/groups/opt_out >>>> . >>>> >>>>> >>>> >>>>> >>>> >>>>> -- >>>> >>>>> 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. >>>> >>>>> For more options, visit https://groups.google.com/groups/opt_out. >>>> >>>> >>>> >>>> >>>> >>>> -- >>>> >>>> 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. >>>> >>>> For more options, visit https://groups.google.com/groups/opt_out. >>>> >>> >>>> >>> >>>> >>> -- >>>> >>> 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. >>>> >>> For more options, visit https://groups.google.com/groups/opt_out. >>>> >> >>>> >> >>>> >> -- >>>> >> 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. >>>> >> For more options, visit https://groups.google.com/groups/opt_out. >>>> > >>>> > >>>> > -- >>>> > 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. >>>> > For more options, visit https://groups.google.com/groups/opt_out. >>>> >>>> -- >>>> 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. >>>> For more options, visit https://groups.google.com/groups/opt_out. >>>> >>> >>> -- >>> 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. >>> For more options, visit https://groups.google.com/groups/opt_out. >>> >> >> -- >> 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. >> For more options, visit https://groups.google.com/groups/opt_out. >> > > -- > 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. > For more options, visit https://groups.google.com/groups/opt_out. > > -- > 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. > For more options, visit https://groups.google.com/groups/opt_out. > -- 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. For more options, visit https://groups.google.com/groups/opt_out.
