[Mono-dev] Mono generates inefficient vectorized code

Sergei Dyshel qyron.private at gmail.com
Thu Mar 11 19:15:36 EST 2010

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?
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.

More information about the Mono-devel-list mailing list