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