\documentclass{article}

\input{../common-preamble}
\input{../fancy-listings-preamble}
\input{../bmstu-preamble}

\begin{document}
\pagestyle{empty}
\makeBMSTUHeader

\makeReportTitle{лабораторной}{1}{Проектирование распределённых вычислений}{Распределённые информационные системы}{}{Локтев Д.А.}
\newpage
\tableofcontents
\newpage
\section{Результаты выполнения задания}
Задания выполнены с применением значений для варианта №11
\subsection{Сортировка}
В соответствии с вариантом, при выполнении задания по сортировке массива данных, использовались параметры настройки программы \code{ParaLab} представленные в таблице \hyperref[table:sorttask]{\ref{table:sorttask}}.

\begin{table}[H]
  \centering
  \begin{tabular}{||l|c||} 
    \hline
    Параметр & Значение \\  [0.5ex]
    \hline\hline
    Производительность процессоров(Gflops) & 1,0 \\
    Кол-во процессоров & 4 \\
    Метод сортировки & пузырьковая сортировка \\
    Топология сети & гиперкуб \\
    "Размер массива (нижний предел)" & 1000 \\
    "Размер массива (верхний предел)" & 3000 \\
    \hline
  \end{tabular}
  \caption{Параметры настройки программы \code{ParaLab} для сортировки массива данных}
  \label{table:sorttask}
\end{table}

Результаты выполнения задания представлены в таблице \hyperref[table:sortresult]{\ref{table:sortresult}}, а график зависимости времени сортировки от размера массива на рисунке \hyperref[pic:sortdiagram]{\ref{pic:sortdiagram}}.

\begin{table}[H]
  \centering
  \begin{tabular}{||c|c|c|c||} 
    \hline
    Размер массива данных & Время выполнения (мкс) & Из них на передачу данных (мкс) & Время в отчёте \code{ParaLab} \\  [0.5ex]
    \hline\hline
    1000 & 274,4514 & 270,96 & 365,27 \\
    1500 & 396,4165 & 390,96 & 527,49 \\
    2000 & 518,4429 & 510,96 & 689,76 \\
    2500 & 640,5148 & 630,96 & 852,08 \\
    3000 & 762,6231 & 750,96 & 1014,4 \\
    \hline
  \end{tabular}
  \caption{Результаты сортировки массива данных методом пузырьковой сортировки.}
  \label{table:sortresult}
\end{table}

\begin{figure}[H]
  \centering
  \begin{tikzpicture}
    \begin{axis}[
      xlabel={Количество элементов}, ylabel={Время выполнения},
      xmin=0, xmax=3500, ymin=0, ymax=1200,
      xtick={500, 1000, 1500, 2000, 2500, 3000, 3500},
      ytick={0,200,400,600,800,1000,1100},
      legend pos=north west, ymajorgrids=true, grid style=dashed,
      ]

      \addplot[ color=blue, mark=square, ]
      coordinates { (1000,274.4514)(1500,396.4165)(2000,518.4429)(2500,640.5148)(3000,762.6231) };
      \addplot[ color=red, mark=triangle, ]
      coordinates { (1000,270.96)(1500,390.96)(2000,510.96)(2500,630.96)(3000,750.96) };
      \addplot[ color=violet, mark=o, ]
      coordinates { (1000,365.27)(1500,527.49)(2000,689.76)(2500,852.08)(3000,1014.4) };
      \legend{Общее время, Передача данных, Отчёт приложения}
    \end{axis}
  \end{tikzpicture}
  \caption{Зависимость времени сортировки от размера массива}
  \label{pic:sortdiagram}
\end{figure}

\subsection{Умножение матриц}
В соответствии с вариантом, при выполнении задания по умножению матриц, использовались параметры настройки программы \code{ParaLab} представленные в таблице \hyperref[table:multiplytask]{\ref{table:multiplytask}}.

\begin{table}[H]
  \centering
  \begin{tabular}{||l|c||} 
    \hline
    Параметр & Значение \\   [0.5ex]
    \hline\hline
    Производительность процессоров(Gflops) & 1,0 \\
    Кол-во процессоров & 4 \\
    Топология сети & гиперкуб \\
    Объем исходных данных (нижний предел) & 200 \\
    Объем исходных данных (верхний предел) & 300 \\
    \hline
  \end{tabular}
  \caption{Параметры настройки программы \code{ParaLab} для умножения матриц}
  \label{table:multiplytask}
\end{table}

Настройка программы \code{ParaLab} для данного задания приводит к ошибке, связанной с тем, что ни один из алгоритмов умножения матриц не может быть реализован на топологии типа - Гиперкуб. Сообщения об ошибке представлено на рисунке \hyperref[pic:multiplyerror]{\ref{pic:multiplyerror}}.

