← Back to team overview

dolfin team mailing list archive

Re: [noreply@xxxxxxxxxxxxx: [Branch ~dolfin-core/dolfin/wells] Rev 5923: Replace Legendre code with Boost Legendre code.]

 

On Thu, Jun 02, 2011 at 01:10:01PM +0200, Benjamin Kehlet wrote:
> On 2 June 2011 11:51, Anders Logg <logg@xxxxxxxxx> wrote:
> > On Thu, Jun 02, 2011 at 10:46:29AM +0100, Garth N. Wells wrote:
> >>
> >>
> >> On 02/06/11 10:26, Anders Logg wrote:
> >> > On Thu, Jun 02, 2011 at 10:07:59AM +0100, Garth N. Wells wrote:
> >> >>
> >> >>
> >> >> On 01/06/11 23:46, Anders Logg wrote:
> >> >>> Have you checked that there is no performance penalty?
> >> >>
> >> >> I just have - evaluating a Legendgre polynomial 10k times at the same
> >> >> point is just noise with both methods (of the order 10^-5 - 10^-4 s).
> >> >
> >> > It may be noise for some applications, but not for others. I'm not
> >> > sure this is a bottle-neck for the ODE code (Benjamin will know) but
> >> > we need to evaluate Legendre polynomials of degree > 100 many times
> >> > and then it may not be noise.
> >> >
> >>
> >> For very high degree (e.g. 200) Boost is marginally faster.
> >
> > Sounds promising then.
> >
> >> >> The Boost code is slightly slower because it doesn't cache the values
> >> >> (which is nice not to do), but may be faster if the call is inlined.
> >> >> It's not possible to inline it at the moment because of clashes between
> >> >> tr1:tuple and boost::tuple (Boost bug, I suspect). Old and new are the
> >> >> same when evaluating at different points.
> >> >
> >> > Let's wait for Benjamin to comment.
> >> >
> >>
> >> The speed is about the same (with scope to improve the speed for Boost)
> >> for unique values. The caller should be responsible for caching, if
> >> desired, since it can lead to memory blow out.
> >>
> >> Legendre does not appear in the ode code. It only appears in the
> >> computation of quadrature schemes.
> >
> > True, but the quadrature schemes are used in the ode code.
> >
> >
> >
> >> Garth
> >>
> >>
> >>
> >> >> Garth
> >> >>
> >> >>
> >> >>> Benjamin has
> >> >>> worked quite hard on optimizing some of the basic math routines (in
> >> >>> some cases by many many orders of magnitude).
> >> >>>
> >> >>> Benjamin, can you take a look that it still works?
>
> Yes, the performance seems to be about the same, but I'm unable to
> compile it with support for GMP.
>
> /usr/include/boost/math/special_functions/legendre.hpp:178:
> instantiated from ‘typename boost::math::tools::promote_args<RT,
> float, float, float, float, float>::type boost::math::legendre_p(int,
> int, T, const Policy&) [with T = __gmp_expr<__mpf_struct [1],
> __mpf_struct [1]>, Policy =
> boost::math::policies::policy<boost::math::policies::default_policy,
> boost::math::policies::default_policy,
> boost::math::policies::default_policy,
> boost::math::policies::default_policy,
> boost::math::policies::default_policy,
> boost::math::policies::default_policy,
> boost::math::policies::default_policy,
> boost::math::policies::default_policy,
> boost::math::policies::default_policy,
> boost::math::policies::default_policy,
> boost::math::policies::default_policy,
> boost::math::policies::default_policy,
> boost::math::policies::default_policy>]’
> /usr/include/boost/math/special_functions/legendre.hpp:185:
> instantiated from ‘typename boost::math::tools::promote_args<RT,
> float, float, float, float, float>::type boost::math::legendre_p(int,
> int, T) [with T = __gmp_expr<__mpf_struct [1], __mpf_struct [1]>]’
> /home/benjamik/fenics/dolfin-wells_gmp/dolfin/math/Legendre.cpp:42:
> instantiated from here
> /usr/include/boost/math/special_functions/legendre.hpp:167: error: no
> matching function for call to ‘pow(__gmp_expr<__mpf_struct [1],
> __gmp_binary_expr<long int, __gmp_expr<__mpf_struct [1],
> __gmp_binary_expr<__gmp_expr<__mpf_struct [1], __mpf_struct [1]>,
> __gmp_expr<__mpf_struct [1], __mpf_struct [1]>,
> __gmp_binary_multiplies> >, __gmp_binary_minus> >,
> __gmp_expr<__mpf_struct [1], __gmp_binary_expr<__gmp_expr<__mpf_struct
> [1], __mpf_struct [1]>, long int, __gmp_binary_divides> >)’
> /usr/include/bits/mathcalls.h:154: note: candidates are: double
> pow(double, double)
> /usr/include/c++/4.4/cmath:358: note:                 float
> std::pow(float, float)
> /usr/include/c++/4.4/cmath:362: note:                 long double
> std::pow(long double, long double)
> /usr/include/c++/4.4/cmath:369: note:                 double
> std::pow(double, int)
> /usr/include/c++/4.4/cmath:373: note:                 float std::pow(float, int)
> /usr/include/c++/4.4/cmath:377: note:                 long double
> std::pow(long double, int)
> [...]
>
> boost::math::legendre seems to rely on std::pow which is not
> templated, only implemented with the most common types.

If it's not possible to make it work, we need to revert back.

--
Anders



> Benjamin
>
> >> >>>
> >> >>
> >> >> _______________________________________________
> >> >> Mailing list: https://launchpad.net/~dolfin
> >> >> Post to     : dolfin@xxxxxxxxxxxxxxxxxxx
> >> >> Unsubscribe : https://launchpad.net/~dolfin
> >> >> More help   : https://help.launchpad.net/ListHelp
> >
> > _______________________________________________
> > Mailing list: https://launchpad.net/~dolfin
> > Post to     : dolfin@xxxxxxxxxxxxxxxxxxx
> > Unsubscribe : https://launchpad.net/~dolfin
> > More help   : https://help.launchpad.net/ListHelp
> >


Follow ups

References