
Национальный исследовательский институт
Московский Энергетический Институт (Технический Университет)
Институт автоматики и вычислительной техники
Кафедра Прикладной математики
Лабораторная работа №5
по дисциплине «Проектирование крупных распределенных программных систем и баз данных»
тема: «Реализация одного из шаблонов параллельного программирования»
Выполнил:
Машеров Д.Е.
Проверил:
к.т.н., доц. Куриленко И.Е.
Москва
2012 Г. Leaders/followers/Ведущий/ведомый
Категория: Шаблоны параллельного программирования
Описание
Ведущий / ведомый(Leader/Follower) – шаблон параллельного программирования, применяющийся для распределения задач ведущим (Leader) по ведомым (Followers) компонентам и последующей сборки всех полученных результатов..
Уместность применения
Шаблон параллельного программирования «Ведущий / ведомый» уместно применять при распараллеливании любой задачи, требующей одной или нескольких точек сборки результатов. Классическими примерами подобных задач являются перемножение матриц, LU-разложение матриц, решение СЛАУ и т. п.
Преимущества, достигаемые при применении шаблона
Простота разработки и реализации.
Шаблон позволяет отлавливать факты ошибочного завершения работы отдельных параллельных ветвей программы и делать определённых шаги для корректного завершения работы программы, например, повторно запускать неудачно завершившуюся часть программы.
Кроме того, все ведомые компоненты реализуют один интерфейс и могут взаимодействовать только с ведущим, но не друг с другом, что препятствует возникновению многих ошибок.
Недостатки шаблона
Отсутствие способа обмена информацией между ведомыми компонентами зачастую существенно усложняет код.
Детали реализации
Классы
class Leader
{
double[] Result;
public double[] Multiplication(double[] Matrix, double[] Vector)
{
int size = (int)Math.Sqrt(Matrix.Count());
int mid = size / 2;
Follower f1 = new Follower(Matrix, Vector, 0, mid);
Follower f2 = new Follower(Matrix, Vector, mid, size);
Thread t1 = new Thread(new ThreadStart(f1.Multiplication));
Thread t2 = new Thread(new ThreadStart(f2.Multiplication));
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Result = new double[size];
f1.Result.CopyTo(Result, 0);
f2.Result.CopyTo(Result, mid);
return Result; // combine results
}
}
class Follower
{
double[] Matrix;
double[] Vector;
double[] result;
int start,end;
public Follower(double[] Matrix, double[] Vector, int start, int end)
{
this.Matrix = Matrix;
this.Vector = Vector;
result = new double[end - start];
this.start = start;
this.end = end;
}
public void Multiplication()
{
int size = (int)Math.Sqrt(Matrix.Count());
for (int i = start; i < end; i++)
{
for (int j = 0; j < size; j++)
{
result[i - start] += Matrix[i*size + j] * Vector[j];
}
}
}
public double[] Result
{ get { return result; }
}
}
Программа:
static void Main(string[] args)
{
double[] Matrix = { 3, 4, 5,
1, 2,3,
9, 10, 11};
double[] Vector = { 1, 2, 3 };
double[] Result = new Leader().Multiplication(Matrix, Vector);
foreach(int e in Result)
Console.WriteLine(e);
Console.Read();
}
UML-диаграмма
Диаграмма классов:
Диаграмма последовательности
Литература
Leader/Followers. A Design Pattern for Efficient Multi-threaded I/O Demultiplexing and Dispatching. Douglas C. Schmidt, Carlos O’Ryan. Electrical and Computer Engineering Dept. University of California, Irvine, CA 92697, USA
http://www.kircher-schwanninger.de/michael/publications/lf.pdf