Опубликован: 23.01.2013 | Уровень: для всех | Доступ: платный | ВУЗ: Томский политехнический университет
Самостоятельная работа 3:

Создание приложения с распараллеливанием данных

< Лекция 7 || Самостоятельная работа 3: 12 || Лекция 8 >
Аннотация: В рамках данного практического задания будет рассмотрен пример использования параллельных циклов Parallel.For и Parrallel.Foreach для распараллеливания данных.

Parallel.For

  1. Создадим консольное приложение и назовем его, к примеру, "ParallelForApplication":
  2. Создадим метод MaxNumber(), который бы находил максимальное случайно-сгенерированное число:
    static int Max=1;
            static void Maxnumber(int c)
            {
                Random rnd = new Random();
                int v = rnd.Next(0, c);
               
                if (Max < v)
                {
                    Max = v;
                }
            }
  3. В методе Main() создадим цикл, который будет передавать значения переменной i в метод Maxnumber:
    for (int i = 1; i <= 10000000; i++)
          {
              Maxnumber(i);
          }
          Console.WriteLine("Максимальное число: {0} ",Max);
          Console.ReadLine();
  4. Запустим программу. В результате, через некоторое время, отобразиться результат:

    Листинг кода программы:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace ParallelForApplication
    {
        class Program
        {
            static int Max=1;
            static void Maxnumber(int c)
            {
                Random rnd = new Random();
                int v = rnd.Next(0, c);
               
                if (Max < v)
                {
                    Max = v;
                }
           
            }
            static void Main(string[] args)
            {
               for (int i = 1; i <= 10000000; i++)
                {
                    Maxnumber(i);
                }
                Console.WriteLine("Максимальное число: {0} ",Max);
                Console.ReadLine();
            }
        }}
  5. Теперь для того, что бы посмотреть, сколько по времени отрабатывается метод Maxnumber(), добавим в код строчки:
    System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
          for (int i = 1; i <= 10000000; i++)
          {
              Maxnumber(i);
          }
          long elapsed = sw.ElapsedMilliseconds;
          Console.WriteLine("Время выполнения алгоритма в миллисекундах: {0}", elapsed);
          Console.WriteLine("Максимальное число: {0} ",Max);
          Console.ReadLine();
  6. Запустим программу. В результате отобразиться следующее:

    Примечание. Как видно из результата, время выполнения алгоритма составляет ~50 секунд.

  7. Подключим директиву, для того что бы использовать цикл Parallel.For:
    using System.Threading.Tasks
  8. Теперь заменим цикл for на Parallel.For, для того, что бы метод Maxnumber, выполнялся не последовательно, а асинхронно:
    Parallel.For(1, 10000000, i =>
          {
              Maxnumber(i);
          });
  9. Запустим программу. В результате отобразится следующее:

    Примечание. Как видно из результата выполнения программы, время выполнения распараллеленного метода Maxnumber(), составит приблизительно 31 секунду.

    Листинг кода программы:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace ParallelForApplication
    {
        class Program
        {
            static int Max=1;
            static void Maxnumber(int c)
            {
                Random rnd = new Random();
                int v = rnd.Next(0, c);
               
                if (Max < v)
                {
                    Max = v;
                }  
            }
            static void Main(string[] args)
            {
      
                System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
                Parallel.For(1, 10000000, i =>
                {
                    Maxnumber(i);
                });
                long elapsed = sw.ElapsedMilliseconds;
                Console.WriteLine("Время выполнения алгоритма в миллисекундах: {0}", elapsed);
                Console.WriteLine("Максимальное число: {0} ",Max);
                Console.ReadLine();
            }
        }
    }
< Лекция 7 || Самостоятельная работа 3: 12 || Лекция 8 >
Владимир Каширин
Владимир Каширин

Вопрос по Курсу: "Параллельное программирование с использованием MS VisualStudia 2010".

При компиляции Самостоятельного задания (одновременная отрисовка прямоугольников, эллипсов и выдача в текст-бокс случайного числа) среда предупреждает: suspend - устаревшая команда; примените monitor, mutex и т.п.

Создаётся впечатление, что Задание создано в более поздней среде, чем VS 2010.

Александр Гаврилов
Александр Гаврилов
Россия
Роман Дмитриев
Роман Дмитриев
Россия, Москва