Re: [eigen] Re: Raising double to integer powers

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


I recently vectorized the implementation of pow in Eigen for float and
double arguments. It does not apply to pow(float, int), however, but
should give you a significant speedup if you cast your exponents to
double. I thought about implementing a more efficient algorithm if the
exponents are all integers, but didn't get round to it. Could you
please try if this helps you? The improvements are in the master
branch (as well as the 3.4 branch that we are preparing for release).

On Mon, May 10, 2021 at 4:28 PM Marc Glisse <marc.glisse@xxxxxxxx> wrote:
>
> On Mon, 10 May 2021, Ian Bell wrote:
>
> > Of course, shortly after having sent this message I figured it out, but it
> > doesn't actually result in an increase in my throughput sadly. For
> > posterity:
> >
> > #include <Eigen/Dense>
> > #include <iostream>
> >
> > using namespace Eigen;
> >
> > struct myUnaryFunctor {
> >  const double m_base;
> >  myUnaryFunctor(double base): m_base(base) {};
> >  typedef double result_type;
> >  result_type operator()(const int &e) const
> >  {
> >      return pow(m_base, e);
> >  }
> > };
> >
> > int main()
> > {
> >    auto e = Eigen::ArrayXi::LinSpaced(11, 0, 10).eval();
> >    double base = 2.9;
> >    std::cout << e.unaryExpr(myUnaryFunctor(base));
> > }
>
> Assuming pow is actually your own function and does the usual repeated
> squaring, unlike std::pow, this may do a lot of redundant computation (in
> particular base*base is computed many times). Do you know anything about
> the integers? In particular, are they always small? I assume the LinSpaced
> example doesn't look like the true data. Does your pow function already
> cache some results?
>
> --
> Marc Glisse
>
>



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/