MATERIAŁY POMOCNICZE DO LABORATORIUM Z PRZETWARZANIA RÓWNOLEGŁEGO KWIECIEŃ 2018

Podobne dokumenty
ANALIZA EFEKTYWNOŚCI MNOŻENIA MACIERZY W SYSTEMACH Z PAMIĘCIĄ WSPÓŁDZIELONĄ

EFEKTYWNOŚĆ MNOŻENIA MACIERZY W SYSTEMACH Z PAMIĘCIĄ WSPÓŁDZIELONĄ

Mnożenie macierzy. Systemy z pamięcią współdzieloną Systemy z pamięcią rozproszoną Efektywność

Materiały pomocnicze do laboratorium. 1. Miary oceny efektywności 2. Mnożenie macierzy 3. Znajdowanie liczb pierwszych

Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,

Ograniczenia efektywności systemu pamięci

Przykładem jest komputer z procesorem 4 rdzeniowym dostępny w laboratorium W skład projektu wchodzi:

Ograniczenia efektywności systemu pamięci

Macierzowe algorytmy równoległe

Wydajność systemów a organizacja pamięci, czyli dlaczego jednak nie jest aż tak źle. Krzysztof Banaś, Obliczenia wysokiej wydajności.

Zadania na zaliczenie przedmiotu Przetwarzanie równoległe Zebrał dla roku.ak. 2015/2016 Rafał Walkowiak,

Algorytmy numeryczne 1

Wydajność systemów a organizacja pamięci. Krzysztof Banaś, Obliczenia wysokiej wydajności. 1

Stronicowanie w systemie pamięci wirtualnej

Programowanie CUDA informacje praktycznie i. Wersja

Pytania przykładowe (z ubiegłych lat) na zaliczenie przedmiotu Przetwarzanie równoległe Przygotował Rafał Walkowiak Poznań 3.01.

Architektura komputerów

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

Wydajność systemów a organizacja pamięci. Krzysztof Banaś, Obliczenia wysokiej wydajności. 1

Algorytmy równoległe. Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka 2010

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

Zadania na zaliczenie przedmiotu Przetwarzanie równoległe Zebrał dla r.ak. 2014/2015 Rafał Walkowiak,

Systemy operacyjne III

Programowanie Współbieżne. Algorytmy

Algorytmy równoległe: prezentacja i ocena efektywności prostych algorytmów dla systemów równoległych

Architektura komputerów

System pamięci. Pamięć wirtualna

System pamięci. Pamięć wirtualna

Wydajność programów sekwencyjnych. Krzysztof Banaś Obliczenia Wysokiej Wydajności 1

Zarządzanie pamięcią operacyjną

Projektowanie algorytmów równoległych. Zbigniew Koza Wrocław 2012

Programowanie CUDA informacje praktycznie i przykłady. Wersja

Wydajność systemów a organizacja pamięci. Krzysztof Banaś, Obliczenia wysokiej wydajności. 1

Zarządzanie zasobami pamięci

Schematy zarzadzania pamięcia

System pamięci. Pamięć wirtualna

PROJEKT 3 PROGRAMOWANIE RÓWNOLEGŁE. K. Górzyński (89744), D. Kosiorowski (89762) Informatyka, grupa dziekańska I3

Programowanie PKG - informacje praktycznie i przykłady. Wersja z Opracował: Rafał Walkowiak

Zrównoleglenie i przetwarzanie potokowe

Procesor ma architekturę rejestrową L/S. Wskaż rozkazy spoza listy tego procesora. bgt Rx, Ry, offset nand Rx, Ry, A add Rx, #1, Rz store Rx, [Rz]

Wykład 5. Metoda eliminacji Gaussa

Algorytmy dla maszyny PRAM

Dr inż. hab. Siergiej Fialko, IF-PK,

Pamięć wirtualna. Przygotował: Ryszard Kijaka. Wykład 4

Wykład 7. Zarządzanie pamięcią

Literatura. 3/26/2018 Przetwarzanie równoległe - wstęp 1

Numeryczna algebra liniowa

