Browse Source

Benchmark: bring vector-add benchmark back

spatial
Christoph Ruegg 9 years ago
parent
commit
12be91e93c
  1. 249
      src/Benchmark/LinearAlgebra/DenseVectorAdd.cs
  2. 1
      src/Benchmark/Program.cs

249
src/Benchmark/LinearAlgebra/DenseVectorAdd.cs

@ -1,156 +1,101 @@
//using System; using BenchmarkDotNet.Attributes;
//using MathNet.Numerics; using BenchmarkDotNet.Configs;
//using MathNet.Numerics.LinearAlgebra; using BenchmarkDotNet.Environments;
//using MathNet.Numerics.LinearAlgebra.Storage; using BenchmarkDotNet.Jobs;
//using MathNet.Numerics.Providers.LinearAlgebra; using MathNet.Numerics;
//using MathNet.Numerics.Providers.LinearAlgebra.Mkl; using MathNet.Numerics.LinearAlgebra;
//using MathNet.Numerics.Threading; using MathNet.Numerics.Providers.Common.Mkl;
using MathNet.Numerics.Providers.LinearAlgebra;
namespace Benchmark.LinearAlgebra namespace Benchmark.LinearAlgebra
{ {
[Config(typeof(Config))]
public class DenseVectorAdd
//Benchmark(new LinearAlgebra.DenseVectorAdd(10000000,1), 10, "Large (10'000'000) - 10x1 iterations"); {
//Benchmark(new LinearAlgebra.DenseVectorAdd(100,1000), 100, "Small (100) - 100x1000 iterations"); class Config : ManualConfig
{
public Config()
{
// public class DenseVectorAdd Add(
// { new Job("CLR x64", RunMode.Default, EnvMode.RyuJitX64)
// readonly int _rounds; {
// readonly Vector<double> _a; Env = { Runtime = Runtime.Clr, Platform = Platform.X64 }
// readonly Vector<double> _b; },
new Job("CLR x86", RunMode.Default, EnvMode.LegacyJitX86)
// readonly ILinearAlgebraProvider _managed = new ManagedLinearAlgebraProvider(); {
// readonly ILinearAlgebraProvider _mkl = new MklLinearAlgebraProvider(); Env = { Runtime = Runtime.Clr, Platform = Platform.X86 }
});
// public DenseVectorAdd(int size, int rounds) #if !NET461
// { Add(new Job("Core RyuJit x64", RunMode.Default, EnvMode.RyuJitX64)
// _rounds = rounds; {
Env = { Runtime = Runtime.Core, Platform = Platform.X64 }
// _b = Vector<double>.Build.Random(size); });
// _a = Vector<double>.Build.Random(size); #endif
}
// _managed.InitializeVerify(); }
// Control.LinearAlgebraProvider = _managed;
public enum ProviderId
//#if NATIVE {
// _mkl.InitializeVerify(); Managed,
//#endif NativeMKL,
// } }
// [BenchSharkTask("AddOperator")] [Params(4, 32, 128, 4096, 524288)]
// public Vector<double> AddOperator() public int N { get; set; }
// {
// var z = _b; [Params(ProviderId.Managed, ProviderId.NativeMKL)]
// for (int i = 0; i < _rounds; i++) public ProviderId Provider { get; set; }
// {
// z = _a + z; //const int Rounds = 1024;
// }
// return z; double[] _a;
// } double[] _b;
Vector<double> _av;
// [BenchSharkTask("Map2")] Vector<double> _bv;
// public Vector<double> Map2()
// { [GlobalSetup]
// var z = _b; public void Setup()
// for (int i = 0; i < _rounds; i++) {
// { switch (Provider)
// z = _a.Map2((u, v) => u + v, z); {
// } case ProviderId.Managed:
// return z; Control.UseManaged();
// } break;
case ProviderId.NativeMKL:
// [BenchSharkTask("Loop")] Control.UseNativeMKL(MklConsistency.Auto, MklPrecision.Double, MklAccuracy.High);
// public Vector<double> Loop() break;
// { }
// var z = _b;
// for (int i = 0; i < _rounds; i++) _a = Generate.Normal(N, 2.0, 10.0);
// { _b = Generate.Normal(N, 200.0, 10.0);
// var aa = ((DenseVectorStorage<double>)_a.Storage).Data; _av = Vector<double>.Build.Dense(_a);
// var az = ((DenseVectorStorage<double>)z.Storage).Data; _bv = Vector<double>.Build.Dense(_b);
// var ar = new Double[aa.Length]; }
// for (int k = 0; k < ar.Length; k++)
// { [Benchmark(OperationsPerInvoke = 1, Baseline = true)]
// ar[k] = aa[k] + az[k]; public double[] ForLoop()
// } {
// z = Vector<double>.Build.Dense(ar); double[] r = new double[_a.Length];
// } for (int i = 0; i < r.Length; i++)
// return z; {
// } r[i] = _a[i] + _b[i];
}
// [BenchSharkTask("ParallelLoop4096")]
// public Vector<double> ParallelLoop4096() return r;
// { }
// var z = _b;
// for (int i = 0; i < _rounds; i++) [Benchmark(OperationsPerInvoke = 1)]
// { public double[] ProviderAddArrays()
// var aa = ((DenseVectorStorage<double>)_a.Storage).Data; {
// var az = ((DenseVectorStorage<double>)z.Storage).Data; double[] r = new double[_a.Length];
// var ar = new Double[aa.Length]; LinearAlgebraControl.Provider.AddArrays(_a, _b, r);
// CommonParallel.For(0, ar.Length, 4096, (u, v) => return r;
// { }
// for (int k = u; k < v; k++)
// { [Benchmark(OperationsPerInvoke = 1)]
// ar[k] = aa[k] + az[k]; public Vector<double> VectorAddOp()
// } {
// }); return _av + _bv;
// z = Vector<double>.Build.Dense(ar); }
// } }
// return z;
// }
// [BenchSharkTask("ParallelLoop32768")]
// public Vector<double> ParallelLoop32768()
// {
// var z = _b;
// for (int i = 0; i < _rounds; i++)
// {
// var aa = ((DenseVectorStorage<double>)_a.Storage).Data;
// var az = ((DenseVectorStorage<double>)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<double>.Build.Dense(ar);
// }
// return z;
// }
// [BenchSharkTask("ManagedProvider")]
// public Vector<double> ManagedProvider()
// {
// var z = _b;
// for (int i = 0; i < _rounds; i++)
// {
// var aa = ((DenseVectorStorage<double>)_a.Storage).Data;
// var az = ((DenseVectorStorage<double>)z.Storage).Data;
// var ar = new Double[aa.Length];
// _managed.AddArrays(aa, az, ar);
// z = Vector<double>.Build.Dense(ar);
// }
// return z;
// }
//#if NATIVEMKL
// [BenchSharkTask("MklProvider")]
// public Vector<double> MklProvider()
// {
// var z = _b;
// for (int i = 0; i < _rounds; i++)
// {
// var aa = ((DenseVectorStorage<double>)_a.Storage).Data;
// var az = ((DenseVectorStorage<double>)z.Storage).Data;
// var ar = new Double[aa.Length];
// _mkl.AddArrays(aa, az, ar);
// z = Vector<double>.Build.Dense(ar);
// }
// return z;
// }
//#endif
// }
} }

1
src/Benchmark/Program.cs

@ -15,6 +15,7 @@ namespace Benchmark
{ {
typeof(Transforms.FFT), typeof(Transforms.FFT),
typeof(LinearAlgebra.DenseMatrixProduct), typeof(LinearAlgebra.DenseMatrixProduct),
typeof(LinearAlgebra.DenseVectorAdd),
}); });
switcher.Run(args); switcher.Run(args);

Loading…
Cancel
Save