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.
