[Mono-dev] Mono.SIMD
Johann_fxgen
jnadalutti at gmail.com
Fri Feb 20 03:12:14 EST 2009
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.
More information about the Mono-devel-list
mailing list