Eвклидова норма вектора с помощью метода Parallel.For и Parallel.Invoke - C#

Узнай цену своей работы

Формулировка задачи:

Имеется прога (евклидова норма вектора) Преобразовать её, чтобы распараллеливание шло методом методом Parallel.For и Parallel.Invoke
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Evklid
{
    class Program
    {
        static void Main(string[] args)
        {
            var vector = new double[] { 2, 3, 4, 5, 6 }; // Вектор
            var taskCount = 3; //Число параллельных задач
 
            var sum = CalculateSum(vector, taskCount); //Параллельный подсчет суммы
            var norm = Math.Sqrt(sum);
            Console.WriteLine("Сумма квадратов: " + sum + "; Норма вектора: " + norm);
            Console.ReadKey();
        }
 
        private static double CalculateSum(double[] vector, int taskCount)
        {
            var len = vector.Length;
 
            //Не может быть задач больше числа элементов вектора
            if (taskCount > len)
                throw new ArgumentException();
 
            var step = (len + 1) / taskCount; //Интервал для суммы
            var tasks = new Task<double>[taskCount];
            for (var i = 0; i < taskCount; i++)
            {
                tasks[i] = Task<double>.Factory.StartNew((obj) => Sum(vector, (int)obj * step, ((int)obj + 1) * step - 1), i);
            }
            Task.WaitAll(tasks);
            var sum = tasks.Select(x => x.Result).Sum();
            return sum;
        }

        static double Sum(IEnumerable<double> vector, int index1, int index2)
        {
            index2 = index2 >= vector.Count() ? vector.Count() : index2;
            return vector.Skip(index1).Take(index2 - index1 + 1).Select(x => x * x).Sum();
        }
    }
}

Решение задачи: «Eвклидова норма вектора с помощью метода Parallel.For и Parallel.Invoke»

textual
Листинг программы
        static void Main(string[] args)
        {
            var vector = new double[] { 2, 2, 2, 2, 2 }; // Вектор
            var sum = 0.0;
            Parallel.ForEach(vector,
                () => // Initializer
                {
                    return 0.0;
                },
                (item, state, subtotal) => // Loop body
                {
                    return subtotal += item*item;
                },
                (subtotal) => // Accumulator
                {
                    lock (vector)
                    {
                        sum += subtotal;
                    }
                });
            
            var norm = Math.Sqrt(sum);
            Console.WriteLine("Сумма квадратов: "+sum+"; Норма вектора: "+norm);
            Console.ReadKey();
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.75 из 5
Похожие ответы