Example #1
0
        private void AddRange(Range range)
        {
            var list = new HashSet <Range> {
                range
            };

            _ranges.AddOrUpdate(
                Thread.CurrentThread.ManagedThreadId,
                list,
                (id, l) =>
            {
                l.Add(range);
                return(l);
            }
                );
        }
Example #2
0
        public double[] CustomLoop()
        {
            _name = nameof(CustomLoop);
            this.ClearRanges();

            int n    = _values.Length;
            var corr = new double[n / 2];

            int parallelCount = Environment.ProcessorCount;
            WorkloadPartitioner partitioner = WorkloadPartitioner.Create(n / 2, loadFactorAtStart: n, loadFactorAtEnd: n * 0.5, Environment.ProcessorCount * this.PartitionMultiplier);
            IEnumerable <KeyValuePair <long, Range> > partitionEnumerator = partitioner.GetOrderableDynamicPartitions();

            var tasks = new Task[parallelCount];

            tasks[0] = new Task(Loop, partitionEnumerator);

            for (int i = 1; i < parallelCount; ++i)
            {
                tasks[i] = Task.Factory.StartNew(Loop, partitionEnumerator);
            }

            tasks[0].RunSynchronously();
            Task.WaitAll(tasks);

            return(corr);

            //-----------------------------------------------------------------
            void Loop(object _)
            {
                foreach (KeyValuePair <long, Range> partition in _ as IEnumerable <KeyValuePair <long, Range> > )
                {
                    Range range = partition.Value;
                    this.AutoCorrelationToArrayImpl(corr, range);
                }
            }
        }