public void Add() { var a = VecFloat.Allocate(1024); a.SetAll(2); var b = VecFloat.Allocate(1024); for (var i = 0; i < b.Count; ++i) { b[i] = i; } var r = VecFloat.Allocate(1024); VecFloat.Add(a, b, r); for (var i = 0; i < r.Count; ++i) { if (r[i] != 2 + i) { throw new Exception(); } } VecFloat.Release(ref a); VecFloat.Release(ref b); VecFloat.Release(ref r); }
static void PreLoad(int allocSize) { var a = VecFloat.Allocate(allocSize); a.SetAll(2); var b = VecFloat.Allocate(allocSize); b.SetAll(5); var r = VecFloat.Allocate(allocSize); VecFloat.Add(a, b, r); VecFloat.Release(ref a); VecFloat.Release(ref b); VecFloat.Release(ref r); }
private static float Simd(int allocSize) { var a = VecFloat.Allocate(allocSize); a.SetAll(2); var b = VecFloat.Allocate(allocSize); b.SetAll(5); var r = VecFloat.Allocate(allocSize); VecFloat.Add(a, b, r); var result = VecFloat.Sum(r); VecFloat.Release(ref a); VecFloat.Release(ref b); VecFloat.Release(ref r); return(result); }
static void Main(string[] args) { Stopwatch watch = new Stopwatch(); int allocSize = 10000000; Random rnd = new Random(); float[] setA = new float[allocSize]; float[] setB = new float[allocSize]; var a = VecFloat.Allocate(allocSize); var b = VecFloat.Allocate(allocSize); for (int i = 0; i < allocSize; i++) { setA[i] = rnd.Next(0, 10); setB[i] = rnd.Next(0, 10); } a.SetRange(0, setA, 0, allocSize); b.SetRange(0, setB, 0, allocSize); //a.SetAll(2); // b.SetAll(5); var r = VecFloat.Allocate(allocSize); watch.Start(); VecFloat.Add(a, b, r); watch.Stop(); VecFloat.Release(ref a); VecFloat.Release(ref b); VecFloat.Release(ref r); Console.WriteLine("SimdSharp: " + watch.ElapsedMilliseconds); //watch.Restart(); float[] qa = new float[allocSize]; float[] qb = new float[allocSize]; float[] qr = new float[allocSize]; for (int i = 0; i < allocSize; i++) { qa[i] = rnd.Next(0, 10); qb[i] = rnd.Next(0, 10); } watch.Reset(); watch.Start(); for (int i = 0; i < allocSize; i++) { qr[i] = qa[i] + qb[i]; } watch.Stop(); Console.WriteLine("Loop: " + watch.ElapsedMilliseconds); //not a fair test, its only using half its contents, wasting 50% cache and its not sped up in .net framework with intrinsics anyways Vector2[] va = new Vector2[allocSize]; Vector2[] vb = new Vector2[allocSize]; Vector2[] vr = new Vector2[allocSize]; for (int i = 0; i < allocSize; i++) { va[i] = new Vector2(rnd.Next(0, 10), rnd.Next(0, 10)); vb[i] = new Vector2(rnd.Next(0, 10), rnd.Next(0, 10)); } watch.Reset(); watch.Start(); for (int i = 0; i < allocSize; i++) { vr[i].X = va[i].X + vb[i].X; } watch.Stop(); Console.WriteLine("Numerics: " + watch.ElapsedMilliseconds); Console.ReadLine(); }