Wstęp do informatyki. Maszyna RAM. Schemat logiczny komputera. Maszyna RAM. RAM: szczegóły. Realizacja algorytmu przez komputer

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

Organizacja pamięci współczesnych systemów komputerowych : pojedynczy procesor wielopoziomowa pamięć podręczna pamięć wirtualna

Optymalizacja skalarna. Piotr Bała. Wykład wygłoszony w ICM w czercu 2000

Zarządzanie pamięcią operacyjną

EGZAMIN MATURALNY Z INFORMATYKI MAJ 2013 POZIOM PODSTAWOWY CZĘŚĆ I WYBRANE: Czas pracy: 75 minut. Liczba punktów do uzyskania: 20 WPISUJE ZDAJĄCY

Równoległość i współbieżność

Równoległość i współbieżność

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Literatura. 11/16/2016 Przetwarzanie równoległe - wstęp 1

Transponowanie macierzy Mnożenie macierzy Potęgowanie macierzy Wyznacznik macierzy

Algorytm. a programowanie -

architektura komputerów w. 8 Zarządzanie pamięcią

Wykład z Technologii Informacyjnych. Piotr Mika

Pamięć. Jan Tuziemski Źródło części materiałów: os-book.com

Numeryczna algebra liniowa. Krzysztof Banaś Obliczenia Wysokiej Wydajności 1

5. Model komunikujących się procesów, komunikaty

Architektura potokowa RISC

a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10]

10/14/2013 Przetwarzanie równoległe - wstęp 1. Zakres przedmiotu

wagi cyfry pozycje

System obliczeniowy laboratorium oraz. mnożenia macierzy

TEORETYCZNE PODSTAWY INFORMATYKI

System plików. Warstwowy model systemu plików

Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1

Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne

Równoległy algorytm wyznaczania bloków dla cyklicznego problemu przepływowego z przezbrojeniami

do instrukcja while(wyrażenie);

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

4. Procesy pojęcia podstawowe

WHILE (wyrażenie) instrukcja;

Podstawy Programowania C++

Pamięci półprzewodnikowe w oparciu o książkę : Nowoczesne pamięci. Ptc 2013/

Budowa i zasada działania komputera. dr Artur Bartoszewski

6. Pętle while. Przykłady

Podstawy Informatyki DMA - Układ bezpośredniego dostępu do pamięci

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Obliczenia równoległe

OWS1 (systemy z pamięcią współdzieloną) Rafał Walkowiak Wersja: wiosna 2017

Procesory wielordzeniowe (multiprocessor on a chip) Krzysztof Banaś, Obliczenia wysokiej wydajności.

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Podstawy Informatyki Systemy sterowane przepływem argumentów

Działanie systemu operacyjnego

Programowanie i techniki algorytmiczne

Urządzenia wejścia-wyjścia

Zarządzanie pamięcią operacyjną zagadnienia podstawowe

Wykład 8. Pamięć wirtualna. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

dr inż. Jarosław Forenc

Procesy i wątki. Krzysztof Banaś Obliczenia równoległe 1

Działanie systemu operacyjnego

SYSTEMY OPERACYJNE WYKLAD 6 - procesy

Transkrypt:

Analiza efektywności mnożenia macierzy w systemach z pamięcią współdzieloną MATERIAŁY POMOCNICZE DO LABORATORIUM Z PRZETWARZANIA RÓWNOLEGŁEGO KWIECIEŃ 2018 1

Mnożenie macierzy dostęp do pamięci podręcznej [język C, kolejność - j,i,k][1] A[i][*] lokalność przestrzenna danych rózne A,B,C są tablicami nxn elementy z linii pp wykorzystane w kolejnych for (int j = 0 ; j < n ; j++) iteracjach for ( int i = 0 ; i < n ; i++) B[*][j] możliwy brak wielokrotnego odczytu for (int k = 0 ; k < n ; k++) raz pobranej linii (kiedy?) C[i][j] + = A[i][k] * B[k][j] ; C[i][j] czasowa lokalność odwołań ten sam element dla każdej iteracji pętli wewnętrznej = x Ilość danych wykorzystywanych w pętli wewnetrznej = x C A B Analiza efektywności mnożenia macierzy Ilość danych wykorzystywanych w 2 pętlach wewnętrznych A współbieżnie? 2

