コード例 #1
0
        public Vector <double> RunCalculations(RandomSource random, int iterations, Func <int, double, double> sampleFunction)
        {
            if (random == null)
            {
                throw new ArgumentNullException(nameof(random));
            }
            else if (iterations % ChunkSize != 0)
            {
                throw new ArgumentException($"Iteration count must be a multiple of {ChunkSize}.", nameof(iterations));
            }

            SampleFunction = sampleFunction;

            int numberOfChunks = iterations / ChunkSize;

            results = Vector <double> .Build.Dense(iterations);

            var randomNumberBuffer = new BufferBlock <(int chunkNumber, double[] randomNumbers)>();
            var calculationBlock   = new ActionBlock <(int chunkNumber, double[] randomNumbers)>(DoCalculation, new ExecutionDataflowBlockOptions()
            {
                MaxDegreeOfParallelism = -1
            });

            randomNumberBuffer.LinkTo(calculationBlock, new DataflowLinkOptions()
            {
                PropagateCompletion = true
            });


            for (int i = 0; i < numberOfChunks; i++)
            {
                double[] randomArray = new double[ChunkSize];
                random.NextDoubles(randomArray);
                randomNumberBuffer.Post((i, randomArray));
            }

            randomNumberBuffer.Complete();

            calculationBlock.Completion.Wait();

            return(results);
        }