Re: [eigen] Re: Raising double to integer powers |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
- To: eigen <eigen@xxxxxxxxxxxxxxxxxxx>
- Subject: Re: [eigen] Re: Raising double to integer powers
- From: Rasmus Munk Larsen <rmlarsen@xxxxxxxxxx>
- Date: Mon, 10 May 2021 16:52:15 -0700
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=GAcF1rtAVt+xXZ10HCrzS/V18cHrjU4lc5GoKKBRl/8=; b=oYxIiugzz3kdZFt+cKF9A2i9cU1EWeTbzS3ko+qwbgWQAZJYnIOUQ7Qhsi5gO6lYoP 4OFxByrFzMKNcILfu1usLK/OgtnMs2T09+f8T604U8kE42lkBN/LJMISV35FEfx9YRNM 78P4ZNULwzTbm6M/NwUCR3I39Tx9+G3lNi9A4y/ZCbVB8BAGWdLXNZUyGikh5fiZ6S0p slozgW5PYDOUjyYVgGsXZPdnHhgOjUeV8KQLhTxdlYR3RfqzUlhQdkMiJ2If4O/SU5ap KQwdv0dK2HgO0uIUCoXRnGBJiyn7254D5ciXigouHm/5Sm49Tf1aBOOkF3FGdPAlCdFa uLaQ==
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
>
>