Преглед изворни кода

HW2: Report started

tags/v2.0
Christos Choutouridis пре 2 недеља
родитељ
комит
0b3d0a9219
3 измењених фајлова са 201 додато и 0 уклоњено
  1. +6
    -0
      homework_2/report/.gitignore
  2. BIN
      homework_2/report/homework_2_report.pdf
  3. +195
    -0
      homework_2/report/homework_2_report.tex

+ 6
- 0
homework_2/report/.gitignore Прегледај датотеку

@@ -0,0 +1,6 @@
# TeX auxiliary files
*.aux
*.log
*.out
*.synctex.gz


BIN
homework_2/report/homework_2_report.pdf Прегледај датотеку


+ 195
- 0
homework_2/report/homework_2_report.tex Прегледај датотеку

@@ -0,0 +1,195 @@
% !TEX TS-program = xelatex
% !TEX encoding = UTF-8 Unicode
% !TEX spellcheck = el-GR
%
% PDS homework_2 report
%
% Requires compilation with pdfLaTeX or XeLaTeX
%
% authors:
% Χρήστος Χουτουρίδης ΑΕΜ 8997
% cchoutou@ece.auth.gr

%
% Options:
%
% 1) mainlang=<language>
% Default: english
% Set the default language of the document which affects hyphenations,
% localization (section, dates, etc...)
%
% example: \documentclass[mainlang=greek]{AUThReport}
%
% 2) <language>
% Add hyphenation and typesetting support for other languages
% Currently supports: english, greek, german, frenc
%
% example: \documentclass[english, greek]{AUThReport}
%
% 3) short: Requests a shorter title for the document
% Default: no short
%
% example: \documentclass[short]{AUThReport}
%
\documentclass[a4paper, 11pt, mainlang=greek, english]{AUThReport}

\CurrentDate{\today}

% Document setup
%---------------------------------

% \WorkGroup{Ομάδα Χ}

\AuthorName{Χρήστος Χουτουρίδης}
\AuthorMail{cchoutou@ece.auth.gr}
\AuthorAEM{8997}

%\CoAuthorName{Όνομα Επίθετο}
%\CoAuthorAEM{AEM}
%\CoAuthorMail{xxx@ece.auth.gr}

\DocTitle{Εργασία 2: Distributed bitonic sort}
\DocSubTitle{Συστήματα κατανεμημένης μνήμης}

\Department{Τμήμα ΗΜΜΥ. Τομέας Ηλεκτρονικής}
\ClassName{Παράλληλα και Διανεμημένα Συστήματα}
%
\InstructorName{Νικόλαος Πιτσιάνης}
\InstructorMail{nikos.pitsianis@eng.auth.gr}

%\CoInstructorName{Όνομα Επίθετο}
%\CoInstructorMail{xxx@ece.auth.gr}


% Local package requirements
%---------------------------------

\usepackage{enumitem}
\usepackage{tabularx}
\usepackage{array}
\usepackage{float}
\usepackage{xcolor}

%\definecolor{red-highlight}{rgb}{1.0, 0.11, 0.0}
\definecolor{red-highlight}{rgb}{1.0, 0.31, 0.0}
\definecolor{green-highlight}{rgb}{0.0, 0.62, 0.42}

