Celem projektu jest implementacja popularnych algorytmów do przetwarzania danych, a także wykonanie i opis pomiaru czasowago wariantów algorytmów bez/z zrównolegleniem operując na środowisku OpenMP.
\noindent W projekcie za wariant A uznaje się wersję algorytmu bez zrównoleglenia, podczas gdy wariant B odpowiada ze wersję algorytmu zrównoleglonego.
\noindent Warianty A i B zostały porównane do ich alternatywnej implementacji napisanej w Pythonie (Wariant) C
\noindent Pomiary zamieszczone w dokumencie zostały wykonane na podstawie uśrednienia czasu realizacji trzydziestu obiegów programu.
\noindent W ramach projektu zaimplementowano następujące algorytmy:
- algorytm standaryzacji min-max
- algorytm standaryzacji rozkładem normalnym
- algorytm najbliższych sąsiadów (KNN)
\noindent Algorytmy porównano na przykładowym zbiorze danych opisanym w następnym rozdziale.
\noindent Model sprzętu:
- Dell XPS 15 9570
\noindent Procesor:
- 12 x Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz, 3933 MHz
\noindent Karta graficzna:
- nVidia GP107M [GeForce GTX 1050 Ti Mobile]
- Intel UHD Graphics 630 (Mobile)
\noindent Dane pochodzą z archiwum uci. Zawierają próbki kolorów G, R, B z wycinków obrazków twarzy ludzi w tym:
- starych
- młodych
- w średnim wieku
- o różnej rasie i kolorze skóry
\noindent
Sumaryczna liczba próbek wynosi 245057 z czego tylko 50859 próbek zawiera w sobie kolory twarzy. W danych istnieją też wycinki z różnych obrazków nie przedstawiających ludzi.
\noindent
Oryginalnie kolumna ostatnia zawierająca informację o przynależności kolorów G, R, B do twarzy miała następującą postać:
\noindent SKIN:
1
- twarz2
- nie twarz
\noindent Dane zostały poddane wstępnej obróbce:
- Zamieniono kolumny tak, by odpowiadała kolejność R, G, B
- Zamieniono oznaczenie SKIN na:
0
- nie twarz1
- twarz
Klasa MinMax
zdefiniowana w pliku src/MinMax.cpp
realizuje proces standaryzacji wartości w danej kolumnie do przedziału [0, 1]
.
\noindent
Standaryzacja min-max
jest opisana wzorem
g++ src/min_max.cpp -o min_max_no_omp
:
Mean exec time for benches of op: 'DS->MinMaxDS' 180.7 ms Mean exec time for benches of op: 'MAX op' 2.14444 ms Mean exec time for benches of op: 'MIN op' 2.17778 ms
g++ -fopenmp src/min_max.cpp -o min_max
:
Mean exec time for benches of op: 'DS->MinMaxDS' 163.3 ms Mean exec time for benches of op: 'MAX op' 0.922222 ms Mean exec time for benches of op: 'MIN op' 0.866667 ms
Mean of elapsed time for 30 execs took 77.21493699991697 ms
Klasa StandardScaler
zdefiniowana w pliku src/MinMax.cpp
realizuje proces standaryzacji wartości w danej kolumnie do rozkładu normalnego N(0,1)
.
Średnia wartość oczekiwana jest równa 0, a odchylenie standardowe wynosi 1.
g++ src/standard_scaler.cpp -o standard_scaler_no_omp
:
Mean exec time for benches of op: 'DS->StandardScalerDS' 196.967 ms Mean exec time for benches of op: 'MEAN op' 2.2 ms Mean exec time for benches of op: 'STD op' 7.07778 ms
g++ -fopenmp src/standard_scaler.cpp -o standard_scaler
:
Mean exec time for benches of op: 'DS->StandardScalerDS' 159.567 ms Mean exec time for benches of op: 'MEAN op' 2.37778 ms Mean exec time for benches of op: 'STD op' 0.833333 ms
Mean of elapsed time for 30 execs took 83.95475529996475 ms
Klasa Knn
zdefiniowana w pliku src/knn.cpp
realizuje proces klasyfikacji przy użyciu algorytmu najbliższych sąsiadów. Dane na dwa zbiory, testowy (20%) i trenujący (80%), a do klasyfikacji używanych jest 5 sąsiadów, przy użyciu metryki euklidesowej.
\noindent Liczba rekordów została zmniejszona do 5000.
\noindent
Obserwując pomiary można zauważyć, iż wersja bez zastosowania OpenMP
dla operacji cząstkowych budujących rozwiązanie końcowe jest około dwa razy wolniejsza od swojego zrównoleglonego odpowiednika.
\noindent
Przy tak małym zbiorze danych różnice jednak nie są znaczące. Zatem OpenMP jest jak najbardziej przydatne, ale tylko przy procesowaniu znaczącej ilości danych.
\noindent
Wersje Pythonowe są 2 razy szybsze z oczywistych względów