"...Изучение и анализ примеров.
В и приведены описания и приложены исходные коды параллельных программ..." Непонятно что такое - "В и приведены описания" и где именно приведены и приложены исходные коды. |
Планирование исполнения процессов
Семинарское занятие № 3. Пользовательские расширения Parallel.For
Конструкция Parallel.For, реализованная в PFX, является, по сути, параллельным аналогом последовательного цикла for перебора в некотором диапазоне чисел. Однако, конструкция цикла for в языке C# не ограничена только перебором чисел из определенного диапазона - она также поддерживает произвольные выражения для инициализации цикла, условия окончания и обновления индекса:
for(var i = init(); cond(i); i = upd(i)) { Use(i); }
В PFX, однако, отсутствуют аналоги подобного for -цикла. Вместе с тем основной идеей, заложенной в PFX, было создание базовых конструкций, которые могли бы расширяться пользователями под их собственные задачи. Пример с циклом for позволяет продемонстрировать это. Рассмотрим следующий код:
public static void ParallelFor<T> ( Func<T> init, Func<T,bool> cond, Func<T,T> upd, Action<T> body) { Parallel.ForEach(Iterate(init, cond, upd), body); } private static IEnumerable<T> Iterate<T> ( Func<T> init, Func<T,bool> cond, Func<T,T> upd) { for(var i=init(); cond(i); i = upd(i)) yield return i; }
Можно видеть, что здесь создана некоторая версия конструкции Parallel.For, которая поддерживает произвольные выражения для инициализации цикла, условия окончания и обновления индекса. Другими словами, здесь представлена параллельная версия C#-итератора.
Приведем пример использования новой конструкции. Допустим нам дан список узлов, который мы хотим обработать. Последовательная версия обработки может выглядеть следующим образом:
for(Node n = list; n != null; n = n.Next) { Process(n); }
Параллельная версия на основе введенной нами выше конструкции выглядит так:
ParallelFor(() => list, n => n != null, n => n.Next, n => { Process(n); });
Изучение и анализ примеров
В "Оценка производительности памяти с помощью теста Random Access" и "Параллельный алгоритм дискретного преобразования Фурье" приведены описания и приложены исходные коды параллельных программ быстрого преобразования Фурье (БПФ) и теста RandomAccess. Рассмотрите применение в них конструкций Paralell.For, а также возможность их замены на более высокоуровневые аналоги по типу тех, которые описаны в разделе 1 данного семинарского занятия. Кроме того, посредством запуска этих примеров на различном количестве процессоров, оцените эффективность данных реализаций БПФ и RandomAccess и выявите возможные проблемы с производительностью этих приложений.