Commit 2ed3ac6e authored by Taddeüs Kroes's avatar Taddeüs Kroes

ModSim ass4 taddeus: Worked on report.

parent cf1d3eef
......@@ -4,7 +4,7 @@
#include <math.h>
#include <mpi.h>
//#define VERBOSE
#define VERBOSE
double **y = NULL;
int tasks, rank, steps, start;
......@@ -95,14 +95,12 @@ void print(int index) {
* number of time steps.
*/
void calculate_steps(int time, double dx, double tau) {
double x;
int i, t, prev = 0, current = 1, next = 2,
s = rank ? 1 : 2, e = rank == tasks - 1 ? steps - 1 : steps;
// Calculate the position over the entire string at time dt using the
// position at t = 0 and the information that y(x, -dt) == y(x, dt)
for( i = s; i <= e; i++ ) {
x = i * dx;
y[current][i] = y[0][i] + .5 * tau * tau * (y[0][i - 1] - 2 * y[0][i]
+ y[0][i + 1]);
}
......
#!/usr/bin/env python
from sys import argv
from pylab import plot, xlabel, ylabel, show, savefig
from pylab import plot, xlabel, ylabel, show, savefig, ylim
from scipy import polyfit, polyval
# Collect data
......@@ -31,6 +31,7 @@ fit = polyval(c, x)
plot(x, y, 'x')
plot(x, fit, '-')
plot(seq[0], seq[1], 'x')
ylim(ymin=0)
xlabel('Aantal processen')
ylabel('Tijd (s)')
if len(argv) > 1:
......
1 9.67
1 9.67
1 9.69
1 9.69
1 9.69
1 10.84
2 5.83
2 5.86
2 5.81
2 5.81
2 5.81
2 5.78
2 5.78
3 4.38
3 4.35
3 4.38
3 4.36
3 4.40
3 4.37
4 4.00
4 3.67
4 3.72
4 3.65
4 3.68
5 3.60
5 3.24
5 3.46
5 3.24
6 4.10
6 3.55
6 3.18
6 3.44
7 3.09
7 2.99
7 3.18
7 3.18
8 3.73
8 3.00
4 3.66
4 3.66
5 3.47
5 3.87
5 3.65
5 3.26
6 3.59
6 3.56
6 3.38
6 3.21
7 3.05
7 3.21
7 3.24
7 3.02
8 2.68
8 2.86
8 3.24
8 2.67
8 2.85
9 3.25
9 2.76
9 2.76
9 2.56
10 2.74
10 3.51
10 2.88
10 3.68
11 3.05
11 3.65
11 3.43
11 3.03
12 3.66
12 2.58
12 3.19
12 2.57
13 3.47
13 3.94
13 2.36
13 3.54
9 3.38
9 2.57
9 2.96
9 2.75
10 3.50
10 3.08
10 3.11
10 3.09
11 2.85
11 2.63
11 3.85
11 2.89
12 2.74
12 3.20
12 4.01
12 2.80
13 3.19
13 3.03
13 3.14
13 3.15
\documentclass[10pt,a4paper]{article}
\usepackage[dutch]{babel}
\usepackage[utf8]{inputenc}
\usepackage{booktabs,graphicx,float,hyperref,amsmath}
\usepackage{booktabs,graphicx,float,hyperref,amsmath,listings}
% Paragraph indentation
\setlength{\parindent}{0pt}
......@@ -364,13 +364,57 @@ geconcludeerd dat ook het parallelle programma correct is geïmplementeerd..
\subsection{Performance}
\subsubsection*{Testomgeving}
Alle tijdmetingen worden uitgevoerd door het script \emph{benchmark.sh}. Omdat
het programma is geparallelliseerd in de afstandsdimensie, is de enige
variabele het aantal te berekenen afstandsstappen (\texttt{STRING\_STEPS}). We
kiezen $l = 1.0$, zodat $dx = \frac{1.0}{\texttt{STRING\_STEPS}}$. De rest van
de parameters zijn als volgt gekozen: $tijdstappen = 10000, \tau = 1$ en
$n = 2$.
Ondanks de aanwezigheid van dualcore-machines wordt elk proces op een
afzonderlijke machine uitgevoerd. Hierdoor is de communicatie altijd tussen
aparte machines, en niet binnen dezelfde machine (wat de latency zou verlagen).
Elke tijdmeting wordt vier maal uitgevoerd, waarna de laagste waarde wordt
gebruikt. De laagste waarde is interessanter dan de gemiddelde waarde, omdat
bij de laagste waarde de ``idle time'' van een proces het kleinst is We zijn
immers alleen geïnteresseerd in de tijd die een proces daadwerkelijjk aan het
rekenen is.
\subsubsection*{Speedup}
De benchmark wordt uitgevoerd met een vast aantal afstandsstappen. Indien dit
aantal te klein is zal de communicatie in het parallelle programma veel
overhead opleveren. Figuur \ref{fig:benchmark} toont het resultaat voor 50000
stappen\footnote{Zie bijlage \ref{app:benchmark} voor de precieze metingen},
waarbij een zichtbare speedup is in het parallelle programma. Een Least Squares
fit laat een minimum zien bij 9-10 processen. Dit betekent dat het programma
het meest efficiënt wordt uitgevoerd met 9 tot 10 processen. De kleinste meting
is gedaan bij 9 processen, de speedup bij dit aantal is $\frac{9.67}{2.57} =
3.76$ ten opzichte van het sequentële programma.
\begin{figure}[H]
\includegraphics[width=10cm]{benchmark.pdf}
\caption{Runtime met parameters \texttt{sinus 10000 1 .00002 1 2}.}
\label{fig:benchmark}
\includegraphics[width=13cm]{benchmark.pdf}
\caption{Runtime met parameters \texttt{sinus 10000 1 .00002 1 2}. De
blauwe punten zijn de metingen van het parallelle programma, de
groene lijn is een Least Squares datafit van die metingen. Het
rode punt linksboven is het resultaat van het sequentiële
programma.}
\end{figure}
\subsubsection*{Overhead communicatie}
Zoals al eerder gezegd is het waarschijnlijk dat bij een klein aantal
afstandsstappen het parallelle programma langzamer zal zijn dan het
sequentiële programma, door overhead van de communicatie. Omdat het parallelle
programma bij de benchmark het snelst is met 9 processen, zullen we vergelijken
wanneer het sequentiële programma voordeel heeft t.o.v. 9 parallelle processen.
%TODO: add graph
\pagebreak
\appendix
......@@ -400,4 +444,9 @@ geconcludeerd dat ook het parallelle programma correct is geïmplementeerd..
\caption{Resultaten met parameters \texttt{plucked 2000 1 .001 1 .3}.}
\end{figure}
\section{Uitvoer benchmarkscript}
\label{app:benchmark}
\lstinputlisting{bench.txt}
\end{document}
......@@ -3,7 +3,7 @@
#include <string.h>
#include <math.h>
//#define VERBOSE
#define VERBOSE
double **y = NULL, dx;
int steps, time;
......@@ -66,7 +66,6 @@ void calculate_steps(int time, double tau) {
// Calculate the position over the entire string at time dt using the
// position at t = 0 and the information that y(x, -dt) == y(x, dt)
for( i = 1; i < steps - 1; i++ ) {
x = i * dx;
y[1][i] = y[0][i] + .5 * tau * tau * (y[0][i - 1] - 2 * y[0][i]
+ y[0][i + 1]);
}
......
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