forked from tsai/mathnet-numerics
2 changed files with 98 additions and 152 deletions
@ -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
|
|
||||
// }
|
|
||||
} |
} |
||||
|
|||||
Loading…
Reference in new issue