Mnożenie macierzy pamięć podręczna [C, j,i,k][2] = x C A B C[*][j] brak lokalności przestrzennej odwołań A[*][*] warunek na lokalność czasową odwołań B[*][j] brak lokalności przestrzennej Warunek na lokalność czasową odwołań do danych pamięć podręczna mieści tablicę A i linie pp z kolumnami tablicy C i B. Analiza efektywności mnożenia macierzy 3

Zarządzanie pamięcią Pamięć wirtualna Pamięć wirtualna przydzielana w blokach o wielkości strony pamięci wirtualnej, udostępniana procesom po zapisaniu strony do obszaru pamięci operacyjnej - rzeczywistej do tzw. ramki pamięci, umożliwia przydział procesom większej ilości pamięci niż jest dostępna fizycznie w systemie, aby proces mógł pobrać dane konieczne jest odwzorowanie adresu wirtualnego na aktualny adres fizyczny, pod którym dane aktualnie się znajdują, konieczna jest zatem translacja adresów wirtualnych na adresy fizyczne. 4

Zarządzanie pamięcią Bufor translacji adresu (TLB) Każdy dostęp procesora do pamięci powoduje konieczność określenia fizycznego adresu pod którym znajduje się wartość spod określonego w kodzie adresu wirtualnego. Odwzorowanie (translacja) jest realizowane przez bufor translacji adresu TLB (ang. translation lookaside buffer), który zawiera adresy fizyczne ostatnio translowanych adresów wirtualnych. Pamięć TLB może posiadać strukturę wielopoziomową i może być oddzielna dla danych i kodu. W przypadku braku adresu wirtualnego w TLB system operacyjny korzystając z katalogu i tablic stron określa brakujący adres i wpisuje go do TBL wykonując procedurę obsługi przerwania (znaczy koszt czasowy).

Zarządzanie pamięcią II Brak informacji w TLB jest nazywany brakiem trafienia do TLB. Niski stosunek trafień do TLB jest spowodowany niską przestrzenną lokalnością kodu. Np. w programie (język C) odczyt różnych elementów kolumny tablicy z długimi wierszami. Gdy znany jest adres fizyczny operandu wtedy można określić: - czy pobierana z pp L1 (współbieżność działań) wartość jest poprawna, - skąd należy wartość pobrać, czy jest w strukturze pp czy trzeba pobrać z pamięci operacyjnej. W przypadku braku linii z żądanymi danymi w pp poziomu1 (cache L1) brakująca linia (cache miss) jest pobierana z pamięci niższego poziomu pamięci podręcznej (L2, L3) lub pamięci operacyjnej. W przypadku braku strony z żądanymi danymi w pamięci operacyjnej (page fault) żądana strona odczytywana jest z dysku.

Zależności PP DTBL Komputer laboratoryjny DTLB ok. 500 par wpisów adresów PP L3 pomieści dane 500 stron wirtualnych o wielkości 4 kb 2MB 4 rdzenie z własnymi DTLB Niektóre dane, których adres jest znany mogą nie być w PP L3-8MB > 6MB pp L3 Nietrafienie DTLB, trafienie pp Trafienie DTLB, nietrafienie pp 7

Mnożenie macierzy pamięć podręczna[c, i,k,j][1] A,B,C są tablicami nxn for ( int i = 0 ; i < n ; i++) for (int k = 0 ; k < n ; k++) for (int j = 0 ; j < n ; j++) C[i][j] + = A[i][k] * B[k][j] ; = x = x Analiza efektywności mnożenia macierzy A[i][k] lokalność czasowa odwołań B[k][*], C[i][*] lokalność przestrzenna odwołań A[i][*] lokalność przestrzenna odwołań B[*][*] brak lokalności czasowej odwołań jeżeli suma rozmiaru(wiersz A, wiersz C i tablica B) większe od rozmiaru pamięci podręcznej Warunek na czasową lokalność dostępów do danych? Najbardziej zagnieżdżona pętla j zapewnia lokalność przestrzenną dostępu do danych, odpowiednia wielkość pamięci podręcznej zapewnia lokalność czasową dostępu do danych. 8

Mnożenie macierzy pamięć podręczna [C, i,k,j * ] zmniejszenie zakresu pętli wewnętrznej = x = 1X x rx Obliczamy wpierw fragmenty wiersza macierzy wynikowej nie cały wiersz for ( int j = 0 ; j < n ; j+=r) // cała macierz wynikowa for ( int i = 0 ; i < n ; i++) // wyznaczenie niebieskiej części wyniku for (int k = 0 ; k < n ; k++) // wyznaczenie brązowej części wyniku for (int jj = j ; jj < j+r-1 ; jj++) C[i][jj] + = A[i][k] * B[k][jj] ; Przy odpowiedniej wielkości r możliwa lokalność czasowa odwołań do B[*][jj:jj+r-1] Zmniejszenie wielkości fragmentów tablic, na podstawie których realizowane są obliczenia (w jednej fazie przetwarzania) prowadzi do większej lokalności odwołań. Konieczne ponowne pobrania macierzy A ile razy? 9

r x r Mnożenie macierzy pamięć podręczna [operacje na fragmentach tablic][graficznie] C A B for (int kk = k ; kk < k+r ; kk++) C[ii][jj] + = A[ii][kk] * B[kk][jj]; for (int jj = j ; jj < j+r ; jj++) for (int kk = k ; kk < k+r ; kk++) C[ii][jj] + = A[ii][kk] * B[kk][jj]; for ( int ii = i ; ii < i+r; ii++) for (int jj = j ; jj < j+r ; jj++) for (int kk = k ; kk < k+r ; kk++) C[ii][jj] + = A[ii][kk] * B[kk][jj]; Analiza efektywności mnożenia macierzy for (int k = 0 ; k < n ; k+=r) for ( int ii = i ; ii < i+r; ii++) for (int jj = j ; jj < j+r ; jj++) for (int kk = k ; kk < k+r ; kk++) C[ii][jj] + = A[ii][kk] * B[kk][jj]; 10

Mnożenie macierzy pamięć podręczna [operacje na fragmentach tablic][kod] for ( int i = 0 ; i < n ; i+=r) for ( int j = 0 ; j < n ; j+=r) for (int k = 0 ; k < n ; k+=r) // kolejne fragmenty for ( int ii = i ; ii < i+r; ii++)//fragment wyniku for (int jj = j ; jj < j+r ; jj++) for (int kk = k ; kk < k+r ; kk++) C[ii][jj] + = A[ii][kk] * B[kk][jj]; Dla C[ii][jj], A[ii][kk], B[kk][jj] lokalność czasowa dostępów do danych przy założeniu, że wszystkie podmacierze A,B i C (A[i:i+r-1][k:k+r-1],B[k:k+r- 1][j:j+r-1], C[i:i+r-1][j:j+r-1] ) mieszczą się w pamięci podręcznej. 1. 3 pętle wewnętrzne służą do wyznaczenia wyniku częściowego dla fragmentu tablicy wynikowej (sum iloczynów elementów wierszy i kolumn fragmentów macierzy wejściowych), 2. czwarta pętla (po k) służy do uzupełnienia wyniku o pozostałe iloczyny wynikające z uwzględnienia kolejnych (branych po r) elementów wierszy i kolumn fragmentów macierzy wejściowych, 3. pętle piąta i szósta służą do wyznaczenia kolejnych kwadratowych (r) obszarów Analiza efektywności mnożenia macierzy macierzy wynikowej. 11

