ПКРПСиБД LAB5 Захаров А.Е. (Лабораторная работа 5)
Описание файла
Файл "ПКРПСиБД LAB5 Захаров А.Е." внутри архива находится в папке "Лабораторная работа 5". Документ из архива "Лабораторная работа 5", который расположен в категории "". Всё это находится в предмете "распределённые ис и базы данных" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "распределённые ис и базы данных" в общих файлах.
Онлайн просмотр документа "ПКРПСиБД LAB5 Захаров А.Е."
Текст из документа "ПКРПСиБД LAB5 Захаров А.Е."
Национальный Исследовательский Университет
МОСКОВСКИЙ ЭНЕРГЕТИЧЕСКИЙ ИНСТИТУТ
Институт автоматики и вычислительной техники
Кафедра прикладной математики
Лабораторная работа № 5
Реализация одного из шаблонов
параллельного программирования
Курс «Проектирование крупных распределенных программных систем и баз данных»
Выполнил
студент группы А-13-08
Захаров Антон
(8 вариант)
Преподаватель
к.т.н., доц. Куриленко Иван Евгеньевич
Цель работы
Научиться применять шаблоны параллельного программирования.
Порядок выполнения работы
-
С использованием одного из языков программирования из множества (C++, C#, Java) реализовать шаблон параллельного программирования «Ведущий / ведомый» (8 вариант).
-
Разработать UML модель.
Требования
-
Наличие работающей демонстрационной программы с исходным кодом.
-
Наличие UML-модели в электронном виде, иллюстрирующей шаблон, полученной с помощью специализированного диаграммера (Rational Enterprise Architect, Visual Paradigm, Visual Studio).
-
Наличие отчёта в печатном виде, содержащего теоретическое введение, UML-модель и исходный код.
Ведущий / ведомый
Шаблон параллельного программирования
Описание
Ведущий / ведомый (Leader / Follower) – шаблон параллельного программирования, применяющийся для распределения задач ведущим (Leader) по ведомым (Followers) компонентам и последующей сборки всех полученных результатов.
Уместность применения
Шаблон параллельного программирования «Ведущий / ведомый» уместно применять при распараллеливании любой задачи, требующей одной или нескольких точек сборки результатов. Классическими примерами подобных задач являются перемножение матриц, LU-разложение матриц, решение СЛАУ и т. п.
Преимущества, достигаемые при применении шаблона
-
Простота разработки и реализации.
-
Шаблон позволяет отлавливать факты ошибочного завершения работы отдельных параллельных ветвей программы и делать определённых шаги для корректного завершения работы программы, например, повторно запускать неудачно завершившуюся часть программы.
-
Кроме того, все ведомые компоненты реализуют один интерфейс и могут взаимодействовать только с ведущим, но не друг с другом, что препятствует возникновению многих ошибок.
Недостатки шаблона
-
Отсутствие способа обмена информацией между ведомыми компонентами зачастую существенно усложняет код.
Детали реализации
Шаблон реализуется следующим образом:
using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
namespace lab5
{
class Leader
{
static public int[][] matrixMultiplication(int[][] A, int[][] B)
{
Follower[][] followers = new Follower[A.Length][];
Thread[][] threads = new Thread[A.Length][];
for (int i = 0; i < A.Length; i++)
{
threads[i] = new Thread[A.Length];
followers[i] = new Follower[A.Length];
for (int j = 0; j < A.Length; j++)
{
followers[i][j] = new Follower(A[i], B[j]);
threads[i][j] = new Thread(new ThreadStart(followers[i][j].count));
threads[i][j].Start();
}
}
for (int i = 0; i < A.Length; i++)
for (int j = 0; j < A.Length; j++)
threads[i][j].Join();
int[][] result = new int[A.Length][];
for (int i = 0; i < A.Length; i++)
{
result[i] = new int[A.Length];
for (int j = 0; j < A.Length; j++)
result[i][j] = followers[i][j].result;
}
return result;
}
}
class Follower
{
public int result = 0;
private int[] A;
private int[] B;
public Follower(int[] A, int[] B)
{
this.A = A; this.B = B;
}
public void count()
{
for (int i = 0; i < A.Length; i++)
result += A[i] * B[i];
}
}
public partial class Form1 : Form
{
private System.Windows.Forms.TextBox[][] A = new System.Windows.Forms.TextBox[3][];
private System.Windows.Forms.TextBox[][] B = new System.Windows.Forms.TextBox[3][];
private System.Windows.Forms.TextBox[][] C = new System.Windows.Forms.TextBox[3][];
private int[][] Amatrix = new int[3][];
private int[][] Bmatrix = new int[3][];
private int[][] Cmatrix = new int[3][];
public Form1() {
InitializeComponent();
System.Drawing.Font font = new System.Drawing.Font("Microsoft Sans Serif", 12F,
System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((byte)(204)));
HorizontalAlignment center = System.Windows.Forms.HorizontalAlignment.Center;
System.Random rand = new System.Random();
for (int i = 0; i < 3; i++) {
A[i] = new System.Windows.Forms.TextBox[4];
Amatrix[i] = new int[4];
for (int j = 0; j < 4; j++) {
Amatrix[i][j] = rand.Next(0, 10);
A[i][j] = new System.Windows.Forms.TextBox();
A[i][j].Font = font;
A[i][j].Location = new System.Drawing.Point(40 + 54 * j, 45 + 30 * i);
A[i][j].Size = new System.Drawing.Size(50, 26);
A[i][j].Text = Amatrix[i][j].ToString();
A[i][j].TextAlign = center;
this.Controls.Add(A[i][j]);
}
}
for (int i = 0; i < 3; i++) {
B[i] = new System.Windows.Forms.TextBox[4];
Bmatrix[i] = new int[4];
for (int j = 0; j < 4; j++) {
Bmatrix[i][j] = rand.Next(0, 10);
B[i][j] = new System.Windows.Forms.TextBox();
B[i][j].Font = font;
B[i][j].Location = new System.Drawing.Point(300 + 54 * i, 30 + 30 * j);
B[i][j].Size = new System.Drawing.Size(50, 26);
B[i][j].Text = Bmatrix[i][j].ToString();
B[i][j].TextAlign = center;
this.Controls.Add(B[i][j]);
}
}
Cmatrix = Leader.matrixMultiplication(Amatrix, Bmatrix);
for (int i = 0; i < 3; i++) {
C[i] = new System.Windows.Forms.TextBox[3];
for (int j = 0; j < 3; j++) {
C[i][j] = new System.Windows.Forms.TextBox();
C[i][j].Font = font;
C[i][j].Location = new System.Drawing.Point(510 + 54 * j, 45 + 30 * i);
C[i][j].Size = new System.Drawing.Size(50, 26);
C[i][j].Text = Cmatrix[i][j].ToString();
C[i][j].TextAlign = center;
this.Controls.Add(C[i][j]);
}
}
}
}
}
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
-
Приёмы объектно-ориентированного проектирования. Паттерны проектирования. – СПб.: Питер, 2011. – 368 с.: ил.
-
PHP: объекты, шаблоны и методики программирования. 3-е изд.: Пер. с англ. – М. : ООО «И.Д. Вильямс», 2011. – 560 с. : ил. – Парал. тит. англ.
Москва, 2012