\begin{figure}[H]
  \centering
  \includegraphics[height=2cm]{01-dis-rpt-plerr.png}
  \caption{Ошибка при настройке задачи умножения матриц}
  \label{pic:multiplyerror}
\end{figure}

Так как топология сети \textbf{Гиперкуб} не подходит для выполнения задачи, были исследованные остальные доступные топологии на предмет выполняемости условий задачи. Топология \textbf{Линейка} аналогично топологии \textbf{Гиперкуб} не может быть использована для выполнения задачи. Топологии \textbf{Кольцо} и \textbf{Полный граф} хотя и могут быть использованы, однако поддерживают только метод решения – \textbf{Ленточный алгоритм}, что недостаточно для решения задачи. Топология \textbf{Решетка} позволяет провести эксперименты для всех методов решения и была выбрана вместо топологии указанной в задаче.

Результаты выполнения задания представлены в таблице \hyperref[table:multiplylent]{\ref{table:multiplylent}}, а график временной зависимости времени сортировки от размера массива на рисунке \hyperref[pic:multiplydiagram]{\ref{pic:multiplydiagram}}.

\begin{table}[H]
  \centering
  \begin{tabular}{||l|c|c|c||}
    \hline
    Размерность матрицы & Алгоритм Фокса & Ленточный алгоритм & Алгорим Кэннона \\   [0.5ex]
    \hline\hline
    200 & 4430 & 823,6 & 5240 \\
    300 & 12180 & 1220,4 & 13990 \\
    \hline
  \end{tabular}
  \caption{Результаты матричного умножения}
  \label{table:multiplylent}
\end{table}

\begin{figure}[H]
  \centering
  \begin{tikzpicture}
    \begin{axis}[
      xlabel={Размерность матрицы}, ylabel={Время выполнения},
      xmin=-200, xmax=500, ymin=0, ymax=15000,
      xtick={-100, 0, 100, 200, 300, 400},
      ytick={0,3000,6000,9000,12000,15000},
      legend pos=north west, ymajorgrids=true, grid style=dashed,
      ]

      \addplot[ color=blue, mark=square, ]
      coordinates { (200,4430)(300,12180) };
      \addplot[ color=red, mark=triangle, ]
      coordinates { (200,823.6)(300,1220.4) };
      \addplot[ color=violet, mark=o, ]
      coordinates { (200,5240)(300,13990) };
      \legend{Ленточный алгоритм, Алгоритм Фокса, Алгоритм Кэннона}
    \end{axis}
  \end{tikzpicture}
  \caption{Временные зависимости для алгоритмов матричного умножения}
  \label{pic:multiplydiagram}
\end{figure}

\subsubsection{Сравнение алгоритмов}
Исходя из данных полученных в ходе выполнения задачи, можно сделать вывод, что время выполнения алгоритмов, основанных на ленточном разбиении матрицы ниже чем у алгоритмов, основанных на блочном разбиении.

\subsection{Работа с графами}
В соответствии с вариантом, при выполнении задания по работе с графами, использовались параметры настройки программы \code{ParaLab} представленные в таблице \hyperref[table:multiplytask]{\ref{table:multiplytask}}.

\begin{table}[H]
  \centering
  \begin{tabular}{||l|c||} 
    \hline
    Параметр & Значение \\   [0.5ex]
    \hline\hline
    Производительность процессоров(Gflops) & 1,0 \\
    Кол-во процессоров & 4 \\
    Топология сети & гиперкуб \\
    \hline
  \end{tabular}
  \caption{Параметры настройки программы \code{ParaLab} для работы с графами}
  \label{table:multiplytask}
\end{table}

Настройка программы \code{ParaLab} для данного задания приводит к ошибке, связанной с тем, что ни один из алгоритмов обработки графов не может быть реализован на топологии типа \textbf{Гиперкуб}. Сообщение об ошибке представлено на рисунке \hyperref[pic:grapherror]{\ref{pic:grapherror}}. Исходя из сообщения об ошибки, топология была изменена на \textbf{Полный Граф}.

\begin{figure}[h]
  \centering
  \includegraphics[height=3cm]{01-dis-rpt-plerr2.png}
  \caption{Ошибка при настройке задачи работы с графами}
  \label{pic:grapherror}
\end{figure}

Создать граф из четырёх вершн в соответствии с заданием не представляется возможным, поскольку значения для полного графа возможны только 1, 2, 5, 10, 20. Так случайным образом был сформирован граф с 10 вершинами. Схема графа представлена на рисунке \hyperref[pic:graph10edges]{\ref{pic:graph10edges}}.

\begin{figure}[H]
  \centering
  \includegraphics[height=6cm]{01-dis-rpt-plfg1.png}
  \caption{Сформированный программой \code{ParaLab} полный граф из 10 вершин}
  \label{pic:graph10edges}
\end{figure}

