Распараллеливание вычислений - C#
Формулировка задачи:
Доброго времени.
Может кто-нибудь подсказать по классу Parallel из TPL.
Я создал вычисление интеграла Sin(x) от 0 до Пи, а время почему-то не особо различается. Ведь при параллельном программировании время выполнения должно сокращаться.
Тогда в чем смысл этого распараллеливания, если результаты выполнения не особо отличаются?
static void Main(string[] args) { double integral_formula = 0; int n = 1000000000; Parallel.Invoke(() => Factorial(n)); Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i <= n - 1; i++) integral_formula += ((Math.PI / n) * Math.Sin(Math.PI * i / n)); sw.Stop(); Console.WriteLine("Время работы без Parallel = {0}", sw.Elapsed); Console.WriteLine("Sin по формуле равен {0}", integral_formula); Console.ReadKey(); } static void Factorial(int x) { double integral_formula = 0; Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i <= x - 1; i++) integral_formula += ((Math.PI / x) * Math.Sin(Math.PI * i / x)); sw.Stop(); Console.WriteLine("Время работы c Parallel = {0}", sw.Elapsed); Console.WriteLine("Sin по формуле равен {0}", integral_formula); }
Решение задачи: «Распараллеливание вычислений»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; using System.Collections.Concurrent; namespace Parallel_Test { class Program { static void Main(string[] args) { int x = 1000000000; CycleFactorial(x); ParallelEnumerableFactorial(x); AsParallelFactorial(x); PartitionerFactorial(x); Console.ReadLine(); } static void CycleFactorial(int x) { double integral = 0; Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < x; i++) { integral += ((Math.PI / x) * Math.Sin(Math.PI * i / x)); } sw.Stop(); Console.WriteLine("With Simple Cycle(): {0}", sw.Elapsed); Console.WriteLine("Resul is: {0}", integral); Console.WriteLine(); } static void ParallelEnumerableFactorial(int x) { Stopwatch sw = new Stopwatch(); sw.Start(); double integral = ParallelEnumerable.Range(0, x - 1) .Sum(i => ((Math.PI / x) * Math.Sin(Math.PI * i / x))); sw.Stop(); Console.WriteLine("With ParallelEnumerable: {0}", sw.Elapsed); Console.WriteLine("Resul is: {0}", integral); Console.WriteLine(); } static void AsParallelFactorial(int x) { var arr = Enumerable.Range(0, x - 1); Stopwatch sw = new Stopwatch(); sw.Start(); double integral = arr.AsParallel() .WithDegreeOfParallelism(Environment.ProcessorCount) .WithExecutionMode(ParallelExecutionMode.ForceParallelism) .Sum(i => ((Math.PI / x) * Math.Sin(Math.PI * i / x))); sw.Stop(); Console.WriteLine("With AsParallel(): {0}", sw.Elapsed); Console.WriteLine("Resul is: {0}", integral); Console.WriteLine(); } static void PartitionerFactorial(int x) { Stopwatch sw = new Stopwatch(); sw.Start(); double integral = Partitioner.Create(Enumerable.Range(0, x - 1)) .AsParallel() .WithDegreeOfParallelism(Environment.ProcessorCount) .WithExecutionMode(ParallelExecutionMode.ForceParallelism) .Sum(i => ((Math.PI / x) * Math.Sin(Math.PI * i / x))); Console.WriteLine("With Partitioner(): {0}", sw.Elapsed); Console.WriteLine("Resul is: {0}", integral); Console.WriteLine(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д