Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы / Лабораторная работа 5 / ПКРПСиБД LAB5 Машеров Д.Е..docx
Скачиваний:
32
Добавлен:
28.06.2014
Размер:
302.12 Кб
Скачать

Национальный исследовательский институт

Московский Энергетический Институт (Технический Университет)

Институт автоматики и вычислительной техники

Кафедра Прикладной математики

Лабораторная работа №5

по дисциплине «Проектирование крупных распределенных программных систем и баз данных»

тема: «Реализация одного из шаблонов параллельного программирования»

Выполнил:

Машеров Д.Е.

Проверил:

к.т.н., доц. Куриленко И.Е.

Москва

2012 Г. Leaders/followers/Ведущий/ведомый

Категория: Шаблоны параллельного программирования

Описание

Ведущий / ведомый(Leader/Follower) – шаблон параллельного программирования, применяющийся для распределения задач ведущим (Leader) по ведомым (Followers) компонентам и последующей сборки всех полученных результатов..

Уместность применения

Шаблон параллельного программирования «Ведущий / ведомый» уместно применять при распараллеливании любой задачи, требующей одной или нескольких точек сборки результатов. Классическими примерами подобных задач являются перемножение матриц, LU-разложение матриц, решение СЛАУ и т. п.

Преимущества, достигаемые при применении шаблона

  1. Простота разработки и реализации.

  2. Шаблон позволяет отлавливать факты ошибочного завершения работы отдельных параллельных ветвей программы и делать определённых шаги для корректного завершения работы программы, например, повторно запускать неудачно завершившуюся часть программы.

  3. Кроме того, все ведомые компоненты реализуют один интерфейс и могут взаимодействовать только с ведущим, но не друг с другом, что препятствует возникновению многих ошибок.

Недостатки шаблона

  1. Отсутствие способа обмена информацией между ведомыми компонентами зачастую существенно усложняет код.

Детали реализации

Классы

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-диаграмма

Диаграмма классов:

Диаграмма последовательности

Литература

  1. 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