[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