Commit 6eeac410 authored by Taddeüs Kroes's avatar Taddeüs Kroes

ModSim ass4 taddeus: Wrote 'Theorie' section of report.

parent 253c9703
\documentclass[10pt,a4paper]{article}
\usepackage[dutch]{babel}
\usepackage[utf8]{inputenc}
\usepackage{booktabs,graphicx,float,hyperref}
\usepackage{booktabs,graphicx,float,hyperref,amsmath}
% Paragraph indentation
\setlength{\parindent}{0pt}
......@@ -20,14 +20,145 @@
\section{Inleiding}
Het tweede deel van practicumopdracht 4 omhelst het programmeren van een
Het tweede deel van practicumopdracht 4 omhelst het simuleren van een
trillende snaar in een parallel programma. Hierbij wordt ook een sequëntieel
programma ontwikkeld, zodat de stijging in performance door parallellisatie kan
worden bepaald.
\section{Theorie}
\subsection{Simulatie}
De uitwijking van de snaar wordt gegeven als een functie van positie en tijd.
De bijbehordende differentiaalvergelijking is
$$\frac{\delta^2 y}{\delta t^2} = c^2 \frac{\delta^2 y}{\delta x^2}$$
De oplossing van deze vergelijking, $y(x, t)$, is de uitwijking van het punt
van de snaar op positie $x$ op een bepaald moment in de tijd $t$. Om een
computersimulatie te kunnen uitvoeren moet deze oplossing worden
gediscretiseerd. De formule hiervoor is gegeven in de opdracht:
$$y(x_i, t_j + \Delta t) = 2y(x_i, t_j) - y(x_i, t_j - \Delta t)
+ \tau^2(y(x_i - \Delta x, t_j) - 2y(x_i, t_j) + y(x_i + \Delta x, t_j))$$
Met:
$$\tau = \frac{c \Delta t}{\Delta x}$$
$\tau$ geeft de stabiliteit van de oplossing. In het document dat is
meegeleverd met de opdracht is bewezen dat de oplossing stabiel is als, en
alleen dan als $\tau \leq 1$.
\subsubsection*{Initialisatie}
Voor de begintoestand ($t = 0$) van de snaar zijn er twee toestanden
geïmplementeerd:
\begin{itemize}
\item Een sinusvorm: $y(x) = sin(n \pi \frac{x}{l})$. Hierbij is $n$ een
constante en $l$ is de lengte van de snaar.
\item Een snaar vastgegegrepen op positie $x_p$:
$$y(x) = \left\{ \begin{array}{ll}
\frac{x}{x_p} & (x < x_p) \\
\frac{l - x}{l - x_p} & (x > x_p) \\
\end{array} \right.$$
\end{itemize}
De gegeven formule berekent de toestand van een punt $x_i$ op de snaar op het
tijdstip $t_j + \Delta t$. Hiervoor zijn de vorige twee tijdstoestanden nodig
(op tijdstip $t_j$ en $t_j - \Delta t$). Bovenstaande initialisatiemethoden
berekenen alleen de toestand van de snaar op $t = 0$. Om de toestand op $t = 1$
te berekenen zijn volgens de gegeven formule de tooestand op $t = 0$ en op $t =
-1$ nodig. Omdat de toestand op $t = -1$ onbekend is, moet $y(x_i, 1)$ op een
andere manier worden berekend. Voor dit uitzonderingsgeval wordt gebruik
gemaakt van het feit dat de snaar op tijdstip $t = 0$ in rusttoestand is. Dit
betekent dat de toestand op tijdstip $t = -1$ gelijk is aan de toestand op
tijdstip $t = 1$. Met dit gegeven kan de formule als volgt worden beschreven
voor $t = 1$:
\begin{tabular}{rl}
$y(x_i, t_1)$ & $= 2y(x_i, t_0) - y(x_i, t_{-1})
+ \tau^2(y(x_i - \Delta x, t_j) - 2y(x_i, t_j) + y(x_i + \Delta x, t_j))$ \\
& $= 2y(x_i, t_0) - y(x_i, t_1)
+ \tau^2(y(x_i - \Delta x, t_j) - 2y(x_i, t_j) + y(x_i + \Delta x, t_j))$ \\
\end{tabular}
$$ 2y(x_i, t_1) = 2y(x_i, t_0)
+ \tau^2(y(x_i - \Delta x, t_j) - 2y(x_i, t_j) + y(x_i + \Delta x, t_j)) $$
$$y(x_i, t_1) = y(x_i, t_0) + \frac{1}{2}
\tau^2(y(x_i - \Delta x, t_j) - 2y(x_i, t_j) + y(x_i + \Delta x, t_j))$$
Deze formule heeft alleen de toestand op $t = 0$ nodig. In de implementatie
moet (alleen) voor het tijdstip $t = 1$ dus deze omgeschreven formule worden
gebruikt, in plaats van de gegeven formule.
\subsection{Parallellisatie}
Omdat voor de toestand van een punt op de snaar de vorige tijdtoestand nodig
is, zijn er weinig mogelijkheden om te parallelliseren in de tijddimensie.
Omdat deze afhankelijkheid er in de afstandsdimensie niet is (om de uitwijking
op een punt van de snaar te berekenen zijn immers alleen waarden uit de vorige
tijdstippen nodig), is ervoor gekozen om hierin te parallelliseren. Dit gebeurt
door het verdelen van de snaar in stukken van een grootte die proportioneel is
aan de verwerkingskracht van de bijbehorende ``node''. Omdat de computers die
in dit geval worden gebruikt hetzelfde zijn, kan de snaar in gelijke stukken
worden verdeeld. Elke node berekent voor zijn eigen snaargedeelte steeds de
volgende tijdstpestand voor elke positie op het gedeelte, waarbij tussen de
tijdstappen de meest linker- en rechter waardes worden opgehaald van de
``omliggende'' nodes.
Omdat slechts voor de twee randwaardes telkens hoeft te worden gecommuniceerd
tussen de nodes, zal de parallellisatie waarschijnlijk weinig overhead
opleveren. Vooral bij een kleine $\Delta x$ verwacht ik dat het parallelle
programma een merkbare performancewinst zal laten zien. Merk op dat tijdens de
communicatie moet worden gewacht op de randwaardes van de omliggende nodes, wat
ervoor kan zorgen dat een node korte tijd ``idle'' is.
\subsubsection*{Tijdstappen parallelliseren}
Bij wijze van gedachtenexperiment ben ik nagegaan of er in de tijdsdimensie ook
te parallelliseren is, en het viel mij op dat een vorm van ``pipelining'' te
implementeren zou zijn:
Op het moment dat de toestand op het punt $i$ tijdstip $j$ ($y(x_i, t_j)$) is
berekend, kan de volgende toestand ($y(x_i, t_{j + 1})$) pas worden berekend
wanneer $y(x_{i - 1}, t_j)$ en $y(x_{i + 1}, t_j)$ zijn berekend. De rest van
de posities zijn irrelevant, en hoeven dus ook niet te worden berekend voordat
$y(x_i, t_{j + 1})$ kan worden berekend. In berekeningsstappen is dit als volgt
uit te beelden:
\begin{table}[H]
\begin{tabular}{rc}
$\stackrel{\uparrow}{t}$ &
$
\left. \begin{array}{ccccc}
1 & 2 & 3 & 4 & \ldots \\
4 & 5 & 6 & \ldots & \ldots \\
6 & 7 & \ddots & \ldots & \ldots \\
8 & \vdots & \vdots & \ddots & \ldots \\
\vdots & \vdots & \vdots & \vdots & \ddots \\
\end{array} \right.
$ \\
& $x \rightarrow$ \\
\end{tabular}
\end{table}
We zien dat op het moment dat van de eerste toestand de derde waarde is
berekend, van de tweede toestand de eerste waarde kan worden berekend, etc..
Deze methode is moeilijk te implementeren en zal veel communicatie vergen
tussen de verschillende processen. Het is daarom niet verstandig om eerst in
de tijddimensie te parallelliseren. De genoemde eigenschappen zouden echter
wellicht wel kunnen worden gebruikt als uitbreiding op het verdelen van de
snaar in delen, bijvoorbeeld zou bij het wacthen op de randwaardes van
omliggende nodes al in het midden van het snaargedeelte kunnen worden begonnen
met doorrekenen (merk op dat het maximum aantal door te rekenen tijdsstappen in
dat geval een maximum heeft dat proportioneel is aan het aantal afstandsstappen
van het snaargedeelte).
\section{Implementatie}
\subsection{Sequentiëel}
\subsection{Parallel}
\subsection{Shell scripts}
\subsection{Gebruik}
......@@ -36,6 +167,19 @@ Het tweede deel van practicumopdracht 4 omhelst het programmeren van een
\section{Resultaten}
\subsection{Trillende snaar}
\subsubsection*{Parallellisatie}
\subsection{Performance}
\appendix
%\begin{figure}[H]
% \label{fig:sinus}
% \includegraphics[width=15cm]{sinus.pdf}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment