[Mono-dev] Mono.SIMD
Alan McGovern
alan.mcgovern at gmail.com
Mon Feb 23 05:41:49 EST 2009
Hey,
The big issue you're having is that you haven't implemented a SIMD algorithm
;) I spent 15 mins 'optimising' your code and came up with this. Notice that
I made everything a SIMD operation. There is no scalar code in the method
anymore. This tripled performance as compared to the non-SIMD version. On my
machine:
-FLOAT 00:00:00.3888930 Color
-SIMD 00:00:00.1266820 Mono.Simd.Vector4f
You'd want to double check the result just in case I made a mistake with my
alterations.
Alan.
public static Vector4f GradientSIMD()
{
Vector4f finv_WH = new Vector4f (1.0f / (w*h), 1.0f / (w*h),
1.0f / (w*h), 1.0f / (w*h));
Vector4f ret = new Vector4f();
Vector4f a = new Vector4f(0.0f, 0.0f, 1.0f, 1.0f);
a += new Vector4f(0.0f, 1.0f, 0.0f, 1.0f);
a += new Vector4f(1.0f, 0.0f, 0.0f, 1.0f);
a += new Vector4f(0.5f, 0.5f, 1.0f, 1.0f);
//Process operator
Vector4f yVec = new Vector4f (h, h, 0, 0);
Vector4f yDiff = new Vector4f (-1, -1, 1, 1);
for (int y=0; y<h; y++)
{
Vector4f factor = yVec * finv_WH;
yVec += yDiff;
Vector4f xVec = new Vector4f (w, 0, w, 0);
Vector4f xDiff = new Vector4f (-1, 1, -1, 1);
for (int x=0; x<w; x++)
{
ret += (a * xVec * factor);
xVec += xDiff;
}
}
return ret;
}
On Fri, Feb 20, 2009 at 8:12 AM, Johann_fxgen <jnadalutti at gmail.com> wrote:
>
> I have done some performance tests of SIMD under windows.
>
> Results tests in ms:
> In MS C 235 (Visual Studio Release Mode With SIMD)
> In MS C 360 (Visual Studio Release Mode With 4D Float)
> In Mono C# 453 (With Mono SIMD)
> In Mono C# 562 (With Mono 4D Float)
> In MS C# 609 (Visual Studio With 4D Float)
> In MS C 672 (Visual Studio Debug Mode)
>
> I'm just surprise by difference between C SIMD and mono SIMD version.
>
> Is Mono.SIMD under linux speeder than under windows ?
>
> Johann.
>
> My mono code for test:
>
> using Mono.Simd;
> using System;
> using Mono;
>
> public struct Color
> {
> public float r,g,b,a;
> };
>
> public class TestMonoSIMD
> {
> public Color m_pixels;
> const int w = 4096;
> const int h = 4096;
>
> public static void Main ()
> {
> //Debug
> Console.WriteLine("AccelMode: {0}",
> Mono.Simd.SimdRuntime.AccelMode );
>
> //Without SIMD
> DateTime start1 = DateTime.Now;
> Color ret1 = Gradient();
> TimeSpan ts1 = DateTime.Now - start1;
> Console.WriteLine("-FLOAT {0} {1}", ts1, ret1);
>
> //With SIMD
> DateTime start2 = DateTime.Now;
> Vector4f ret2 = GradientSIMD();
> TimeSpan ts2 = DateTime.Now - start2;
> Console.WriteLine("-SIMD {0} {1}", ts2, ret2);
> }
>
> public static Color Gradient()
> {
> float finv_WH = 1.0f / (float)(w*h);
> Color ret = new Color();
> ret.r=ret.g=ret.b=ret.a=0.0f;
>
> Color a = new Color();
> Color b = new Color();
> Color c = new Color();
> Color d = new Color();
> a.r=0.0f; a.g=0.0f; a.b=1.0f; a.a=1.0f;
> b.r=0.0f; b.g=1.0f; b.b=0.0f; b.a=1.0f;
> c.r=1.0f; c.g=0.0f; c.b=0.0f; c.a=1.0f;
> d.r=0.5f; d.g=0.5f; d.b=1.0f; d.a=1.0f;
>
> //Process operator
> for (int y=0; y<h; y++)
> {
> for (int x=0; x<w; x++)
> {
> //Calc percent A,B,C,D
> float pa = (float)((w-x) *
> (h-y)) * finv_WH;
> float pb = (float)((x) *
> (h-y)) * finv_WH;
> float pc = (float)((w-x) *
> (y)) * finv_WH;
> float pd = (float)((x) *
> (y)) * finv_WH;
>
> float cr= ((a.r*pa) + (b.r*pb) +
> (c.r*pc) + (d.r*pd));
> float cg= ((a.g*pa) + (b.g*pb) +
> (c.g*pc) + (d.g*pd));
> float cb= ((a.b*pa) + (b.b*pb) +
> (c.b*pc) + (d.b*pd));
> float ca= ((a.a*pa) + (b.a*pb) +
> (c.a*pc) + (d.a*pd));
> ret.r+=cr; ret.g+=cg;
> ret.b+=cb; ret.a+=ca;
> }
> }
> return ret;
> }
>
> public static Vector4f GradientSIMD()
> {
> float finv_WH = 1.0f / (float)(w*h);
> Vector4f ret = new Vector4f(0.0f, 0.0f, 0.0f, 0.0f);
>
> Vector4f a = new Vector4f(0.0f, 0.0f, 1.0f, 1.0f);
> Vector4f b = new Vector4f(0.0f, 1.0f, 0.0f, 1.0f);
> Vector4f c = new Vector4f(1.0f, 0.0f, 0.0f, 1.0f);
> Vector4f d = new Vector4f(0.5f, 0.5f, 1.0f, 1.0f);
>
> //Process operator
> Vector4f p = new Vector4f();
> Vector4f r = new Vector4f();
> for (int y=0; y<h; y++)
> {
> for (int x=0; x<w; x++)
> {
> //Calc percent A,B,C,D
> p.X = (float)((w-x) * (h-y)) *
> finv_WH;
> p.Y = (float)((x) *
> (h-y)) * finv_WH;
> p.Z = (float)((w-x) * (y)) *
> finv_WH;
> p.W = (float)((x) *
> (y)) * finv_WH;
>
> ret+=a*p + b*p + c*p + d*p;
> }
> }
> return ret;
> }
>
> }
>
>
> --
> View this message in context:
> http://www.nabble.com/Mono.SIMD-tp22116483p22116483.html
> Sent from the Mono - Dev mailing list archive at Nabble.com.
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-devel-list/attachments/20090223/5dc931c0/attachment-0001.html
More information about the Mono-devel-list
mailing list