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 <kump...@gmail.com> wrote:
> Hi Sergei,
>
> On Thu, Mar 11, 2010 at 8:30 PM, Sergei Dyshel <qyron.priv...@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@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to