\subsubsection{Алгоритм Прима}
\label{subsubsection:algprim}
В ходе выполнения задания при настройке количество процессоров на 20 штук, была получена ошибка, в связи с чем расчеты с такой конфигурацией программы не проводились. Сообщение об ошибке представлено на рисунке \hyperref[pic:graphPerr]{\ref{pic:graphPerr}}.

\begin{figure}[H]
  \centering
  \includegraphics[height=3cm]{01-dis-rpt-plperr1.png}
  \caption{Ошибка выполнения вычислений программой на 20 процессорах}
  \label{pic:graphPerr}
\end{figure}

Результаты выполнения задания поиска минимального охватывающего дерева с использованием алгоритма Прима представлены в таблице \hyperref[table:prim]{\ref{table:prim}}. График временных зависимостей для задачи в зависимости от количества процессоров представлен на рисунке \hyperref[pic:primgraph]{\ref{pic:primgraph}}.

\begin{table}[H]
  \centering
  \begin{tabular}{||l|c||} 
    \hline
    Количество процессоров & Время выполнения (мкс) \\   [0.5ex]
    \hline\hline
    2 & 181,46 \\
    5 & 181,45 \\
    10 & 181,44 \\
    \hline
  \end{tabular}
  \caption{Результаты обработки графа алгоритмом Прима}
  \label{table:prim}
\end{table}

\begin{figure}[H]
  \centering
  \includegraphics[height=4cm]{01-dis-rpt-plprim1.png}
  \caption{Зависимость времени обработки графа от количества процессоров}
  \label{pic:primgraph}
\end{figure}

\subsubsection{Алгоритм Дейкстры}
В ходе выполнения задания, при настройке количество процессоров на 20 штук, была получена ошибка аналогичная ошибке в разделе \hyperref[subsubsection:algprim]{\ref{subsubsection:algprim}}.

Результаты выполнения задания поиска минимального охватывающего дерева с использованием алгоритма Дейкстры представлены в таблице 10. График временных зависимостей для задачи в зависимости от количества процессоров представлен на рисунке 11.

\begin{table}[H]
  \centering
  \begin{tabular}{||l|c||} 
    \hline
    Количество процессоров & Время выполнения (мкс) \\   [0.5ex]
    \hline\hline
    2 & 181,46 \\
    5 & 181,45 \\
    10 & 181,44 \\
    \hline
  \end{tabular}
  \caption{Результаты обработки графа алгоритмлм Дейкстры}
  \label{table:prim}
\end{table}

\begin{figure}[H]
  \centering
  \includegraphics[height=4cm]{01-dis-rpt-pldeix1.png}
  \caption{Зависимость времени обработки графа от количества процессоров}
  \label{pic:primgraph}
\end{figure}

\section{Контрольные вопросы}
\subsection{Описание алгоритма сортировки, в соответствии с вариантом, использованным в работе}
\textbf{Пузырьковая сортировка}. Алгоритм пузырьковой сортировки в прямом виде достаточно сложен для распараллеливания – сравнение пар значений упорядочиваемого набора данных происходит строго последовательно. В связи с этим для параллельного применения используется не сам этот алгоритм, а его модификация, известная в литературе как метод чёт-нечётной перестановки (odd-even transposition). Суть модификации состоит в том, что в алгоритм сортировки вводятся два разных правила выполнения итераций метода – в зависимости от чётности или нечётности номера итерации сортировки для обработки выбираются элементы с чётными или нечётными индексами соответственно, сравнение выделяемых значений всегда осуществляется с их правыми соседними элементами. Т.е., на всех нечётных итерациях сравниваются пары

\[
(a_1, a_2), (a_3, a_4), ..., (a_{n–1}, a_n)
\]

на четных итерациях обрабатываются элементы

\[
(a_2, a_3), (a_4, a_5), ..., (a_{n–2}, a_{n–1})
\]

После N-кратного повторения подобных итераций сортировки исходный набор данных оказывается упорядоченным.

Получение параллельного варианта для метода чет-нечетной перестановки уже не представляет каких-либо затруднений – сравнение пар значений на итерациях сортировки любого типа являются независимыми и могут быть выполнены параллельно.

\subsection{В чем состоит основное различие сортировки Шелла от пузырьковой сортировки?}
Основное различие состоит в том, что на первых итерациях алгоритма Шелла происходит сравнение пар элементов, которые в исходном наборе данных находятся далеко друг от друга (для упорядочивания таких пар в пузырьковой сортировке может понадобиться достаточно большое количество итераций).

