Refresh the report and better commenting

This commit is contained in:
2024-11-21 22:56:37 +02:00
parent 381a5737db
commit 955981d177
15 changed files with 110 additions and 107 deletions
Binary file not shown.
+46 -16
View File
@@ -67,8 +67,8 @@
Στην παρούσα εργασία γίνεται ευρεία χρήση πινάκων τόσο για εισαγωγή και εξαγωγή των δεδομένων, όσο και για τους υπολογισμούς.
Για το λόγο αυτό θεωρήσαμε ότι έπρεπε πρώτα να υλοποιήσουμε κάποιες αφαιρέσεις που θα μας επέτρεπαν να χειριστούμε ευκολότερα το πρόβλημα
\subsection{Ο τύπος Matrix}
Η πιο βασική αφαίρεση που υλοποιήσαμε είναι ο τύπος \textbf{Matrix}.
\subsection{Ο τύπος Matrix<>}
Η πιο βασική αφαίρεση που υλοποιήσαμε είναι ο τύπος \textbf{Matrix<>}.
Πρόκειται για μια αναπαράσταση πινάκων, είτε μονοδιάστατων είτε δισδιάστατων.
Η υλοποίησή του έγινε με χρήση templates και έτσι μπορούμε να κατασκευάζουμε πίνακες οποιουδήποτε τύπου.
Η αφαίρεση εσωτερικά κάνει χρίση μονοδιάστατης αποθήκευσης των δεδομένων με αποτέλεσμα να έχουμε την δυνατότητα να διαλέγουμε εμείς το ordering του πίνακα.
@@ -125,7 +125,7 @@ o \textbf{vA}, είναι ένα \textit{slice} του A, που δείχνει
Το κάθε Corpus με τα δύο διαφορετικά Queries και το κάθε Query αντίστοιχα.
Έπειτα συνενώναμε τα αποτελέσματα.
Αν και αυτή η προσέγγιση ήταν η ακριβείς μας έδινε όμως τη δυνατότητα να “φτηνύνουμε” τον τρόπο με τον οποίο ενώναμε τα αποτελέσματα.
Επίσης για την περίπτωση που το Queryήταν ίδιο με το Corpus, μας προσφέρεται η δυνατότητα να αποφύγουμε έναν από τους 4 συνδυασμούς.
Επίσης για την περίπτωση που το Query ήταν ίδιο με το Corpus, μας προσφέρεται η δυνατότητα να αποφύγουμε έναν από τους 4 συνδυασμούς.
\par
Η προσέγγιση αυτή, αν και απλή, δεν βολεύει για παραλληλοποίηση, καθώς τα νήματα που πρέπει να δημιουργηθούν βρίσκονται μέσα στην αναδρομή, καθιστώντας δύσχρηστη(όχι αδύνατη) τη χρήση των εργαλείων της cilk και της openMP.
Ακόμα και το “μέρος” στο οποίο θα έμπαινε η loop-α με τις join για την περίπτωση των pthreads ήταν περίπλοκο.
@@ -139,12 +139,35 @@ o \textbf{vA}, είναι ένα \textit{slice} του A, που δείχνει
Γίνεται δηλαδή πάλι χρήση της quick-select.
Για να μειώσουμε την ακρίβεια και εδώ μπορούμε να “φτωχύνουμε” το merge.
Για το σκοπό αυτό έχουμε ένα όρισμα στη συνάρτηση το οποίο μας κόβει τον αριθμό των κοντινότερων γειτόνων.
Σε αυτή την προσέγγιση υπάρχει ακόμα ένα ουσιαστικότερο όφελος.
Ο χωρισμός σε slices μας δίνει την δυνατότητα να δημιουργήσουμε threads που δεν θα χρειαστεί ποτέ να χρειαστούν κομμάτια μνήμης από άλλα threads.
Αυτό ο διαχωρισμός γίνεται στον έξω βρόχο επανάληψης της knnsearch
\begin{verbatim}
#pragma omp parallel for
for (size_t qi = 0; qi < num_slices; ++qi)
worker_body (corpus_slices, query_slices, idx, dst, qi,
num_slices, corpus_slice_size, query_slice_size, k, m);
\end{verbatim}
Για τα το παραπάνω snippet (που είναι και “καρδιά” του αλγόριθμου), ο κάθε worker δουλεύει σε δικό του corpus και query slice και αποθηκεύει τα δεδομένα σε δικό του slice πίσω στους idx και dst.
Με αυτό τον τρόπο δεν χρειαζόμαστε κανέναν συγχρονισμό για τα threads.
\subsection{knnsearch version 1}
\subsection{Μετρήσεις}
Για την παραγωγή των εκτελέσιμων χρησιμοποιήσαμε το προσωπικό μας(μου) laptop.
Στον κατάλογο με τον πηγαίο κώδικα υπάρχει ότι είναι απαραίτητο για την μεταγλώττιση και εκτέλεση του κώδικα.
Για τη μεταγλώττιση κάναμε χρήση του image hpcimage που βρίσκεται \href{https://hub.docker.com/r/hoo2/hpcimage}{εδώ}.
Για την μεταγλώττιση και εκτέλεση μπορεί κάποιος να δώσει τις παρακάτω εντολές στο root κατάλογο “homework\_1”.
\begin{verbatim}
DOCK="docker run --rm -v <PATH_to_homework_1>:/usr/src/PDS_homework_1 \
-w /usr/src/PDS_homework_1/ hoo2/hpcimage"
make -j IMAGE=hoo2/hpcimage v0
make -j IMAGE=hoo2/hpcimage v1
make -j IMAGE=hoo2/hpcimage v1_cilk
make -j IMAGE=hoo2/hpcimage v1_omp
make -j IMAGE=hoo2/hpcimage v1_pth
# run pthreads version with 4 slices
eval $DOCK ./out/knnsearch_v1_pth -c <path to hdf5> /test -k 100 -s 4 -t
\end{verbatim}
\section{Αποτελέσματα}
@@ -156,47 +179,54 @@ o \textbf{vA}, είναι ένα \textit{slice} του A, που δείχνει
\item Εκτελέσαμε την κάθε έκδοση του προγράμματος για δύο διαφορετικούς πίνακες(all-to-all) για \textbf{διαφορετική επιθυμητή ακρίβεια}.
\end{itemize}
Για αντιπαραβολή παραθέτουμε ότι ότι στο ίδιο μηχάνημα το οποίο πήραμε τις μετρήσεις η knnsearch έκδοση του matlab κάνει:
Για αντιπαραβολή παραθέτουμε ότι ότι στο ίδιο μηχάνημα το οποίο πήραμε τις μετρήσεις η knnsearch έκδοση του \textbf{matlab} κάνει:
\begin{itemize}
\item sift: \textbf{3.223628 [sec]}
\item mnist: \textbf{20.634987 [sec]}
\end{itemize}
Για την έκδοση με την openMP έχουμε:
{
\centering
\subsection{Επίδραση των threads - OpenMP}
Για την έκδοση με την openMP, χρησιμοποιώντας διαφορετικό αριθμό threads έχουμε: \\
\includegraphics[width=\textwidth]{../measurements/OMP_over_threads.png}
\captionof{figure}{Βελτιστοποίηση από την παραλληλοποίηση [openMP].}
\label{fig:openMP_th}
\subsection{Επίδραση των threads - openCilk}
Για την έκδοση με την Cilk έχουμε:
Για την έκδοση με την Cilk έχουμε: \\
\includegraphics[width=\textwidth]{../measurements/CILK_over_threads.png}
\captionof{figure}{Βελτιστοποίηση από την παραλληλοποίηση [open-cilk].}
\label{fig:cilk_th}
Για την έκδοση με τα pthreads έχουμε:
\subsection{Επίδραση των threads - pthreads}
Για την έκδοση με τα pthreads έχουμε: \\
\includegraphics[width=\textwidth]{../measurements/Pthreads_over_threads.png}
\captionof{figure}{Βελτιστοποίηση από την παραλληλοποίηση [pthreads].}
\label{fig:pthreads_th}
\subsection{Επίδραση της ακρίβειας - OpenMP}
Για την έκδοση με την openMP όσο αλλάζουμε την ακρίβεια έχουμε:
Για την έκδοση με την openMP όσο αλλάζουμε την ακρίβεια έχουμε: \\
\includegraphics[width=\textwidth]{../measurements/OMP_over_accuracy.png}
\captionof{figure}{Βελτιστοποίηση λόγο μειωμένης ακρίβειας [openMP].}
\label{fig:openMP_acc}
\subsection{Επίδραση της ακρίβειας - openCilk}
Για την έκδοση με την Cilk όσο αλλάζουμε την ακρίβεια έχουμε:
Για την έκδοση με την Cilk όσο αλλάζουμε την ακρίβεια έχουμε: \\
\includegraphics[width=\textwidth]{../measurements/CILK_over_accuracy.png}
\captionof{figure}{Βελτιστοποίηση λόγο μειωμένης ακρίβειας [open-cilk].}
\label{fig:cilk_acc}
Για την έκδοση με τα pthreads όσο αλλάζουμε την ακρίβεια έχουμε:
\subsection{Επίδραση της ακρίβειας - pthreads}
Για την έκδοση με τα pthreads όσο αλλάζουμε την ακρίβεια έχουμε: \\
\includegraphics[width=\textwidth]{../measurements/Pthreads_over_accuracy.png}
\captionof{figure}{Βελτιστοποίηση λόγο μειωμένης ακρίβειας [pthreads].}
\label{fig:pthreads_acc}
}
\section{Συμπεράσματα}
@@ -205,8 +235,8 @@ o \textbf{vA}, είναι ένα \textit{slice} του A, που δείχνει
Απ' ότι βλέπουμε παραπάνω, ενώ ο χρόνος βελτιώνεται καθώς χρησιμοποιούμε παραπάνω threads, αυτό δεν συμβαίνει όταν μειώνουμε την ακρίβεια.
Τουλάχιστον όχι όσο θα θέλαμε.
Φυσικά αυτό έχει να κάνει με την υλοποίηση μας, καθώς δεν επιλέξαμε καλή τεχνική συνένωσης.
Ακόμα φαίνεται ότι ενώ η μέθοδος με τα pthreads αποδίδει καλά, αυτό δεν συμβαίνει και με την cilk και την openmp.
Αυτό γιατί στην παρούσα υλοποίηση δεν γίνεται σωστή διαχείριση των threads.
Στην υλοποίησή μας δεν έγινε πολύ επιθετική στρατηγική μείωσης της ακρίβειας των αποτελεσμάτων.
Να πούμε επίσης ότι ο συγκεκριμένος αλγόριθμος, λόγο της ουσιαστικά “μη” επικοινωνίας που χρειάζονται τα threads, θα μπορούσε να χρησιμοποιηθεί και σε απομακρυσμένα συστήματα κάνοντας χρήση του MPI.
\end{document}