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.

Reply via email to