Metoda 6 pętlowa analiza lokalności czasowej W ramach 4 wewnętrznych pętli: korzysta się z wielu tablic o wielkości r*r. Jedna tablica (część wyniku) jest potrzebna na każdym z etapów, tablice wejściowe (części tablicy A i B) jednocześnie są potrzebne w 2 egzemplarzach po jednej dla A i B w kolejnych etapach nowe części po r*r elementów. Jednocześnie potrzebne są dla każdego z wątków przetwarzania 3 tablice o rozmiarze r*r. W pamięci podręcznej o rozmiarze M używanej przez jeden wątek zmieszczą się 3 tablice o rozmiarze r<= (M/ts/3) 1/2 (ts rozmiar typu zmiennej, 3 - liczba tablic używanych przez jeden wątek). Dla przyjętej kolejności zagnieżdżenia tablica B jest czytana wielokrotnie i musi być podobnie jak tablica C cały czas dostępna, tablica A jest czytana tylko raz (wierszami) i faktycznie mogłaby (w aktualnie potrzebnym zakresie bez potrzeby ponownego pobierania do pamięci podręcznej ) zajmować jedną linię pamięci podręcznej przy efektywnym zarządzaniu pamięcią. Jednakże dla zapewnienia ciągłej obecności w pamięci wielokrotnie używanych fragmentów tablic C i B bezpieczniej również dla tablicy A zarezerwować obszar w pamięci podręcznej równy r*r (wg wzoru powyżej). Iteracje zewnętrznych pętli to realizacja obliczeń powyższego typu dla innych wyników w oparciu o te same lub inne dane (tablice A i B). W całości przetwarzania każdy blok tablic A,B,C o rozmiarze r*r jest używany wielokrotnie w n/r etapach i tyle razy pobierany do pamięci podręcznej w najgorszym razie przy spełnieniu powyższej zależności na r. 12

Metoda 6 pętlowa równoległa - analiza lokalności czasowej W sytuacji, gdy przetwarzanie jest realizowane równolegle w zależności od sposobu podziału pracy mamy różne zależności: Wersja A - podział pracy przed pierwszą pętlą Każdy z wątków wykonuje prace na podzbiorze bloków położonych obok siebie w pasach liczba zadań do podziału wynosi N/r i powinna być dobrana dla zapewnienia zrównoważenia pracy systemu (drugi warunek na r (dla równoległości) przy zmieniającym się warunku pierwszym ze względu na liczbę wątków korzystających z tej samej pamięci podręcznej potencjalnie wzrasta liczba równocześnie używanych tablic ) Wersja B - podział pracy przed pętlą czwartą Każdy z wątków dzieli pracę w ramach wyliczania sum częściowych każdego wynikowego bloku c [r,r], każdy wątek liczy inną cześć wyników w oparciu o wszystkie dane wejściowe niezbędne dla tego celu. Liczba zadań do podziału wynosi r. Podział pracy wprowadza synchronizację wątków. Wersja C - podział pracy przed pętlą trzecią może powodować wyścig w dostępie do danych możliwe jednoczesne uaktualnienia tych samych elementów zmiennych doprowadzają do błędnych wyników ze względu na brak atomowości uaktualnienia zmiennej. Zapewnienie atomowości uaktualnienia wprowadza dalszą synchronizację wątków. 13

Metoda 6 pętlowa równoległa - analiza lokalności przestrzennej Lokalność przestrzenna dostępu do danych wynika: z kolejności najbardziej wewnętrznych pętli programu, odległości w pamięci elementów tablicy położonych w sąsiednich wierszach (wielkość wiersza), liczby wierszy przetwarzanych na danym etapie obliczeń (wielokrotnie) wielkość parametru r. 14

Mnożenie macierzy w systemach z pamięcią rozproszoną WYKŁAD Z PRZETWARZANIA RÓWNOLEGŁEGO KWIECIEŃ 2018 15

Kolumnowa dystrybucja tablic A,B, C sa macierzami nxn P liczba procesorów A,B,C są rozdystrybuowane w pamięciach procesorów w sposób blokowy (całymi kolumnami) Obliczenia C[i][j] + = A[i][k] * B[k][j] ; są realizowane zgodnie z zasadą właściciel wyniku przetwarza. Zgodnie z zasadą 3 pętlowego algorytmu mnożenia tablic (kolejnośc ijk - znany kod) kolumny tablic C i B sa przetwarzane lokalnie (tylko w różnych procesorach). Ze względu na to, że A jest używane w wszystkich procesorach konieczne jest rozesłanie (all-to-all broadcast) tablicy A. Analiza efektywności mnożenia macierzy 16

