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()
        }
Example #2
0
        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()
        }
Example #3
0
        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 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));
        }
Example #5
0
        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];
        }
Example #7
0
        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;
            }
        }
Example #9
0
        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());
        }
Example #12
0
 public Context(StorageLocation location, DateTime closeOfBusinessDate)
 {
     Factory  = new NArrayFactory(location);
     Settings = new SimulationSettings(closeOfBusinessDate);
 }
        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();
        }
Example #14
0
        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();
        }