przez behemoth » 2010-06-24, 11:03:41
Operacja mnożenia macierzy dwóch macierzy ma tę własność, że każdy z elementów wynikowej macierzy C= A * B wyznacza się tylko na podstawie odpowiednich elementów macierzy A i B. Celem zadania jest napisanie programu obliczającego iloczyn dwóch macierzy w sposób rozproszony przy wykorzystaniu pamięci dzielonej.
Należy w języku C/C++ napisać program, który pozwoli pomnożyć dwie macierze określone na jego wejściu.
Działanie programu jest następujace: program otrzymuje jako parametr linii poleceń liczbę określającą za pomocą ilu procesów potomnych ma być zrealizowane mnożenie macierzy. Następnie ze standardowego wejścia odczytuje macierze do przemnożenia w następującej postaci:
pierwsza linia zawiera dwie liczby całkowite oddzielone spacjami określające rozmiary pierwszej macierzy
kolejne linie zawierają odpowiednią liczbę wierszy macierzy, przy czym każdy wiersz składa się z liczb zmiennoprzecinkowych oddzielonych spacjami
kolejne linie zawierają opis drugiej macierzy w postaci identycznej jak powyżej (tzn. najpierw wymiary, a następnie wartości)
Program powinien sprawdzić, czy dla wprowdzonych danych mnożenie macierzy jest wykonalne i jeśli nie, zakończyć swoje działanie z odpowiednim komunikatem i kodem błędu.
Następnie program inicjalizuje pamięć dzieloną i uruchamia wskazaną liczbę procesów potomnych (patrz funkcja fork(2)), które będą realizowały cząstkowe mnożenia. Schemat podziału (tzn. to które elementy mają być wyznaczane przez które procesy potomne) jest dowolny - powinien on zostać zaproponowany przez autora programu. Każdy z procesów potomnych oblicza odpowiednie elementy i umieszcza je we właściwym miejscu pamięci dzielonej. Po zakończeniu obliczeń proces potomny kończy się.
Działanie procesu głównego kończy się w momencie, kiedy wszystkie jego procesy potomne zakończyły swoje działanie - należy wówczas wypisać na standardowe wyjście macierz wynikową.
Pamięć dzielona jest efektywnym mechanizmem przekazywania danych między programami. Działanie tego mechanizmu komunikacji międzyprocesowej polega na tym, że program tworzy obszar pamięci, który jest dostępny dla innych programów. W zależności od ustawionych uprawnień programy mogą czytać lub modyfikować ten obszar pamięci. Do manipulacji pamięcią dzieloną służą funkcje shmget(2), shmat(2), shmdt(2), shmctl(2).
Po uruchomieniu proces główny tworzy stosowny obszar pamięci dzielonej i za jego pomocą udostępnia macierze wejściowe oraz przyjmuje efekty pracy procesów potomnych. W momencie kończenia pracy konieczne jest usunięcie wykorzystywanej pamięci dzielonej. Należy również zwrócić uwagę na fakt, że segmenty pamięci dzielonej identyfikowane są za pomocą kluczy (specjalnych identyfikatorów) i zarówno proces główny jak i procesy potomne muszą posługiwać się tym samym identyfikatorem.
http://www.lastfm.pl/user/ksiadz666
http://ftims.pl