Kolumnowa dystrybucja tablic Kolejno narysowane tablice C,A,B C=A*B 3 komputery uczestniczą w przetwarzaniu. Dystrybucja kolumnowa, kolor niebieski dane dla procesora 1 Kolor zielony wartości procesora 1 otrzymane w wyniku rozgłaszania od pozostałych 2 procesorów. Analiza efektywności mnożenia macierzy 17

Mnożenie macierzy systemy wieloprocesorowe z pamięcią rozproszoną (dystrybucja kolumnowa)[2] //P procesorów każdy posiada podzbiór kolumn tablic float a[n][n/p], b[n][n/p], c[n][n/p],tmp[n][n]; for (int proc = 0 ; j < P ; j++) //rozsyłanie do wszystkich odbiorców a_send(proc, a) for (int proc = 0 ; j < P ; j++) a_recv(proc, tmp[1:n][proc*n/p: proc*(n/p+1)-1]; // co oznacza ten zapis? // oczekiwanie na zakończenie asynchronicznej komunikacji (dlaczego asynchroniczna?) for ( int i = 0 ; i < n ; i++) for (int k = 0 ; k < n ; k++) for (int j = 0 ; j < n/p ; j++) c[i][j] + = tmp[i][k] * b[k][j] ; Każdy procesor przetwarza (1+2/P)n 2 elementów, każdy procesor rozsyła n 2 /P elementów do P procesorów. a_send, a_recv oznaczają operacje asynchroniczne odpowiednio nadawania i odbioru. Analiza efektywności mnożenia macierzy 18

1 2 3 4 5 6 7 8 9 Struktura systemu i przydzielone części tablicy wyniku UWAGA: właściciel oblicza 1 2 3 5 6 4 Mnożenie macierzy (dystrybucja szachownicowa) A,B,C sa macierzami nxn P = 9 liczba procesorów A,B są rozdystrybuowane w pamięciach procesorów w układzie szachownicy (z przesunięciem - rysunek) Obliczenia C[i][j] + = A[i][k] * B[k][j] są realizowane zgodnie z zasadą właściciel wyniku przetwarza. Dla wyznaczenia wyniku każdy procesor w kolejnym kroku musi otrzymać: 9 7 8 od prawego sąsiada (cyklicznie) wartości jego aktualnej części tablicy A od dolnego sąsiada (cyklicznie) wartości jego aktualnej części tablicy B Dystrybucja wśród procesorów początkowej tablicy A w 9 procesorach (liczby oznaczają część tablicy) podtablice danych A w kolejnych wierszach tablicy procesorów przesunięte o 1 w stosunku do dystrybucji wyniku 1 4 7 5 8 2 9 3 6 Zajętość pamięci: na procesor na poziomie 3n 2 /P, sumarycznie jest równa zajętości dla przetwarzania sekwencyjnego, Każdy procesor przesyła n 2 /P elementów do 2(sqrt(P)-1) procesorów Dystrybucja początkowa tablicy B (liczby oznaczają część tablicy) podtablice danych B w kolejnych kolumnach tablicy Analiza procesorów efektywności mnożenia macierzy przesunięte o 1 w stosunku do dystrybucji wyniku. 19

Mnożenie macierzy (algorytm Cannona minimalizcja zajętości pamięci) A00 B00 A01 B11 A02 B22 A01 B10 A02 B21 A00 B02 A02 B20 A00 B01 A01 B12 A11 B10 A12 B21 A10 B02 A12 B20 A10 B01 A11 B12 A10 B00 A11 B11 A12 B22 A22 B20 A20 B01 A21 B12 A20 B00 A21 B11 A22 B22 A21 B10 A22 B21 A20 B02 Wymiana części tablic wejściowych odbywa się synchronicznie (cyklicznie, kolumnami dla B i wierszami dla A ) z obliczeniami wykorzystującymi te części tablic, każda tablica jest przechowywana w jednej kopii. Symbole A?? B?? oznaczają podtablice, których odpowiednie wiersze i kolumny pomnożone przez siebie stanowią wynik częściowy generowany w danym etapie przetwarzania Analiza efektywności mnożenia macierzy 20