\subsection{Описание метода умножения матрицы, в соответствии с вариантом, использованным в работе}
\subsubsection{Ленточный алгоритм}
При ленточной схеме разделения данных исходные матрицы разбиваются на горизонтальные (для матрицы A) и вертикальные (для матрицы B) полосы. Получаемые полосы распределяются по процессорам, при этом на каждом из имеющегося набора процессоров располагается только по одной полосе матриц A и B. Перемножение полос (данная операция может быть выполнена процессорами параллельно) приводит к получению части блоков результирующей матрицы C. Для вычисления оставшихся блоков матрицы C сочетания полос матриц A и B на процессорах изменяются. В наиболее простом виде это может быть обеспечено, например, при кольцевой топологии вычислительной сети, при числе процессоров, равном количеству полос. В этом случае необходимое для матричного умножения изменение положения данных может быть реализовано циклическим сдвигом полос матрицы B по кольцу. После многократного выполнения описанных действий (количество необходимых повторений является равным числу процессоров) на каждом процессоре получается набор блоков, образующий горизонтальную полосу матрицы C.

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

\subsubsection{Блочные алгоритмы Фокса и Кэннона}
При блочном представлении данных параллельная вычислительная схема матричного умножения в наиболее простом виде может быть построена, если топология вычислительной сети имеет вид прямоугольной решетки (если реальная топология сети имеет иной вид, например, гиперкуб, как это было необходимо согласно варианта, представление сети в виде решетки можно обеспечить на логическом уровне). Основные положения параллельных методов для блочно представленных матриц состоят в следующем:
\begin{enumerate}
\item каждый из процессоров решетки отвечает за вычисление одного блока матрицы C;
\item в ходе вычислений на каждом из процессоров располагается по одному блоку исходных матриц A и В;
\item при выполнении итераций алгоритмов блоки матрицы А последовательно сдвигаются вдоль строк процессорной решетки, а блоки матрицы B — вдоль столбцов решетки;
\item в результате вычислений на каждом из процессоров получается блок матрицы С, при этом общее количество итераций алгоритма равно числу процессоров.
\end{enumerate}

\subsection{Какие варианты топологии сети возможно использовать для пузырьковой сортировки массива?}
Для пузырьковой сортировки возможно использовать следующие топологии:
\begin{itemize}
\item линейка;
\item кольцо;
\item решетка;
\item гиперкуб;
\item полный граф.
\end{itemize}

\subsection{Перечислите топологии сети, их особенности. Какая сеть обладает наибольшей связанностью рабочих станций при одном и том же количестве станций?}
Основные используемые топологии сети следующие:
\begin{enumerate}
\item полный граф (completely-connected graph или clique) – система, в которой между любой парой процессоров существует прямая линия связи; как результат, данная топология обеспечивает минимальные затраты при передаче данных, однако является сложно реализуемой при большом количестве процессоров;
\item линейка (linear array или farm) – система, в которой каждый процессор имеет линии связи только с двумя соседними (с предыдущим и последующим) процессорами; такая схема является, с одной стороны, просто реализуемой, с другой стороны, соответствует структуре передачи данных при решении многих вычислительных задач (например, при организации конвейерных вычислений);
\item кольцо (ring) – данная топология получается из линейки процессоров соединением первого и последнего процессоров линейки;
\item решетка (mesh) – система, в которой граф линий связи образует прямоугольную двумерную сетку; подобная топология может быть достаточно просто реализована и, кроме того, может эффективно использоваться при параллельном выполнении многих численных алгоритмов (например, при реализации методов блочного умножения матриц);
\item гиперкуб (hypercube) – данная топология представляет частный случай структуры N-мерной решетки, когда по каждой размерности сетки имеется только два процессора. Так гиперкуб содержит 2N процессоров при размерности N.
\end{enumerate}

Полный граф обладает наибольшей связанностью при одном и том же количестве процессоров.

\section{Выводы}
Программный комплекс \code{ParaLab}, позволяет проводить как реальные параллельные вычисления на многопроцессорной вычислительной системе, так и имитировать такие эксперименты на одном последовательном компьютере, с визуализацией процесса решения сложной вычислительной задачи. Возможности комплекса позволили провести ряд имитационных экспериментов при различных настройках системы. В ходе выполнения работы не учитывались настройки и пропускная способность сетевого соединения между процессорами и были исследованы следующие алгоритмы:
\begin{enumerate}
\item сортировка Шелла;
\item ленточный алгоритм умножения матриц;
\item алгоритм Фокса;
\item алгоритм Кэннона;
\item алгоритм Прима;
\item алгоритм Дейкстры.
\end{enumerate}

Эффективность каждого алгоритма зависит от настроек системы, что говорит о том, для максимально продуктивного выполнения конкретной задачи, должен быть подобран не только правильный алгоритм, но и правильная аппаратно-программная архитектура, топология. Однако, алгоритмы, предназначенные для параллельных вычислений, могут существенно ускорить выполнение, поэтому параллельность, насмотря на сложности проектирования, является мощным инструментом решения сложных вычислительных задач.
\end{document}