\newcommand{\bxred}[1]{\colorbox{red-highlight}{#1}}
\newcommand{\bxgreen}[1]{\colorbox{green-highlight}{#1}}

\newcommand{\tred}[1]{\textcolor{red-highlight}{\textbf{#1}}}
\newcommand{\tgreen}[1]{\textcolor{green-highlight}{\textbf{#1}}}

% “virtual” cites
% ----------------------------------------
\newcommand{\citeKnuthACM}{%
Donald E. Knuth, \emph{Structured Programming with go to Statements}, ACM Computing Surveys, vol. 6, no. 4, 1974
}


\begin{document}

\InsertTitle

%\tableofcontents


\section{Εισαγωγή}

Η παρούσα εργασία αφορά τον παραλληλισμό συστημάτων με κατανεμημένη μνήμη και το μοντέλο μεταβίβασης μηνυμάτων (MPI).
Το αντικείμενο με το οποίο ασχολούμαστε είναι ο αλγόριθμος ταξινόμησης \textbf{bitonic sort}, το οποίο έχουμε κατανέμει σε διαδικασίες που τρέχουνε σε διαφορετικούς υπολογιστές.
Με αυτό τον τρόπο, κάθε διαδικασία έχει ένα μέρος των δεδομένων και τη θέση (διεύθυνση) που πρόκειται να ταξινομηθούν και ανταλλάσει δεδομένα με τις υπόλοιπες διαδικασίες.
Αν και η συνήθης μορφή του αλγορίθμου είναι αναδρομική, στην παρούσα εργασία έχουμε ανοίξει την αναδρομή σε βρόχο επανάληψης.
Ο βρόχος δημιουργεί το δίκτυο ταξινόμησης, όπου σε κάθε στάδιο οι διαδικασίες ανταλλάσουν δεδομένα με έναν, δύο, τέσσερις και ούτω καθεξής γείτονες, των οποίων οι διευθύνσεις διαφέρουν κατά hamming distance ίση με $1, 2, 4$ και ούτω καθεξής.
Με άλλα λόγια ακολουθούν τις ακμές ενός υπερκύβου αντίστοιχης διάστασης με την δυαδική τάξη μεγέθους των διαδικασιών.

\section{Παραδοτέα}
Τα παραδοτέα της εργασίας αποτελούνται από:
\begin{itemize}
\item Την παρούσα αναφορά.
\item Το \href{https://git.hoo2.net/hoo2/PDS/src/branch/master/homework_2}{σύνδεσμο με το αποθετήριο} που περιέχει τον κώδικα για την παραγωγή των εκτελέσιμων, της αναφοράς και τις μετρήσεις.
\end{itemize}

\section {Υλοποίηση}
Πριν ξεκινήσουμε με τις λεπτομέρειες του αλγόριθμου και της υλοποίησης καλό θα ήταν να περιγράψουμε τις βασικές συναρτήσεις και δομές δεδομένων που χρησιμοποιούνται στην εργασία, ώστε να βοηθήσουμε στην καλύτερη κατανόηση της υλοποίησης.
\begin{itemize}
\item \texttt{\textbf{distBitonic()}}:
Πρόκειται για την βασική συνάρτηση που υλοποιεί τον αλγόριθμο της εργασίας.
\item \texttt{\textbf{distBubbletonic()}}:
Πρόκειται για την βασική συνάρτηση που υλοποιεί τον αλγόριθμο της έκδοσης \textbf{v0.5}.
Ο αναγνώστης μπορεί να πειραματιστεί με αυτή την έκδοση καθώς υπάρχουν make rules, αλλά δεν κρύβει κάποιον “άσο στο μανίκι”, καθώς η βελτιστοποίηση έγινε με γνώμονα την \textit{distBitonic()}.
\item \texttt{\textbf{MPI\_t}}:
Ο τύπος αυτός δημιουργεί ένα επίπεδο αφαίρεσης γύρω από την MPI επικοινωνία, αρχικοποίηση και διαχείριση πόρων.
Κάθε αντικείμενο αυτού του τύπου μπορεί να διαχειριστεί σύγχρονη ή ασύγχρονη επικοινωνία.
Σε περίπτωση που παρουσιαστεί σφάλμα στην επικοινωνία, η εκτέλεση του προγράμματος τερματίζεται με κατάλληλη διαχείριση των πόρων του MPI.
\item \texttt{\textbf{ShadowedVec\_t}}:
Ο τύπος αυτός προσφέρει το interface ενός \textbf{std::vector}, ενώ εσωτερικά περικλείει δύο.
Ένα \textbf{ενεργό} και ένα ως \textbf{σκιά} του ενεργού.
Ο λόγος είναι για να προσφέρει εναλλακτικό χώρο αποθήκευσης για τα εισερχόμενα δεδομένα κατά την ανταλλαγή στην MPI επικοινωνία, αλλά και για τον αλγόριθμο ταξινόμησης elbow-sort, ο οποίος δεν μπορεί να λειτουργήσει \textit{“in-place”} καθώς χρειάζεται ξεχωριστό πίνακα προορισμού.
Με την αφαίρεση αυτή προσφέρουμε ένα κοινό interface που καλύπτει και τις δύο περιπτώσεις.
\item \texttt{\textbf{Timing}}:
Η τάξη αυτή προσφέρει δυνατότητες χρονομέτρησης μίας ή και πολλαπλών κλήσεων αθροίζοντας τους χρόνους.
\end{itemize}

\subsection{Model version}
Η πρώτη έκδοση του αλγόριθμου ήταν μια ένα-προς-ένα αντιστοιχία με το μοντέλο που δημιουργήθηκε στη julia.
Στην έκδοση αυτή όλες οι επικοινωνίες γίνονται με τις blocking εκδόσεις του MPI.
Τα βασικά βήματα αυτής της έκδοσης για κάθε μία MPI διαδικασία είναι:
\begin{itemize}
\item Ταξινόμηση των δεδομένων τοπικά χρησιμοποιώντας κάποιον “ακριβό” αλγόριθμο.
\item Ανταλλαγή όλων των δεδομένων με την διαδικασία - εταίρο (blocking).
\item Διαχωρισμός ελαχίστων -- μεγίστων, όπου η διαδικασία κρατάει τα μεν ή τα δε.
\item Ταξινόμηση με την elbow-sort.
\end{itemize}
Έτσι σε κάθε επανάληψη του βρόχου η κάθε MPI διαδικασία ανταλλάσει \textbf{όλα} τα δεδομένα με τον εταίρο της και \textbf{αφού} τελειώσει η επικοινωνία, \textbf{τότε} εκτελείται ο διαχωρισμός και η ταξινόμηση.
Προφανώς και μόνο από τη διατύπωση της προηγούμενης πρότασης κάποιος θα σκεφτόταν ότι υπάρχουν τόσες ευκαιρίες να κάνουμε τα πράγματα καλύτερα.
Να μειώσουμε τις επικοινωνίες, να τις κάνουμε ασύγχρονες, κλπ...
Παραθέτοντας τον Donald E. Knuth\footnote{\citeKnuthACM} που αναφέρει πως: \textit{“premature optimization is the root of all evil”}, θα πρέπει να τονίσουμε πως για να επιλέξουμε τι από όλα πρέπει να βελτιστοποιήσουμε, πρέπει πρώτα να μετρήσουμε.
\par
Αρχικά λοιπόν, αναλύσαμε την εκτέλεση του προγράμματος τοπικά με 4 MPI tasks χρησιμοποιώντας το perf, το οποίο έδειξε ότι όσο μεγάλωνε το μέγεθος των δεδομένων τόσο ο \textbf{κυρίαρχος παράγοντας γινόταν η full sort}.
Για την ακρίβεια:
\begin{table}[H]
\centering
\renewcommand{\arraystretch}{1.25}
\begin{tabular}{r | c c c c c c}
& Full Sort & Elbow Sort & MPI-exchange & Min-Max & Data Gen & Data Alloc \\ \hline
q=20 & 33.67\% & 9.07\% & 1.96\% & <0.5\% & 2.96\% & 1.1\% \\
q=26 & \tred{67.21\%} & 13.63\% & 4.63\% & 2.05\% & 5.2\% & 1.74\% \\
\end{tabular}
% \caption{Ποσοστό επί της συνολικής εκτέλεσης της κάθε MPI διεργασίας.}
\end{table}
\par
Για να υποστηρίξουμε τα παραπάνω δεδομένα χρησιμοποιήσαμε και την συστοιχία batch.
Για την ακρίβεια μετρήσαμε τόσο για $q=20$, όσο και για $q=27$, με 4 διεργασίες σε διάταξη 1node:4process και 4nodes:1process.
\begin{table}[H]
\centering
\renewcommand{\arraystretch}{1.25}
\begin{tabular}{r | c c c c c}
& Total & Full Sort & Elbow Sort & MPI-exchange & Min-Max \\ \hline
N1P4 - q=20 & 138 ms & 94 ms & 26 ms & 14.5 ms & 2.54 ms \\
N1P4 - q=27 & 20 s & \tred{15.5 s} & 3.44 s & \tred{750.5 ms} & 425.3 ms \\
N4P1 - q=20 & 151.7 ms & 93.3 ms & 26 ms & 29.7 ms & 1.56 ms \\
N4P1 - q=27 & 20 s & \tred{15.5 s} & 3.43 s & \tgreen{531.3 ms} & 336.3 ms \\
\end{tabular}
% \caption{Χρόνος εκτέλεσης για την κάθε λειτουργία του αλγόριθμου.}
\end{table}
\par
Τα παραπάνω δεδομένα επιβεβαιώνουν πως ο κυρίαρχος παράγοντας είναι η full sort που είναι $O(nlog(n))$, σε σχέση με όλα τα υπόλοιπα που είναι $O(n)$.
Συμπεραίνουμε λοιπόν πως η αρχική “ακριβή” ταξινόμηση είναι πρακτικά το πρώτο πράγμα που πρέπει να βελτιστοποιήσουμε.
Ακόμα τα δεδομένα φαίνεται να υποστηρίζουν πως η ανταλλαγή δεδομένων δεν επηρεάζεται τόσο από το αν οι διεργασίες επικοινωνούν σε κοινή μνήμη ή μέσω δικτύου.
Το γεγονός ότι η συστοιχία “rome” έχει ακόμα γρηγορότερο interface δικτύου υποστηρίζει αυτή την υπόθεση.

\subsection{Παραλληλοποίηση της full sort}
Για την αρχική ταξινόμηση έχουμε χρησιμοποιήσει τη συνάρτηση βιβλιοθήκης std::sort(), η οποία χρησιμοποιεί την \textbf{introsort}.
Μια υβριδική υλοποίηση quick-heap-insertion sort που εγγυάται $O(nlog(n))$ ακόμα και ως worst case.
Για να τη βελτιστοποιήσουμε λοιπόν, απλώς την κάναμε παράλληλη.
Θεωρώντας ότι η παραλληλοποίηση σε κοινή μνήμη δεν είναι το κύριο μέλημα της παρούσας εργασίας, απλώς χρησιμοποιήσαμε την openmp έκδοση της βιβλιοθήκης \textit{\_\_gnu\_parallel::sort()}.
\par
Με αυτή την αλλαγή και χρησιμοποιόντας 4 threads ανά MPI process, οι χρόνοι για το \boldmath $q=27$ πέσαν στην batch περίπου στα $4 sec$ ρίχνοντας έτσι και το συνολικό χρόνο περίπου στα $7.5 sec$. \unboldmath
Με αυτό τον τρόπο μπορούμε να πάρουμε όση επιτάχυνση θέλουμε επιλέγοντας απλά αριθμό threads ανά MPI process.
Ο περιοριστικός παράγοντας είναι οι πόροι που πρέπει να καταναλώσουμε στην συστοιχία για τις τελικές μετρήσεις.
Με βάση τα παραπάνω, τα \textbf{4 threads} φαίνεται ένα καλό νούμερο, καθώς δεν αυξάνει πολύ τους πόρους και ταυτόχρονα προσφέρει μια ισορροπία μεταξύ της fullsort και του υπόλοιπου αλγόριθμου.

\subsection{Βελτιστοποίηση του MPI}

\end{document}

Loading…
Откажи
Сачувај