diff --git a/homework_1/homework_1_report.pdf b/homework_1/homework_1_report.pdf deleted file mode 100644 index 53c8143..0000000 Binary files a/homework_1/homework_1_report.pdf and /dev/null differ diff --git a/homework_1/inc/v1.hpp b/homework_1/inc/v1.hpp index 10f17b7..7384103 100644 --- a/homework_1/inc/v1.hpp +++ b/homework_1/inc/v1.hpp @@ -165,7 +165,7 @@ void knnsearch(MatrixD& C, MatrixD& Q, size_t num_slices, size_t k, size_t m, Ma Q.columns()); } - // Intermediate results + // Initialize results for (size_t i = 0; i < dst.rows(); ++i) { for (size_t j = 0; j < dst.columns(); ++j) { dst.set(std::numeric_limits::infinity(), i, j); @@ -202,9 +202,7 @@ void knnsearch(MatrixD& C, MatrixD& Q, size_t num_slices, size_t k, size_t m, Ma #else for (size_t qi = 0; qi < num_slices; ++qi) { - 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); - } + worker_body (corpus_slices, query_slices, idx, dst, qi, num_slices, corpus_slice_size, query_slice_size, k, m); } #endif diff --git a/homework_1/matlab/measurements_over_acc.m b/homework_1/matlab/measurements_over_acc.m index 67c8f98..2a9f812 100644 --- a/homework_1/matlab/measurements_over_acc.m +++ b/homework_1/matlab/measurements_over_acc.m @@ -5,17 +5,17 @@ ser_sift_acc = [ 4395 4365 4384 4315 4295 4246 ]; ser_mnist_ser_acc = [ 7936 7924 7886 7903 7844 7801 ]; omp_sift_acc = [ - 4093 4098 4040 4001 3980 3937 + 1162 1157 1148 1138 1134 1107 ]; omp_mnist_acc = [ - 7575 7463 7389 7416 7321 7303 + 2044 2036 2028 2007 1993 1973 ]; cilk_sift_acc = [ - 3718 3739 3673 3668 3608 3557 + 1148 1133 1127 1096 1079 1057 ]; cilk_mnist_acc = [ - 7064 7071 7035 6948 6962 6913 + 2008 2024 1974 1965 1959 1947 ]; pth_sift_acc = [ diff --git a/homework_1/matlab/measurements_over_th.m b/homework_1/matlab/measurements_over_th.m index 7aaa797..795ce37 100644 --- a/homework_1/matlab/measurements_over_th.m +++ b/homework_1/matlab/measurements_over_th.m @@ -5,17 +5,17 @@ ser_sift_threads = [ 4418 4418 4418 4418 4418 4418 4418 ]; ser_mnist_ser_threads = [ 7924 7924 7924 7924 7924 7924 7924 ]; omp_sift_th = [ - 4469 4283 4096 3822 4060 4241 5193 + 4374 2194 1148 751 724 637 596 ]; omp_mnist_th = [ - 8053 7806 7465 6828 7662 8013 8123 + 7918 3941 2031 1395 1415 1330 1292 ]; cilk_sift_th = [ - 4225 4090 3696 3122 3860 4141 5103 + 4183 2076 1114 886 706 742 636 ]; cilk_mnist_th = [ - 7744 7206 6965 6628 7362 7813 8123 + 7745 3883 2020 1454 1436 1342 1292 ]; pth_sift_th = [ diff --git a/homework_1/measurements/CILK_over_accuracy.png b/homework_1/measurements/CILK_over_accuracy.png index 67390d0..a38afd4 100644 Binary files a/homework_1/measurements/CILK_over_accuracy.png and b/homework_1/measurements/CILK_over_accuracy.png differ diff --git a/homework_1/measurements/CILK_over_threads.png b/homework_1/measurements/CILK_over_threads.png index 912c987..1635c84 100644 Binary files a/homework_1/measurements/CILK_over_threads.png and b/homework_1/measurements/CILK_over_threads.png differ diff --git a/homework_1/measurements/OMP_over_accuracy.png b/homework_1/measurements/OMP_over_accuracy.png index eb27a8c..01594d9 100644 Binary files a/homework_1/measurements/OMP_over_accuracy.png and b/homework_1/measurements/OMP_over_accuracy.png differ diff --git a/homework_1/measurements/OMP_over_threads.png b/homework_1/measurements/OMP_over_threads.png index f552260..957d083 100644 Binary files a/homework_1/measurements/OMP_over_threads.png and b/homework_1/measurements/OMP_over_threads.png differ diff --git a/homework_1/measurements/Pthreads_over_accuracy.png b/homework_1/measurements/Pthreads_over_accuracy.png index 3d46410..f8c72de 100644 Binary files a/homework_1/measurements/Pthreads_over_accuracy.png and b/homework_1/measurements/Pthreads_over_accuracy.png differ diff --git a/homework_1/measurements/Pthreads_over_threads.png b/homework_1/measurements/Pthreads_over_threads.png index f36081d..42841e8 100644 Binary files a/homework_1/measurements/Pthreads_over_threads.png and b/homework_1/measurements/Pthreads_over_threads.png differ diff --git a/homework_1/measurements/over_acc.txt b/homework_1/measurements/over_acc.txt index f26070b..2221f18 100644 --- a/homework_1/measurements/over_acc.txt +++ b/homework_1/measurements/over_acc.txt @@ -30,62 +30,62 @@ hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1 -c mtx/mni # OMP-sift over acc hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/sift-128-euclidean.hdf5 /test -s 4 -a 100 -k 100 -t -[Timing]: knnsearch: 4093 [msec] +[Timing]: knnsearch: 1162 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/sift-128-euclidean.hdf5 /test -s 4 -a 80 -k 100 -t -[Timing]: knnsearch: 4098 [msec] +[Timing]: knnsearch: 1157 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/sift-128-euclidean.hdf5 /test -s 4 -a 60 -k 100 -t -[Timing]: knnsearch: 4040 [msec] +[Timing]: knnsearch: 1148 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/sift-128-euclidean.hdf5 /test -s 4 -a 40 -k 100 -t -[Timing]: knnsearch: 4001 [msec] +[Timing]: knnsearch: 1138 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/sift-128-euclidean.hdf5 /test -s 4 -a 20 -k 100 -t -[Timing]: knnsearch: 3980 [msec] +[Timing]: knnsearch: 1134 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/sift-128-euclidean.hdf5 /test -s 4 -a 10 -k 100 -t -[Timing]: knnsearch: 3937 [msec] +[Timing]: knnsearch: 1107 [msec] # OMP-mnist over acc hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/mnist-784-euclidean.hdf5 /test -s 4 -a 100 -k 100 -t -[Timing]: knnsearch: 7575 [msec] +[Timing]: knnsearch: 2044 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/mnist-784-euclidean.hdf5 /test -s 4 -a 80 -k 100 -t -[Timing]: knnsearch: 7463 [msec] +[Timing]: knnsearch: 2036 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/mnist-784-euclidean.hdf5 /test -s 4 -a 60 -k 100 -t -[Timing]: knnsearch: 7389 [msec] +[Timing]: knnsearch: 2028 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/mnist-784-euclidean.hdf5 /test -s 4 -a 40 -k 100 -t -[Timing]: knnsearch: 7416 [msec] +[Timing]: knnsearch: 2007 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/mnist-784-euclidean.hdf5 /test -s 4 -a 20 -k 100 -t -[Timing]: knnsearch: 7321 [msec] +[Timing]: knnsearch: 1993 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/mnist-784-euclidean.hdf5 /test -s 4 -a 10 -k 100 -t -[Timing]: knnsearch: 7303 [msec] +[Timing]: knnsearch: 1973 [msec] # CILK-sift over acc hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/sift-128-euclidean.hdf5 /test -s 4 -a 100 -k 100 -t -[Timing]: knnsearch: 4218 [msec] +[Timing]: knnsearch: 1148 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/sift-128-euclidean.hdf5 /test -s 4 -a 80 -k 100 -t -[Timing]: knnsearch: 4239 [msec] +[Timing]: knnsearch: 1133 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/sift-128-euclidean.hdf5 /test -s 4 -a 60 -k 100 -t -[Timing]: knnsearch: 4173 [msec] +[Timing]: knnsearch: 1127 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/sift-128-euclidean.hdf5 /test -s 4 -a 40 -k 100 -t -[Timing]: knnsearch: 4168 [msec] +[Timing]: knnsearch: 1096 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/sift-128-euclidean.hdf5 /test -s 4 -a 20 -k 100 -t -[Timing]: knnsearch: 4108 [msec] +[Timing]: knnsearch: 1079 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/sift-128-euclidean.hdf5 /test -s 4 -a 10 -k 100 -t -[Timing]: knnsearch: 4057 [msec] +[Timing]: knnsearch: 1057 [msec] # CILK-mnist over acc hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/mnist-784-euclidean.hdf5 /test -s 4 -a 100 -k 100 -t -[Timing]: knnsearch: 7864 [msec] +[Timing]: knnsearch: 2008 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/mnist-784-euclidean.hdf5 /test -s 4 -a 80 -k 100 -t -[Timing]: knnsearch: 7871 [msec] +[Timing]: knnsearch: 2024 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/mnist-784-euclidean.hdf5 /test -s 4 -a 60 -k 100 -t -[Timing]: knnsearch: 7835 [msec] +[Timing]: knnsearch: 1974 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/mnist-784-euclidean.hdf5 /test -s 4 -a 40 -k 100 -t -[Timing]: knnsearch: 7748 [msec] +[Timing]: knnsearch: 1965 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/mnist-784-euclidean.hdf5 /test -s 4 -a 20 -k 100 -t -[Timing]: knnsearch: 7762 [msec] +[Timing]: knnsearch: 1959 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/mnist-784-euclidean.hdf5 /test -s 4 -a 10 -k 100 -t -[Timing]: knnsearch: 7713 [msec] +[Timing]: knnsearch: 1947 [msec] # Pthreads-sift over acc diff --git a/homework_1/measurements/over_threads.txt b/homework_1/measurements/over_threads.txt index 7cae4dd..a28a995 100644 --- a/homework_1/measurements/over_threads.txt +++ b/homework_1/measurements/over_threads.txt @@ -5,67 +5,69 @@ hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1 -c mtx/mni # OMP-sift over threads hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/sift-128-euclidean.hdf5 /test -s 1 -k 100 -t -[Timing]: knnsearch: 4469 [msec] +[Timing]: knnsearch: 4374 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/sift-128-euclidean.hdf5 /test -s 2 -k 100 -t -[Timing]: knnsearch: 4283 [msec] +[Timing]: knnsearch: 2194 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/sift-128-euclidean.hdf5 /test -s 4 -k 100 -t -[Timing]: knnsearch: 4096 [msec] +[Timing]: knnsearch: 1148 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/sift-128-euclidean.hdf5 /test -s 6 -k 100 -t -[Timing]: knnsearch: 3822 [msec] +[Timing]: knnsearch: 751 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/sift-128-euclidean.hdf5 /test -s 8 -k 100 -t -[Timing]: knnsearch: 4060 [msec] +[Timing]: knnsearch: 724 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/sift-128-euclidean.hdf5 /test -s 10 -k 100 -t -[Timing]: knnsearch: 4241 [msec] +[Timing]: knnsearch: 637 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/sift-128-euclidean.hdf5 /test -s 12 -k 100 -t -[Timing]: knnsearch: 5193 [msec] +[Timing]: knnsearch: 596 [msec] # OMP-mnist over threads hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/mnist-784-euclidean.hdf5 /test -s 1 -k 100 -t -[Timing]: knnsearch: 8053 [msec] +[Timing]: knnsearch: 7918 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/mnist-784-euclidean.hdf5 /test -s 2 -k 100 -t -[Timing]: knnsearch: 7806 [msec] +[Timing]: knnsearch: 3941 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/mnist-784-euclidean.hdf5 /test -s 4 -k 100 -t -[Timing]: knnsearch: 7465 [msec] +[Timing]: knnsearch: 2031 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/mnist-784-euclidean.hdf5 /test -s 6 -k 100 -t -[Timing]: knnsearch: 6828 [msec] +[Timing]: knnsearch: 1395 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/mnist-784-euclidean.hdf5 /test -s 8 -k 100 -t -[Timing]: knnsearch: 7662[msec] +[Timing]: knnsearch: 1415 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/mnist-784-euclidean.hdf5 /test -s 10 -k 100 -t -[Timing]: knnsearch: 8013 [msec] +[Timing]: knnsearch: 1330 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_omp -c mtx/mnist-784-euclidean.hdf5 /test -s 12 -k 100 -t -[Timing]: knnsearch: 8123 [msec] +[Timing]: knnsearch: 1292 [msec] + # CILK-sift over threads hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/sift-128-euclidean.hdf5 /test -s 1 -k 100 -t -[Timing]: knnsearch: 4225 [msec] +[Timing]: knnsearch: 4183 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/sift-128-euclidean.hdf5 /test -s 2 -k 100 -t -[Timing]: knnsearch: 4090 [msec] +[Timing]: knnsearch: 2076 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/sift-128-euclidean.hdf5 /test -s 4 -k 100 -t -[Timing]: knnsearch: 3696 [msec] +[Timing]: knnsearch: 1114 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/sift-128-euclidean.hdf5 /test -s 6 -k 100 -t -[Timing]: knnsearch: 3122 [msec] +[Timing]: knnsearch: 886 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/sift-128-euclidean.hdf5 /test -s 8 -k 100 -t -[Timing]: knnsearch: 3860 [msec] +[Timing]: knnsearch: 706 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/sift-128-euclidean.hdf5 /test -s 10 -k 100 -t -[Timing]: knnsearch: 4141 [msec] +[Timing]: knnsearch: 742 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/sift-128-euclidean.hdf5 /test -s 12 -k 100 -t -[Timing]: knnsearch: 5103 [msec] +[Timing]: knnsearch: 636 [msec] # CILK-mnist over threads hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/mnist-784-euclidean.hdf5 /test -s 1 -k 100 -t -[Timing]: knnsearch: 7744 [msec] +[Timing]: knnsearch: 7745 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/mnist-784-euclidean.hdf5 /test -s 2 -k 100 -t -[Timing]: knnsearch: 7206 [msec] +[Timing]: knnsearch: 3883 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/mnist-784-euclidean.hdf5 /test -s 4 -k 100 -t -[Timing]: knnsearch: 6965 [msec] +[Timing]: knnsearch: 2020 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/mnist-784-euclidean.hdf5 /test -s 6 -k 100 -t -[Timing]: knnsearch: 6628 [msec] +[Timing]: knnsearch: 1454 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/mnist-784-euclidean.hdf5 /test -s 8 -k 100 -t -[Timing]: knnsearch: 7362 [msec] +[Timing]: knnsearch: 1436 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/mnist-784-euclidean.hdf5 /test -s 10 -k 100 -t -[Timing]: knnsearch: 7813 [msec] +[Timing]: knnsearch: 1342 [msec] hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_cilk -c mtx/mnist-784-euclidean.hdf5 /test -s 12 -k 100 -t -[Timing]: knnsearch: 158123[msec] +[Timing]: knnsearch: 1292 [msec] + # Pthreads-sift over threads hoo2@shirka:~/Work/AUTH/PDS/homework_1$ eval $DOCK ./out/knnsearch_v1_pth -c mtx/sift-128-euclidean.hdf5 /test -s 1 -k 100 -t diff --git a/homework_1/report/homework_1_report.pdf b/homework_1/report/homework_1_report.pdf index 53c8143..592a5b0 100644 Binary files a/homework_1/report/homework_1_report.pdf and b/homework_1/report/homework_1_report.pdf differ diff --git a/homework_1/report/homework_1_report.tex b/homework_1/report/homework_1_report.tex index 5a167bd..206f4a2 100644 --- a/homework_1/report/homework_1_report.tex +++ b/homework_1/report/homework_1_report.tex @@ -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 :/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 /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} diff --git a/homework_1/run_measurements.sh b/homework_1/run_measurements.sh deleted file mode 100755 index f8eefeb..0000000 --- a/homework_1/run_measurements.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash - -# -# Take measurements -# - -DOCK="docker run --rm -v /home/hoo2/Work/AUTH/PDS/homework_1:/usr/src/PDS_homework_1 -w /usr/src/PDS_homework_1/ hoo2/hpcimage" - -echo " " -echo "Serial" - - echo "./out/knnsearch_v1 -c mtx/sift-128-euclidean.hdf5 /test -s 1 -k 100 -t" -eval $DOCK ./out/knnsearch_v1 -c mtx/sift-128-euclidean.hdf5 /test -s 10 -k 100 -t - echo "./out/knnsearch_v1 -c mtx/mnist-784-euclidean.hdf5 /test -s 1 -k 100 -t" -eval $DOCK ./out/knnsearch_v1 -c mtx/mnist-784-euclidean.hdf5 /test -s 10 -k 100 -t - -echo " " -echo "OMP" - -# echo ./out/knnsearch_v1 -c mtx/sift-128-euclidean.hdf5 /test -s 1 -k 100 -t -#eval $DOCK ./out/knnsearch_v1_omp -c mtx/sift-128-euclidean.hdf5 /test -s 10 -k 100 -t -# echo ./out/knnsearch_v1 -c mtx/mnist-784-euclidean.hdf5 /test -s 1 -k 100 -t -#eval $DOCK ./out/knnsearch_v1_omp -c mtx/mnist-784-euclidean.hdf5 /test -s 10 -k 100 -t -# echo ./out/knnsearch_v1 -c mtx/sift-128-euclidean.hdf5 /test -s 1 -k 100 -t -#eval $DOCK ./out/knnsearch_v1_omp -c mtx/sift-128-euclidean.hdf5 /test -s 10 -k 100 -t -# echo ./out/knnsearch_v1 -c mtx/mnist-784-euclidean.hdf5 /test -s 1 -k 100 -t -#eval $DOCK ./out/knnsearch_v1_omp -c mtx/mnist-784-euclidean.hdf5 /test -s 10 -k 100 -t