<div class="gmail_quote">On Wed, Oct 26, 2011 at 6:15 PM, Rodrigo Kumpera <span dir="ltr">&lt;<a href="mailto:kumpera@gmail.com">kumpera@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
The CLR demands that all floating point calculations to be conducted with double precision.</blockquote><div><br></div><div>Where in the spec does it state this?  Everything I&#39;ve read allows for both 32-bit and 64-bit representations, with the only restriction being that arithmetic must be performed with enough precision for the expression type.</div>
<div><br></div><div>And if 64-bit arithmetic is required, why is 32-bit used in the 32-bit Mono VM, and in the .NET VM?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div><br></div><div><br><br><div class="gmail_quote"><div><div></div><div class="h5">On Wed, Oct 26, 2011 at 4:00 PM, Justin Holewinski <span dir="ltr">&lt;<a href="mailto:justin.holewinski@gmail.com" target="_blank">justin.holewinski@gmail.com</a>&gt;</span> wrote:<br>

</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div></div><div class="h5">I&#39;m currently testing Mono on some single-precision FP-heavy workloads, and I&#39;m a bit surprised to see that the performance of the 64-bit VM is significantly slower than the 32-bit VM, over 2x in many cases.  As an example, on Mac OS X 10.7, with Mono 2.10.6 compiled in both 32-bit and 64-bit modes:<br clear="all">


<div><br></div><div>Matrix Multiply Micro-Benchmark:</div><div><br></div><div><div><div><font face="&#39;courier new&#39;, monospace">jholewinski@aquila [tests]$ ~/projects/mono/install/x86/bin/mono -O=all embed1-extract.exe </font></div>


<div><font face="&#39;courier new&#39;, monospace">Scalar:    362.775 ms</font></div><div><font face="&#39;courier new&#39;, monospace">Mono.Simd: 164.645 ms</font></div><div>
<font face="&#39;courier new&#39;, monospace">jholewinski@aquila [tests]$ ~/projects/mono/install/x64/bin/mono -O=all embed1-extract.exe </font></div><div><font face="&#39;courier new&#39;, monospace">Scalar:    841.482 ms</font></div>


<div><font face="&#39;courier new&#39;, monospace">Mono.Simd: 131.844 ms</font></div></div></div><div><br></div><div>The Mono.Simd case is good, but for the scalar code that is a large discrepancy.  Further, if I look at the disasembly from Mono, it looks like the 64-bit VM is using double-precision arithmetic for single-precision data types with the non-Mono.Simd version:</div>


<div><br></div><div><div><font face="&#39;courier new&#39;, monospace">000000000000001b        movss   0x00(%r13),%xmm0</font></div><div><font face="&#39;courier new&#39;, monospace">0000000000000021        cvtss2sd        %xmm0,%xmm0</font></div>


<div><font face="&#39;courier new&#39;, monospace">0000000000000025        movss   (%r14),%xmm1</font></div><div><font face="&#39;courier new&#39;, monospace">000000000000002a        cvtss2sd        %xmm1,%xmm1</font></div>


<div><font face="&#39;courier new&#39;, monospace">000000000000002e        mulsd   %xmm1,%xmm0</font></div><div><font face="&#39;courier new&#39;, monospace">0000000000000032        movss   0x04(%r13),%xmm1</font></div>
<div><font face="&#39;courier new&#39;, monospace">0000000000000038        cvtss2sd        %xmm1,%xmm1</font></div><div><font face="&#39;courier new&#39;, monospace">000000000000003c        movss   0x10(%r14),%xmm2</font></div>


<div><font face="&#39;courier new&#39;, monospace">0000000000000042        cvtss2sd        %xmm2,%xmm2</font></div><div><font face="&#39;courier new&#39;, monospace">0000000000000046        mulsd   %xmm2,%xmm1</font></div>


<div><font face="&#39;courier new&#39;, monospace">000000000000004a        addsd   %xmm1,%xmm0</font></div><div><font face="&#39;courier new&#39;, monospace">000000000000004e        movss   0x08(%r13),%xmm1</font></div>
<div><font face="&#39;courier new&#39;, monospace">0000000000000054        cvtss2sd        %xmm1,%xmm1</font></div><div><font face="&#39;courier new&#39;, monospace">0000000000000058        movss   0x20(%r14),%xmm2</font></div>


<div><font face="&#39;courier new&#39;, monospace">000000000000005e        cvtss2sd        %xmm2,%xmm2</font></div><div><font face="&#39;courier new&#39;, monospace">0000000000000062        mulsd   %xmm2,%xmm1</font></div>


<div><font face="&#39;courier new&#39;, monospace">0000000000000066        addsd   %xmm1,%xmm0</font></div><div><font face="&#39;courier new&#39;, monospace">000000000000006a        movss   0x0c(%r13),%xmm1</font></div>
</div><div><br></div><div>This could definitely account for the performance discrepancy.  Why is Mono up-converting to doubles for single-precision expressions?  </div><div><br></div><div>The 32-bit VM appears to be using the x87 stack instead of SSE scalar instructions, but at least its using single-precision.</div>


<div><br></div><font color="#888888">-- <br><br><div>Thanks,</div><div><br></div><div>Justin Holewinski</div><br>
</font><br></div></div>_______________________________________________<br>
Mono-list maillist  -  <a href="mailto:Mono-list@lists.ximian.com" target="_blank">Mono-list@lists.ximian.com</a><br>
<a href="http://lists.ximian.com/mailman/listinfo/mono-list" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-list</a><br>
<br></blockquote></div><br></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><br><div>Thanks,</div><div><br></div><div>Justin Holewinski</div><br>