public void VectorBinarySearch() { var factory = new NArrayFactory(StorageLocation.Host); int length = 30000; int knotPointsLength = 100; var valuesArray = Enumerable.Range(0, length).Select(i => (double)i / length + 0.5).ToArray(); var values = factory.CreateFromEnumerable(valuesArray); var xArray = Enumerable.Range(0, knotPointsLength).Select(i => (double)i / knotPointsLength).ToArray(); var yArray = Enumerable.Range(0, knotPointsLength).Select(i => 5 + (double)i / knotPointsLength).ToArray(); NArray x = factory.CreateFromEnumerable(xArray); NArray y = factory.CreateFromEnumerable(yArray); var watch = new Stopwatch(); watch.Start(); for (int i = 0; i < 50000; ++i) { BinarySearch(xArray, yArray, valuesArray); } Console.WriteLine("Baseline sequential"); Console.WriteLine(watch.ElapsedMilliseconds); watch.Restart(); for (int i = 0; i < 100; ++i) { var left = NArrayFactory.CreateConstantLike(values, 0); var right = NArrayFactory.CreateConstantLike(values, x.Length - 1); var mid = (left + right) >> 1; //// we are going to stop when right - left = 1 //// for the vector version, we cannot allow the break condition to be different for different //// vector elements int elements = (x.Length - 1) << 1; while (elements > 1) { var active = (right - left) > 1; var midValue = x[mid]; right[midValue >= values && active] = mid; // or alternate form: //right.Assign( // () => midValue >= values && active, // () => mid); // A conditional in a CUDA kernel would cause the evaluation of both branches // But we can be more efficient on CPU (e.g. mask vector indexing) left[midValue < values && active] = mid; mid = left + right >> 1; elements = elements >> 1; } } Console.WriteLine("Vector sequential"); Console.WriteLine(watch.ElapsedMilliseconds); watch.Restart(); //check! //(right - left).DebugDataView.ToArray() }
public void TestCorrelation() { var factory = new NArrayFactory(StorageLocation.Host); var a = factory.CreateNArray(new double[] { 0.32, 0.91, -0.32, -0.25 }); var b = factory.CreateNArray(new double[] { 0.49, 0.75, -0.39, -0.20 }); var correlation = NMath.Correlation(a, b); Assert.AreEqual(Math.Round(correlation, 12), Math.Round(0.96831734966276, 12)); }
public void NearestCorrelation() { var factory = new NArrayFactory(StorageLocation.Host); var correlation = factory.CreateNArray(new double[, ] { { 1.0, 0.84, -0.42 }, { 0.84, 1.0, 0.14 }, { -0.42, 0.14, 1.0 } }); var nearestCorrelation = CorrelationHelper.NearestCorrelationMatrix(correlation); Console.WriteLine(nearestCorrelation.ToString()); }
public void ConditionalExample() { int length = 1000; var factory = new NArrayFactory(StorageLocation.Host); NArray x = factory.CreateFromEnumerable(Enumerable.Range(0, length).Select(i => (double)i / length)); var y = x > 0.5; //x[y] = 6; //var subset = x[y]; //var y = x[x > 0.5]; }
public void SimpleDeferredOperationsTest() { var location = StorageLocation.Host; var factory = new NArrayFactory(location); using (var randomStream = new RandomNumberStream(location, RandomNumberGeneratorType.MRG32K3A, 111)) { var normalDistribution = new Normal(randomStream, 0, 1); var epsilon = factory.CreateNArray(1000, 1); epsilon.FillRandom(normalDistribution); var x = epsilon * Math.Sqrt(0.25) * 0.2; } }
public Context(StorageLocation location, DateTime closeOfBusinessDate) { Factory = new NArrayFactory(location); Settings = new SimulationSettings(closeOfBusinessDate); }
public void NearestCorrelation() { var factory = new NArrayFactory(StorageLocation.Host); var correlation = factory.CreateNArray(new double[,] { { 1.0, 0.84, -0.42}, { 0.84, 1.0, 0.14}, { -0.42, 0.14, 1.0} }); var nearestCorrelation = CorrelationHelper.NearestCorrelationMatrix(correlation); Console.WriteLine(nearestCorrelation.ToString()); }
public void SimpleSpeedTest() { var factory = new NArrayFactory(StorageLocation.Host); IntelMathKernelLibrary.SetAccuracyMode(VMLAccuracy.LowAccuracy); int length = 1024 * 5; var a = factory.CreateFromEnumerable(Enumerable.Range(0, length).Select(i => (double)i / length)); var a2 = (a.Storage as VectorAccelerator.NArrayStorage.ManagedStorage<double>).Array; var b = factory.CreateFromEnumerable(Enumerable.Range(3, length).Select(i => (double)i / length)); var b2 = (b.Storage as VectorAccelerator.NArrayStorage.ManagedStorage<double>).Array; double[] result = null; NArray resultN = null; Console.WriteLine("Allocation"); Timeit( () => { result = new double[length]; }); Console.WriteLine(Environment.NewLine); result = new double[length]; Console.WriteLine("Managed optimal"); Timeit( () => { for (int i = 0; i < result.Length; ++i) //Parallel.For(0, result.Length, (i) => { result[i] = 3 * Math.Log(Math.Exp(a2[i]) * Math.Exp(b2[i])); } //); }); Console.WriteLine(Environment.NewLine); var vectorOptions = new VectorAccelerator.DeferredExecution.VectorExecutionOptions(); vectorOptions.MultipleThreads = true; resultN = NArray.CreateLike(a); Console.WriteLine("Deferred threaded"); Timeit( () => { NArray.Evaluate(vectorOptions, () => { return 3 * NMath.Log(NMath.Exp(a) * NMath.Exp(b)); }); }); Console.WriteLine(CheckitString(result, (resultN.Storage as ManagedStorage<double>).Array)); Console.WriteLine(Environment.NewLine); resultN = NArray.CreateLike(a); vectorOptions.MultipleThreads = false; Console.WriteLine("Deferred not threaded"); Timeit( () => { NArray.Evaluate(vectorOptions, () => { return 3 * NMath.Log(NMath.Exp(a) * NMath.Exp(b)); }); }); Console.WriteLine(CheckitString(result, (resultN.Storage as ManagedStorage<double>).Array)); Console.WriteLine(Environment.NewLine); Console.WriteLine("Immediate"); Timeit( () => { resultN.Assign(3 * NMath.Log(NMath.Exp(a) * NMath.Exp(b))); }); Console.WriteLine(CheckitString(result, (resultN.Storage as ManagedStorage<double>).Array)); Console.WriteLine(Environment.NewLine); Console.WriteLine("Hit any key"); Console.ReadKey(); }
public void SimpleSpeedTest() { var factory = new NArrayFactory(StorageLocation.Host); IntelMathKernelLibrary.SetAccuracyMode(VMLAccuracy.LowAccuracy); int length = 1024 * 5; var a = factory.CreateFromEnumerable(Enumerable.Range(0, length).Select(i => (double)i / length)); var a2 = (a.Storage as VectorAccelerator.NArrayStorage.ManagedStorage <double>).Array; var b = factory.CreateFromEnumerable(Enumerable.Range(3, length).Select(i => (double)i / length)); var b2 = (b.Storage as VectorAccelerator.NArrayStorage.ManagedStorage <double>).Array; double[] result = null; NArray resultN = null; Console.WriteLine("Allocation"); Timeit( () => { result = new double[length]; }); Console.WriteLine(Environment.NewLine); result = new double[length]; Console.WriteLine("Managed optimal"); Timeit( () => { for (int i = 0; i < result.Length; ++i) //Parallel.For(0, result.Length, (i) => { result[i] = 3 * Math.Log(Math.Exp(a2[i]) * Math.Exp(b2[i])); } //); }); Console.WriteLine(Environment.NewLine); var vectorOptions = new VectorAccelerator.DeferredExecution.VectorExecutionOptions(); vectorOptions.MultipleThreads = true; resultN = NArray.CreateLike(a); Console.WriteLine("Deferred threaded"); Timeit( () => { NArray.Evaluate(vectorOptions, () => { return(3 * NMath.Log(NMath.Exp(a) * NMath.Exp(b))); }); }); Console.WriteLine(CheckitString(result, (resultN.Storage as ManagedStorage <double>).Array)); Console.WriteLine(Environment.NewLine); resultN = NArray.CreateLike(a); vectorOptions.MultipleThreads = false; Console.WriteLine("Deferred not threaded"); Timeit( () => { NArray.Evaluate(vectorOptions, () => { return(3 * NMath.Log(NMath.Exp(a) * NMath.Exp(b))); }); }); Console.WriteLine(CheckitString(result, (resultN.Storage as ManagedStorage <double>).Array)); Console.WriteLine(Environment.NewLine); Console.WriteLine("Immediate"); Timeit( () => { resultN.Assign(3 * NMath.Log(NMath.Exp(a) * NMath.Exp(b))); }); Console.WriteLine(CheckitString(result, (resultN.Storage as ManagedStorage <double>).Array)); Console.WriteLine(Environment.NewLine); Console.WriteLine("Hit any key"); Console.ReadKey(); }