|Re: [eigen] optimization question|
[ Thread Index |
| More lists.tuxfamily.org/eigen Archives
- To: eigen@xxxxxxxxxxxxxxxxxxx
- Subject: Re: [eigen] optimization question
- From: Gael Guennebaud <gael.guennebaud@xxxxxxxxx>
- Date: Tue, 4 Oct 2011 11:36:04 +0200
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :content-type:content-transfer-encoding; bh=VVRRlyTrbo2L9TjV03WdOtvK3r4i0eSXLayAaJmoycc=; b=wJAXM24vycsikMMWChBeIcYSJMZXPgTnlKnVDs1GHdGgeE0Pqs3Xg6k/krDtKkKGtO CAHVSar29sYLSLk4g+jznq4rFXqLt3JWLWvmAb4IWQezd7s2KdBKxCRc83STEY7FrJLO nueBiLXLQrQJ2Hz/gX5ARN36sJblX6cyBAwf8=
as Benoit said, this example is memory bounds, 3 memory accesses for 1
arithmetic operation. Explicit prefetching won't help. You will
probably earn a few % once we got loop peeling, that requires "meta
Packets" containing multiple real packet. So not soon ;) Indeed,
naively unrolling the evaluation loop won't help here because the
compiler will still use a single register.
On Tue, Oct 4, 2011 at 3:59 AM, Benoit Jacob <jacob.benoit.1@xxxxxxxxx> wrote:
> 2011/10/3 Michel <michel.pacilli@xxxxxxx>:
>> not sure if it's the good place to ask user question... tell me if so.
>> Well I try to get the best of eigen simple example, and I'm not sure that I
>> get the most :
>> #define N 32768
>> Matrix<float,N,1> u;
> Are you really sure that you want this? For such a large size, it is
> almost always a better idea to use a MatrixXf u(N).
>> Matrix<float,N,1> v;
>> Matrix<float,N,1> w;
>> for(int k=0; k <NLOOP; ++k)
>> u = v.array() * w.array();
>> compile with gcc and sse2 flag
>> Well, compare to a simple for loop and aligned array, I've got around 17%
>> speed up with eigen ;)
>> but, is it possible to give at compile time some hints to go further, with
>> unrolling, sse3,4? or other things?
> I don't think that newer sse versions bring anything useful here.
> Actually, fwiw, sse1 would already be enough for this particular use
>> the asm of product is:
>> # 86 "..\eigen\main.cpp" 1
>> #it begins here!
>> # 0 "" 2
>> xorl %eax, %eax
>> .p2align 4,,10
>> movaps (%esi,%eax,4), %xmm0
>> mulps (%ebx,%eax,4), %xmm0
>> movaps %xmm0, (%edx,%eax,4)
>> addl $4, %eax
>> cmpl $32768, %eax
>> jne L3
>> # 88 "..\eigen\main.cpp" 1
>> #it ends here!
>> I wonder if it could be more efficient with more than just one xmm reg, or
>> prefetch ?
> I can only see 1 xmm register here, and given the very simple and
> predictable access pattern, there shouldn't be any reason to use
> explicit prefetch instructions.
> The only further optimization that I would consider here, would be
> partial unrolling of this loop, try doing 2 or 4 iterations at a time.