Mnożenie macierzy (algorytm Cannona minimalizcja zajętości pamięci) c=axb a,b,c są macierzami nxn c jest dystrybuowane w bloki szachownicowo, a i b są dystrybuowane w bloki szachownicowo (z odpowiednim przesunięciem) Obliczenia odbywają się z cykliczną rotacją w kolejnych krokach algorytm dla P 2 procesorów komunikacja w strukturze tablicy proc[p,p] Komunikacja asynchroniczna z buforowaniem float a[n/p][n/p], b[n/p][n/p], c[n/p][n/p]; for ( int kk = 0 ; i < P ; i++) { for ( int i = 0 ; i < n/p ; i++) for (int j = 0 ; j < n/p ; j++) send(proc[pi,pj-1], a); send(proc[pi-1,pj], b); recv(proc[pi,pj+1], a); recv(proc[pi+1,pj], b); } for (int k = 0 ; k < n/p ; k++) c[i][j] + = a[i][k] * b[k][j] ; Analiza efektywności mnożenia macierzy 21

Mnożenie macierzy algorytm Cannona koszt przetwarzania Koszt komunikacji: każdy z procesorów przesyła do sąsiada w wierszu macierzy procesorów - tablicę a o rozmiarze n/ p w kolumnie macierzy procesorów - tablicę b o rozmiarze n/ p koszt wysyłania n 2 /p elementów jednej tablicy realizowany ( p-1) razy w kolejnych etapach to (t s +t w n 2 /p) ( p-1) Koszt obliczeń na jednym komputerze (realizowane równolegle na p komputerach) : mnożenie tablic o rozmiarze n/ p - liczba operacji mnożenia i dodawania to (n/ p) 3 mnożenie tablic jest powtarzane p razy co daje n 3 /p operacji dodawania i mnożenia Czas obliczeń n 3 /p *(t d +t m ) Całkowity koszt obliczeń (złożoność) wynosi n 3 /p *(t d +t m ) + 2 (t s + t w n 2 /p) ( p-1) 2 powyżej oznacza wynika z zastosowania sekwencyjnego (synchronicznego) przesyłania obu tablic a i b w kazdym z etapów Analiza efektywności mnożenia macierzy 22

row = my_rank / 5; col = my_rank % 5; //25 procesorów for (int i = 0; i < n / PP; i++) for (int j = 0; j < n / PP; j++) { a[i][j] = float(my_rank); b[i][j] = float(my_rank); c[i][j] = 0; } pra = aa; prb = bb; psa = a; psb = b; for (int kk = 0; kk < PP; kk++) { for (int i = 0; i < n / PP; i++) for (int j = 0; j < n / PP; j++) for (int k = 0; k < n / PP; k++) c[i][j] += psa[i][k] * psb[k][j]; MPI_Irecv(pra, n*n / PP / PP, MPI_FLOAT, (5 * row + (5 + col - 1) % 5), tag, MPI_COMM_WORLD, reqrecv); MPI_Irecv(prb, n*n / PP / PP, MPI_FLOAT, (5 * ((row + 1) % 5) + col), tag, MPI_COMM_WORLD, &reqrecv[1]); MPI_Isend(psa, n*n / PP / PP, MPI_FLOAT, (5 * row + (col + 1) % 5), tag, MPI_COMM_WORLD, reqsend); MPI_Isend(psb, n*n / PP / PP, MPI_FLOAT, (5 * ((5 + row - 1) % 5) + col), tag, MPI_COMM_WORLD, &reqsend[1]); //MPI_Wait(reqRecv, statrecv); //MPI_Wait(&reqRecv[1], &statrecv[1]); MPI_Barrier(MPI_COMM_WORLD); if (mod = ((mod + 1) % 2)) { pra = a; prb = b; psa = aa; psb = bb; } else { pra = aa; prb = bb; psa = a; psb = b; } } 23