From 12be91e93ca8df7a8d812eb75bb93b940f097909 Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Sat, 24 Feb 2018 15:05:41 +0100 Subject: [PATCH] Benchmark: bring vector-add benchmark back --- src/Benchmark/LinearAlgebra/DenseVectorAdd.cs | 249 +++++++----------- src/Benchmark/Program.cs | 1 + 2 files changed, 98 insertions(+), 152 deletions(-) diff --git a/src/Benchmark/LinearAlgebra/DenseVectorAdd.cs b/src/Benchmark/LinearAlgebra/DenseVectorAdd.cs index 0924ec96..c7ebae54 100644 --- a/src/Benchmark/LinearAlgebra/DenseVectorAdd.cs +++ b/src/Benchmark/LinearAlgebra/DenseVectorAdd.cs @@ -1,156 +1,101 @@ -//using System; -//using MathNet.Numerics; -//using MathNet.Numerics.LinearAlgebra; -//using MathNet.Numerics.LinearAlgebra.Storage; -//using MathNet.Numerics.Providers.LinearAlgebra; -//using MathNet.Numerics.Providers.LinearAlgebra.Mkl; -//using MathNet.Numerics.Threading; +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Environments; +using BenchmarkDotNet.Jobs; +using MathNet.Numerics; +using MathNet.Numerics.LinearAlgebra; +using MathNet.Numerics.Providers.Common.Mkl; +using MathNet.Numerics.Providers.LinearAlgebra; namespace Benchmark.LinearAlgebra { - - -//Benchmark(new LinearAlgebra.DenseVectorAdd(10000000,1), 10, "Large (10'000'000) - 10x1 iterations"); -//Benchmark(new LinearAlgebra.DenseVectorAdd(100,1000), 100, "Small (100) - 100x1000 iterations"); - - - -// public class DenseVectorAdd -// { -// readonly int _rounds; -// readonly Vector _a; -// readonly Vector _b; - -// readonly ILinearAlgebraProvider _managed = new ManagedLinearAlgebraProvider(); -// readonly ILinearAlgebraProvider _mkl = new MklLinearAlgebraProvider(); - -// public DenseVectorAdd(int size, int rounds) -// { -// _rounds = rounds; - -// _b = Vector.Build.Random(size); -// _a = Vector.Build.Random(size); - -// _managed.InitializeVerify(); -// Control.LinearAlgebraProvider = _managed; - -//#if NATIVE -// _mkl.InitializeVerify(); -//#endif -// } - -// [BenchSharkTask("AddOperator")] -// public Vector AddOperator() -// { -// var z = _b; -// for (int i = 0; i < _rounds; i++) -// { -// z = _a + z; -// } -// return z; -// } - -// [BenchSharkTask("Map2")] -// public Vector Map2() -// { -// var z = _b; -// for (int i = 0; i < _rounds; i++) -// { -// z = _a.Map2((u, v) => u + v, z); -// } -// return z; -// } - -// [BenchSharkTask("Loop")] -// public Vector Loop() -// { -// var z = _b; -// for (int i = 0; i < _rounds; i++) -// { -// var aa = ((DenseVectorStorage)_a.Storage).Data; -// var az = ((DenseVectorStorage)z.Storage).Data; -// var ar = new Double[aa.Length]; -// for (int k = 0; k < ar.Length; k++) -// { -// ar[k] = aa[k] + az[k]; -// } -// z = Vector.Build.Dense(ar); -// } -// return z; -// } - -// [BenchSharkTask("ParallelLoop4096")] -// public Vector ParallelLoop4096() -// { -// var z = _b; -// for (int i = 0; i < _rounds; i++) -// { -// var aa = ((DenseVectorStorage)_a.Storage).Data; -// var az = ((DenseVectorStorage)z.Storage).Data; -// var ar = new Double[aa.Length]; -// CommonParallel.For(0, ar.Length, 4096, (u, v) => -// { -// for (int k = u; k < v; k++) -// { -// ar[k] = aa[k] + az[k]; -// } -// }); -// z = Vector.Build.Dense(ar); -// } -// return z; -// } - -// [BenchSharkTask("ParallelLoop32768")] -// public Vector ParallelLoop32768() -// { -// var z = _b; -// for (int i = 0; i < _rounds; i++) -// { -// var aa = ((DenseVectorStorage)_a.Storage).Data; -// var az = ((DenseVectorStorage)z.Storage).Data; -// var ar = new Double[aa.Length]; -// CommonParallel.For(0, ar.Length, 32768, (u, v) => -// { -// for (int k = u; k < v; k++) -// { -// ar[k] = aa[k] + az[k]; -// } -// }); -// z = Vector.Build.Dense(ar); -// } -// return z; -// } - -// [BenchSharkTask("ManagedProvider")] -// public Vector ManagedProvider() -// { -// var z = _b; -// for (int i = 0; i < _rounds; i++) -// { -// var aa = ((DenseVectorStorage)_a.Storage).Data; -// var az = ((DenseVectorStorage)z.Storage).Data; -// var ar = new Double[aa.Length]; -// _managed.AddArrays(aa, az, ar); -// z = Vector.Build.Dense(ar); -// } -// return z; -// } - -//#if NATIVEMKL -// [BenchSharkTask("MklProvider")] -// public Vector MklProvider() -// { -// var z = _b; -// for (int i = 0; i < _rounds; i++) -// { -// var aa = ((DenseVectorStorage)_a.Storage).Data; -// var az = ((DenseVectorStorage)z.Storage).Data; -// var ar = new Double[aa.Length]; -// _mkl.AddArrays(aa, az, ar); -// z = Vector.Build.Dense(ar); -// } -// return z; -// } -//#endif -// } + [Config(typeof(Config))] + public class DenseVectorAdd + { + class Config : ManualConfig + { + public Config() + { + Add( + new Job("CLR x64", RunMode.Default, EnvMode.RyuJitX64) + { + Env = { Runtime = Runtime.Clr, Platform = Platform.X64 } + }, + new Job("CLR x86", RunMode.Default, EnvMode.LegacyJitX86) + { + Env = { Runtime = Runtime.Clr, Platform = Platform.X86 } + }); +#if !NET461 + Add(new Job("Core RyuJit x64", RunMode.Default, EnvMode.RyuJitX64) + { + Env = { Runtime = Runtime.Core, Platform = Platform.X64 } + }); +#endif + } + } + + public enum ProviderId + { + Managed, + NativeMKL, + } + + [Params(4, 32, 128, 4096, 524288)] + public int N { get; set; } + + [Params(ProviderId.Managed, ProviderId.NativeMKL)] + public ProviderId Provider { get; set; } + + //const int Rounds = 1024; + + double[] _a; + double[] _b; + Vector _av; + Vector _bv; + + [GlobalSetup] + public void Setup() + { + switch (Provider) + { + case ProviderId.Managed: + Control.UseManaged(); + break; + case ProviderId.NativeMKL: + Control.UseNativeMKL(MklConsistency.Auto, MklPrecision.Double, MklAccuracy.High); + break; + } + + _a = Generate.Normal(N, 2.0, 10.0); + _b = Generate.Normal(N, 200.0, 10.0); + _av = Vector.Build.Dense(_a); + _bv = Vector.Build.Dense(_b); + } + + [Benchmark(OperationsPerInvoke = 1, Baseline = true)] + public double[] ForLoop() + { + double[] r = new double[_a.Length]; + for (int i = 0; i < r.Length; i++) + { + r[i] = _a[i] + _b[i]; + } + + return r; + } + + [Benchmark(OperationsPerInvoke = 1)] + public double[] ProviderAddArrays() + { + double[] r = new double[_a.Length]; + LinearAlgebraControl.Provider.AddArrays(_a, _b, r); + return r; + } + + [Benchmark(OperationsPerInvoke = 1)] + public Vector VectorAddOp() + { + return _av + _bv; + } + } } diff --git a/src/Benchmark/Program.cs b/src/Benchmark/Program.cs index 6d9d77fd..0a568f1e 100644 --- a/src/Benchmark/Program.cs +++ b/src/Benchmark/Program.cs @@ -15,6 +15,7 @@ namespace Benchmark { typeof(Transforms.FFT), typeof(LinearAlgebra.DenseMatrixProduct), + typeof(LinearAlgebra.DenseVectorAdd), }); switcher.Run(args);