[Mono-dev] Mono generates inefficient vectorized code
Zoltan Varga
vargaz at gmail.com
Thu Mar 11 20:07:50 EST 2010
Hi,
After some fixes to the llvm code in mono SVN, it now generates the
following:
d: 0f 10 0f movups (%rdi),%xmm1
10: 66 0f fe c1 paddd %xmm1,%xmm0
14: 48 83 c7 10 add $0x10,%rdi
18: 89 f1 mov %esi,%ecx
1a: c1 f9 1f sar $0x1f,%ecx
1d: 83 e1 03 and $0x3,%ecx
20: 01 f1 add %esi,%ecx
22: c1 f9 02 sar $0x2,%ecx
25: ff c0 inc %eax
27: 39 c8 cmp %ecx,%eax
29: 0f 8c de ff ff ff jl d <Test_sum+0xd>
which is pretty good.
Zoltan
On Fri, Mar 12, 2010 at 1:15 AM, Sergei Dyshel <qyron.private at gmail.com>wrote:
> Hello Rodrigo,
> Thanks for the quick answer! But do you mean by it that the only
> problem is in lack of global register allocator? What if 'temp' was
> not vector but some bare 'int' temporary, would it be loaded and
> stored in each iteration?
>
> Another question. I know that there is also LLVM engine in Mono and
> LLVM generally supports vector instructions in his IR. Is it hard to
> add SIMD support to mono-llvm.c?
> --
> Regards,
> Sergei Dyshel
>
>
>
> On Fri, Mar 12, 2010 at 01:56, Rodrigo Kumpera <kumpera at gmail.com> wrote:
> > Hi Sergei,
> >
> > On Thu, Mar 11, 2010 at 8:30 PM, Sergei Dyshel <qyron.private at gmail.com>
> > wrote:
> >>
> >> Hello,
> >> I'm doing some research on vectorization using Mono. I've noticed that
> >> code generated by Mono's JIT contains many unnecessary memory loads
> >> and stores. Here is simple example, the full code is attached:
> >>
> >> public static unsafe int sum(int* a, int size) {
> >> Vector4i temp = new Vector4i();
> >> Vector4i* p = (Vector4i*) a;
> >> for (int i = 0; i < size/4; i++) {
> >> temp += *p;
> >> p += 1;
> >> }
> >> return temp.X + temp.Y + temp.Z + temp.W;
> >> }
> >>
> >
> >
> > The problem you're seen of going to memory when not needed is due to the
> > fact that
> > mono lacks a working global register allocator. If you use a value in a
> > single basic block,
> > you'll notice that it's kept in memory the whole time.
> >
> > We don't eliminate a lot of redundancies, even under SSA, because our JIT
> > doesn't know how
> > to handle SIMD ops under that form. It's an open problem requiring some
> > work. The same
> > applies to our global register allocator.
> >
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-devel-list/attachments/20100312/31dada06/attachment.html
More information about the Mono-devel-list
mailing list