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.
