Вопрос по Курсу: "Параллельное программирование с использованием MS VisualStudia 2010". При компиляции Самостоятельного задания (одновременная отрисовка прямоугольников, эллипсов и выдача в текст-бокс случайного числа) среда предупреждает: suspend - устаревшая команда; примените monitor, mutex и т.п. Создаётся впечатление, что Задание создано в более поздней среде, чем VS 2010. |
Опубликован: 23.01.2013 | Уровень: для всех | Доступ: платный | ВУЗ: Томский политехнический университет
Самостоятельная работа 3:
Создание приложения с распараллеливанием данных
Аннотация: В рамках данного практического задания будет рассмотрен пример использования параллельных циклов Parallel.For и Parrallel.Foreach для распараллеливания данных.
Parallel.For
- Создадим консольное приложение и назовем его, к примеру, "ParallelForApplication":
- Создадим метод 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; } }
- В методе Main() создадим цикл, который будет передавать значения переменной i в метод Maxnumber:
for (int i = 1; i <= 10000000; i++) { Maxnumber(i); } Console.WriteLine("Максимальное число: {0} ",Max); Console.ReadLine();
- Запустим программу. В результате, через некоторое время, отобразиться результат:
Листинг кода программы:
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(); } }}
- Теперь для того, что бы посмотреть, сколько по времени отрабатывается метод 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();
- Запустим программу. В результате отобразиться следующее:
Примечание. Как видно из результата, время выполнения алгоритма составляет ~50 секунд.
- Подключим директиву, для того что бы использовать цикл Parallel.For:
using System.Threading.Tasks
- Теперь заменим цикл for на Parallel.For, для того, что бы метод Maxnumber, выполнялся не последовательно, а асинхронно:
Parallel.For(1, 10000000, i => { Maxnumber(i); });
- Запустим программу. В результате отобразится следующее:
Примечание. Как видно из результата выполнения программы, время выполнения распараллеленного метода 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(); } } }