Cross-posting to mono-dev since I&#39;m not really sure where this belongs...<br><br><div class="gmail_quote">---------- Forwarded message ----------<br>From: <b class="gmail_sendername">Justin Holewinski</b> <span dir="ltr">&lt;<a href="mailto:justin.holewinski@gmail.com">justin.holewinski@gmail.com</a>&gt;</span><br>
Date: Wed, Oct 26, 2011 at 2:00 PM<br>Subject: 32-bit vs 64-bit Performance Discrepency<br>To: <a href="mailto:mono-list@lists.ximian.com">mono-list@lists.ximian.com</a><br><br><br>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></div><br><br clear="all"><div><br></div>-- <br><br><div>Thanks,</div><div><br></div><div>Justin Holewinski</div><br>