<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Slide, not really. &nbsp;If mono SIMD had a more general mapping to the GPU, or could operate on very large vectors or matrices, possibly. &nbsp; Linear algebra is an easy mapping to that stuff. &nbsp; However, I do more complicated stuff around timeseries, so does not really fit into linear alg stuff.</div><div><br></div><div>I guess, what I'm really after is to understand why the unsafe implementation is hardly faster than the "safe" version. &nbsp; Whereas on the .NET CLR is 2x as fast, and nearly as fast as the C++ implementation. &nbsp; &nbsp;There is no GC or object creation involved here, just arrays and computations.</div><br><div><div>On Nov 19, 2011, at 8:19 PM, Slide wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><p>Is it something that would benefit from Mono.Simd?</p>
<div class="gmail_quote">On Nov 19, 2011 6:13 PM, "Jonathan Shore" &lt;<a href="mailto:jonathan.shore@gmail.com">jonathan.shore@gmail.com</a>&gt; wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word"><div>I write scientific numerical algorithms that are very data / array intensive. &nbsp;Having recently moved from using the JVM to the Mono CLR, was curious about the pure numerical performance against arrays. &nbsp; Towards this end, wrote a partial matrix class and driver around it to test performance across C++, JVM (Java), and CLRs (C#) with both safe and unsafe implementations.</div>
<div><br></div><div>The code is essentially the same across these languages, with the exception that I included an unsafe variant (using pointers), to see what sort of additional performance could be obtained in the CLR.</div>
<div><br></div><div>On a linux box had the following runtimes (where Java is 1.7 and mono 2.10.6 with LLVM and without (same #s)):</div><div><br></div><div>CPP (Core i7-950): &nbsp; <span style="white-space:pre-wrap">                        </span>01:28:818</div>
<div>Java (Core i7-950): &nbsp; <span style="white-space:pre-wrap">                        </span>01:31.840&nbsp;</div><div>Mono .NET (Core i7-950): &nbsp;<span style="white-space:pre-wrap">        </span>04:01.466 (<b>unsafe, LLVM</b>)</div><div>Mono .NET&nbsp;(Core i7-950): &nbsp;<span style="white-space:pre-wrap">        </span>04:29.680 (<b>safe, LLVM</b>)</div>
<div><br></div><div>Notice two things:</div><div><br></div><div><ol><li>the mono runtimes are ~3x slower than the JVM or C++</li><li>the unsafe implementation offered very little performance improvement (why?)</li></ol></div>
<div><br></div><div>So I decided to take a look at the MS .NET CLR on a VM and compare that with a C++ baseline (since the VM is slower):</div><div><br></div><div>CPP (VM): <span style="white-space:pre-wrap">                                        </span>&nbsp;01:56:296</div>
<div>.NET (VM): <span style="white-space:pre-wrap">                                        </span>02:17.359 (<b>unsafe, MS CLR</b>)</div><div>.NET (VM): <span style="white-space:pre-wrap">                                        </span>04.03.786 (<b>safe, MS CLR</b>)</div><div><br></div><div>
Interestingly, the MS CLR is almost as fast as C++ with -O3 optimisations for the unsafe implementation. &nbsp; &nbsp;The "safe" implementation is 2x as slow, in line with the idea that the unsafe implementation offers a significant performance advantage.</div>
<div><br></div><div>The "safe" implementations more or less align in that they are multiples slower than the C++ implementation (3x in the case of mono and 2x in the case of the MS CLR). &nbsp;The mono implementation of the "unsafe" code shows very little performance benefit.</div>
<div><br></div><div>So I am wondering the following:</div><div><br></div><div><ol><li>are there runtime or compile parameters that would increase the performance of the unsafe code?</li><li>is the cost of pinning the arrays expensive?</li>
<li>is it just a lack of JIT optimisation on the unsafe code?</li></ol><div><br></div></div><div>I'm enclosing a source project with a csharp, java, and cpp sub-directory. &nbsp; I hand compiled these, however, there is a sln that will compile the cpp and csharp parts.</div>
<div><br></div><div>Ideas?</div><div><br></div><div>Jonathan</div><div><br></div><div></div></div><br><div style="word-wrap:break-word"><div></div><div><br></div><div><br></div><div><br></div><div><br></div>
</div><br>_______________________________________________<br>
Mono-devel-list mailing list<br>
<a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>
<a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
<br></blockquote></div>
</blockquote></div><br></body></html>