Obraz do kernela przesyłany jest w postaci 3 tablic jednowymiarowych( po jednej dla każdego koloru). Konwersja z tablicy dwuwymiarowej A o rozmiarze NxM na jednowymiarową tablice B o rozmiarze N*M odbywa się wg wzoru: A[i][j] = B[M*i+j].
Obraz do kernela przesyłany jest w postaci 3 tablic jednowymiarowych( po jednej dla każdego koloru RGB). Konwersja obrazu z tablicy dwuwymiarowej A o rozmiarze NxM na jednowymiarową tablice B o rozmiarze N*M odbywa się wg wzoru: A[i][j] = B[M*i+j].
Każdy wątek oblicza co najmniej jeden piksel. Zaczyna od piksela o numerze równym numerowi wątku. W celu celu obliczenia numeru następnego piksela dodaje do aktualnego numeru liczbę wszystkich wątków. Następnie oblicza ten piksel i powtarza czynność z dodawaniem liczby wątków, sprawdzając oczywiście czy otrzymana wartość nie jest większa od całkowitej liczby pikseli w obrazie.
Zadanie zostało uruchomione na komputerze wyposażonym w karte graficzna NVIDIA GeForce GT 640M. Karta posiada dwa multiprocesory po 192 rdzenie CUDA, taktowane zegarem 709 MHz. Pamięć karty to 980MB.
Zadanie zostało uruchomione na komputerze wyposażonym w kartę graficzna NVIDIA GeForce GT 640M. Karta posiada dwa multiprocesory po 192 rdzenie CUDA, taktowane zegarem 709 MHz. Pamięć karty to 980MB.
Program testowano na obrazie o rozmiarze 24107x4491 pikseli. Parametry dla jakich uruchomiono program to 3 rozmiary siatki: 16, 64, 256 oraz dla każdego rozmiaru siatki rozmiar bloku: 64,128,192,256,320.
Program testowano na obrazie o rozmiarze 24107x4491 pikseli. Parametry dla jakich uruchomiono program to 3 rozmiary siatki: 16, 64, 256 oraz dla każdego rozmiaru siatki rozmiar bloku: 64,128,192,256,320.
@ -127,10 +129,19 @@ Na rysunku 1. przedstawiono wykres zależności czasu obliczeń od rozmiaru blok
\end{figure}
\end{figure}
\section*{Porównanie}
\section*{Porównanie}
Porównanie technologii OpenMP i MPI wykonano na komputerze MacPro3.1 wyposażonym w 2 procesory Xeon E5462, przy czym do dyspozycji było 6 rdzeni. Program z CUDA uruchomiono na innym komputerze wyposażonym w katę graficzną NVIDIA GeForce GT 640M z dwoma multiprocesorami po 192 rdzenie CUDA, taktowane zegarem 709 MHz. Do porównania użyto wykonanych na laboratoriach programów obliczających rozmycie Gaussa . Do testów wybrano obraz o rozdzielczości 24107x4491. W tabeli przedstawiono czas wykonania przez poszczególne programy oraz liczbę użytych przez nie wątków, w przypadku CUDA jest to iloczyn rozmiaru siatki oraz rozmiaru bloku.
Porównanie technologii OpenMP i MPI wykonano na komputerze MacPro3.1 wyposażonym w 2 procesory Xeon E5462, przy czym do dyspozycji było 6 rdzeni. Program z CUDA uruchomiono na innym komputerze wyposażonym w katę graficzną NVIDIA GeForce GT 640M z dwoma multiprocesorami po 192 rdzenie CUDA, taktowane zegarem 709 MHz. Do porównania użyto wykonanych na laboratoriach programów obliczających rozmycie Gaussa . Do testów wybrano obraz o rozdzielczości 24107x4491. W tabeli 1. przedstawiono czas wykonania przez poszczególne programy oraz liczbę użytych przez nie wątków, w przypadku CUDA jest to iloczyn rozmiaru siatki oraz rozmiaru bloku.
Na podstawie danych w tabeli 1. oraz wniosków wyciągniętych z poprzednich laboratoriów można sformułować następujące wnioski:
\begin{itemize}
\item OpenMP przez to, że sam zarządza tym jak i co będzie zrównoleglone nie jest tak szybki jak pozostałe rozwiązania
\item MPI przy starannym zaprojektowaniu programu pozwana na dość dobre wyniki oraz umożliwia dużą skalowalność.
\item Umiejąc odpowiednio zdekomponować problem i przystosować go do obliczeń na karcie graficznej, CUDA okazuje się najlepszym wyborem do obliczeń równoległych.
\end{itemize}
\vspace{8mm}
\begin{table}
\begin{table}
\centering
\centering
\begin{tabular}{|c|c|c|}
\begin{tabular}{|c|c|c|}
\hline
\hline
@ -144,5 +155,6 @@ Porównanie technologii OpenMP i MPI wykonano na komputerze MacPro3.1 wyposażon