Re: [eigen] nesting
• To: eigen@xxxxxxxxxxxxxxxxxxx
• Subject: Re: [eigen] nesting
• From: Hauke Heibel <hauke.heibel@xxxxxxxxxxxxxx>
• Date: Thu, 4 Feb 2010 23:26:58 +0100

```On Thu, Feb 4, 2010 at 11:23 PM, Gael Guennebaud
<gael.guennebaud@xxxxxxxxx> wrote:
> On Thu, Feb 4, 2010 at 11:17 PM, Gael Guennebaud
> <gael.guennebaud@xxxxxxxxx> wrote:
>> On Thu, Feb 4, 2010 at 11:11 PM, Benoit Jacob <jacob.benoit.1@xxxxxxxxx> wrote:
>>> Just one thing that I don't follow:
>>>
>>> 2010/2/4 Gael Guennebaud <gael.guennebaud@xxxxxxxxx>:
>>>> Our real problem is the following:
>>>>
>>>> A*B + A1 + A2 + A3 + A4 + A5
>>>>
>>>> creates 5 temporary matrices, the result of A*B is copied 4 times....
>>>
>>> Why is it so? After A*B has evaluated into a temporary matrix, isn't
>>> it the same as
>>>
>>> tmp + A1 + A2 + A3 + A4 + A5
>>>
>>> ? That doesn't evaluate at every step ...!
>>
>> this is the problem that Hauke is talking about: since we nest by
>> value, tmp is stored in the expression of tmp + A1, so sizeof(tmp+A1)
>> = big, so does (tmp+A1)+A2, etc. I did not check but I think that the
>> way it works.
>>
>> on the other hand if you write:
>>
>> (A*B).eval() + A1 + A2 + A3 + A4 + A5
>>
>> then it is fine fine because the temporary is explicitly created on
>> the stack and stored by reference by the binary expressions...
>
> I checked:
>
> r = x*x +y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y;
>
> => 0.22sec
>
> r = (x*x).eval()
> +y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y;
>
> => 0.063sec
>
> gael.

By the way, when I was debugging this, I used the ctor stuff from the
unit tests...

static int nb_temporaries;

#define EIGEN_DEBUG_MATRIX_CTOR { \
if(SizeAtCompileTime==Dynamic) \
nb_temporaries++; \
}

I have to go now...

- Hauke

```

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