Опубликован: 15.10.2009 | Уровень: специалист | Доступ: платный
Лекция 3:

Планирование исполнения процессов

< Лекция 2 || Лекция 3: 12 || Лекция 4 >

Семинарское занятие № 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 и выявите возможные проблемы с производительностью этих приложений.

< Лекция 2 || Лекция 3: 12 || Лекция 4 >
Максим Полищук
Максим Полищук
"...Изучение и анализ примеров.
В и приведены описания и приложены исходные коды параллельных программ..."
Непонятно что такое - "В и приведены описания" и где именно приведены и приложены исходные коды.
Дмитрий Молокоедов
Дмитрий Молокоедов
Россия, Новосибирск, НГПУ, 2009
Паулус Шеетекела
Паулус Шеетекела
Россия, ТГТУ, 2010