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 <[email protected]> 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 > >
