Wykład 2 Podstawowe pojęcia systemów równoległych, modele równoległości, wydajność obliczeniowa, prawo Amdahla/Gustafsona Spis treści: 1. Równoległe systemy komputerowe a rozproszone systemy komputerowe, metody zrównoleglenia obliczeń. 2. Systemy wieloprocesorowe ze wspólną i rozproszoną pamięcią. 3. Miary wydajności obliczeniowej systemów równoległych i rozproszonych. 4. Prawo Amdahla/Gustafsona
1. Równoległe systemy komputerowe a rozproszone systemy komputerowe Równoległe systemy komputerowe (ang. parallel computer systems) zawierają wiele współpracujących procesorów wykorzystywanych do wykonania programów. Systemy takie nazywamy również systemami wieloprocesorowymi (ang. multi-processor systems). Systemy równoległe (wieloprocesorowe) są fizycznie skupione w obrębie jednej obudowy lub kilku obudów znajdujących się w bliskim sąsiedztwie (np. w tej samej sali).
Jeżeli system komputerowy zawiera wiele odrębnych komputerów (zawierających procesor z całą hierarchią pamięci i urządzeniami wejścia/wyjścia) połączonych ze sobą zewnętrzną siecią, umożliwiająca wymianę danych (również kodu programów), to mówimy wtedy o systemie wielokomputerowym albo sieci komputerowej (ang. multicomputer system, computer network). Komputery w sieci komputerowej są zwykle rozproszone na dużej przestrzeni geometrycznej budynek, miasto, kraj lub wiele krajów (w przeciwieństwie do systemów równoległych). Dlatego systemy wielokomputerowe (sieci komputerowe) nazywamy również systemami rozproszonymi (ang. distributed systems). Wykonują się w nich tzw. obliczenia rozproszone.
Dla wykonania w systemie równoległym lub rozproszonym, program musi być podzielony na fragmenty, wykonywane w poszczególnych procesorach lub komputerach. Nazywa się to zrównolegleniem programu (ang. program parallelization). Ze względu na sposób podziału programu sposób zrównoleglenia programu, wyróżniamy: zrównoleglenie oparte na dekompozycji danych (ang. data decomposition), zrównoleglenie oparte na dekompozycji kodu programu (ang. code decomposition), zrównoleglenie oparte na obu tych sposobach dekompozycji (ang. data and code decomposition).
Przy dekompozycji danych, kod programu jest zwykle wykonywany równolegle na mniejszych podzespołach danych a potem zbierane są wyniki częściowe, co zwykle wymaga pewnej ilości dodatkowych obliczeń. Zrównoleglenie przez dekompozycję danych zwykle stosuje się do programów o dużych zespołach danych i regularnych strukturach (np. wektory, macierze, listy, drzewa). Przy dekompozycji kodu programu, każdy fragment programu zawiera odrębne dane, określone poprzez podział kodu. Zrównoleglenie przez dekompozycję kodu stosuje się do programów o nieregularnych strukturach danych.
Wykonanie fragmentów programu po zrównolegleniu na wiele procesorów (komputerów) często wymaga wymiany wyników częściowych - danych, podczas wykonywania. Tę wymianę danych nazywamy komunikacją między procesorami (komputerami) (ang. inter-processor communication, inter-computer communication). Komunikacja w systemach wielokomputerowych (sieciach komputerowych) zajmuje czas niepomijalny z punktu widzenia czasu wykonania programów. W systemach równoległych, komunikacja danych (programów) zachodzi bardzo szybko i zdarza się, że jest ona pomijalna w stosunku do czasu obliczeń.
Pomijalność czasu komunikacji w całkowitym czasie wykonania programu zależy od: ziarna zrównoleglenia programów (ang. grain of parallelism) relacji między szybkością obliczeń w procesorach (komputerach) a szybkością komunikacji między procesorami (komputerami). Pod względem ziarnistości zrównoleglenia wyróżniamy: programy drobnoziarniście równoległe (ang. fine-grained parallel programs), w których średni czas obliczeń między komunikacjami jest mały i stosunek czasu obliczeń do czasu komunikacji w całym programie jest niski programy gruboziarniście równoległe (ang. coarse-grained parallel programs), w których średni czas obliczeń między komunikacjami jest duży i stosunek czasu obliczeń do czasu komunikacji w całym programie jest wysoki.
2. Systemy wieloprocesorowe ze wspólną i rozproszoną pamięcią Dane i kod programu równoległego są przechowywane w systemie równoległym w pamięci operacyjnej dostępnej dla procesorów systemu. Ze względu na sposób organizacji i wykorzystywania pamięci operacyjnej przez procesory systemy wieloprocesorowego systemy równoległe dzielimy na: systemy ze wspólną pamięcią (współdzieloną, dzieloną) (ang. shared memory system) systemy z pamięcią rozproszoną (ang. distributed memory systems) systemy z rozproszoną pamięcią wspólną (ang. distributed shared memory).
System wieloprocesorowy z współdzieloną pamięcią (silnie związany) Procesor 1 Procesor 2 Procesor n Sieć łącząca procesory z modułami pamięci i układami wejścia/wyjścia Pamięć 1 Pamięć 2 Pamięć m We/Wy 1 We/Wy k Współdzielone moduły pamięci Układy We/Wy
W systemie ze wspólną pamięcią, wszystkie procesory mają prawo korzystać z całej przestrzeni adresowej pamięci operacyjnej systemu. Fragmenty tej przestrzeni są zwykle ulokowane w odrębnych modułach pamięciowych, wyposażonych w odrębne dekodery adresu.
Komunikacja między procesorami (fragmentami programów) w systemie ze wspólną pamięcią odbywa się za pomocą rozkazów dostępu do zmiennych dzielonych w pamięci. Jest ona nazywana komunikacją przez zmienne dzielone (ang. communication through shared variables). Pobieranie rozkazów do wykonania w procesorach również odbywa się ze wspólnej pamięci.
W systemie ze wspólną pamięcią, efektywność dostępu do modułów pamięci zależy od budowy i własności sieci łączącej. Sieć łącząca jest czynnikiem ograniczającym przepustowość dostępu do pamięci dla większej liczby procesorów. Ogranicza to liczbę procesorów w tych systemach, przy których zapewniona jest dobra wydajność obliczeń równoległych.
Systemy wieloprocesorowe ze wspólną pamięcią nazywane są systemami silnie związanymi (ang. tightly coupled system) lub wieloprocesorami (ang. multiprocessor). Ze względu na symetryczny dostęp wszystkich procesorów do wszystkich modułów pamięci, obliczenia w tych systemach nazywane są w literaturze symetrycznym wieloprzetwarzaniem (ang. Symmetric Multiprocessing SMP) a systemy takie są nazywane w j. ang. Symmetric Multiprocessors.
System wieloprocesorowy z rozproszoną pamięcią (luźno związany) Pamięć lokalna 1 We/Wy1 Pamięć lokalna 2 We/Wy2 Pamięć lokalna n We/Wy n Szyna lokalna Szyna lokalna Szyna lokalna Procesor 1 Procesor 2 Procesor n Łącze Łącze Łącze Sieć łącząca procesory
W systemie wieloprocesorowym z rozproszoną pamięcią, każdy procesor jest wyposażony we własną pamięć lokalną (ang. local memory) z lokalną przestrzenią adresową dostępną tylko dla tego procesora. Procesory mogą wymieniać dane poprzez sieć łączącą procesory realizując komunikację przez przesyłanie komunikatów (ang. message passing). W programach wykonywane są do tego celu rozkazy nadaj komunikat i odbierz komunikat.
Komunikaty są wysyłane używając w rozkazach identyfikatorów obiektów (zmiennych) zwanych kanałami komunikacyjnymi (ang. communication channel). Kanały reprezentują połączenie (ang. connection) istniejące (lub stworzone w sieci połączeń) między łączami komunikacyjnymi (ang. communication link) procesorów.
Łącza komunikacyjne mogą być: szeregowe równoległe.
Specjalne procesory przystosowane do przesyłania komunikatów, które mają wbudowanych kilka łączy - od 4 do 6 : wybrane procesory DSP Data Signal Processors SHARC, firmy Analog Devices 4 do 6 łączy równoległych 4 lub 8 bitowych), Motorola DSP 56005, AT&T DSP 1610, DSP 3207, Texas Instruments TMS 320Cx0. dawniej transputery 4 łącza szeregowe,
W procesorze komunikacyjnym, z każdym z łączy współpracuje niezależny kontroler łącza. Steruje on zewnętrznymi transmisjami danych na zasadzie DMA - bezpośredni dostęp do pamięci. Kontroler bezpośredniego dostępu do pamięci DMA (ang. Direct Memory Access Interface, Direct Memory Access Module) umożliwia transmisje danych między pamięcią operacyjną a urządzeniami zewnętrznymi bez pośrednictwa ze strony procesora.
Idea współpracy układów we/wy z procesorem poprzez układy DMA Szyna adresowa i sterująca Pamięć operacyjna Adresy, sygnały sterujące Procesor Szyna danych Dane Dane Zwolnienie szyn pamięci we/wy 1... we/wy n Sterownik DMA... Żądanie/potwierdzenie 1 Żądanie/potwierdzenie n
Kontroler DMA jest wyposażony w 4 autonomiczne kanały dostępu do pamięci, do których podłączone są linie żądań dostępu DRQi (DMA Request) i zezwoleń dostępu DACKi (DMA Acknowledge) od urządzeń zewnętrznych. Każdy z kanałów może sterować jedną transmisją między urządzeniem zewnętrznym a pamięcią operacyjną. Urządzenia mogą wysyłać żądania dostępu jednocześnie. Układ wyboru zgłoszenia wybiera jedno ze zgłoszonych żądań zgodnie z zaprogramowanym systemem priorytetów. Do procesora jest wysyłany sygnał HRQ (Hold Request żądanie wstrzymania dostępu do szyny pamięci). Procesor zawiesza swoją komunikację z pamięcią operacyjną, oddaje DMA nadzór nad szyną systemową idącą do pamięci (adresową, danych i sterującą) wysyłając do DMA sygnał HLDA (Hold Acknowledge potwierdzenie wstrzymania). Od tej pory, aż do wycofania sygnału HRQ, kontroler DMA będzie sprawował sterowanie dostępem do pamięci. Po otrzymaniu sygnału HLDA, kontroler DMA odpowiada do urządzenia zewnętrznego sygnałem DACKi, potwierdzając rozpoczęcie transmisji, której przebieg będzie zgodny z zaprogramowanym dla danego kanału rodzajem transmisji.
Uproszczony schemat blokowy kanału DMA Szyna danych procesora Licznik adresów Licznik słów Rejestr sterujący Rejestr stanu Szyna adresowa pamięci Układ sterujący DRQi DACKi HRQ HLDA... Bity adresu oraz sygnały sterujące: z procesora, dla pamięci i urządzenia zewn. Układ sterowania DMA podaje do pamięci adresy danych, sygnały sterujące oraz odlicza liczbę przesyłanych słów. Układ ten wysyła również sygnały odczytu i zapisu do urządzenia zewnętrznego, które sterują przesyłaniem danych do/z tego urządzenia.
Realizacja przesłania komunikatów w procesorach z łączami komunikacyjnymi: przy nadaniu - komunikat jest automatycznie pobierany z pamięci procesora przez kontroler łącza i wysyłany do łącza, przy odbiorze - odebrany z łącza komunikat jest automatycznie przesyłany do pamięci. Systemy wieloprocesorowe z rozproszoną pamięcią nazywane są w literaturze systemami luźno związanymi (ang. loosely coupled system).
W systemach z rozproszoną pamięcią jest możliwe jednoczesne połączenie bardzo wielu procesorów i stąd bardzo dużo jednoczesnych transmisji danych. Pozwala to na uzyskanie bardzo dużej efektywności komunikacji między procesorami i obliczeń w procesorach (wynika to z rozproszenia dostępów do pamięci). Dlatego systemy równoległe z rozproszoną pamięcią takie nazywane są również systemami z masywnym przetwarzaniem równoległym (ang. Massively Parallel Processing MPP).
Komunikacja przez przesyłanie komunikatów może odbywać się zgodnie z: modelem synchronicznym (ang. synchronous communication model) asynchronicznym (ang. asynchronous communication model).
Przy modelu synchronicznym, procesy (programy) - nadający i odbierający, synchronizują swoje wykonanie na rozkazach komunikacji w danym kanale. Oznacza to, że proces nadający może nadawać dopiero wtedy, gdy proces odbierający w innym procesorze doszedł do wykonania rozkazu odbierania w tym kanale. Ponieważ komunikacja zachodzi przy wykonaniu rozkazów nadania i odbioru w obydwu procesorach jednocześnie, nie jest potrzebne buforowanie komunikatów i są one przesyłane jakby bezpośrednio z pamięci jednego procesora do pamięci drugiego. Odbywa się to pod kontrolą kontrolerów zewnętrznych łączy komunikacyjnych w obu procesorach.
Przy modelu asynchronicznym, procesy (programy): nadający i odbierający, nie synchronizują wykonania komunikacji w danym kanale. Komunikat jest nadawany do kanału w dowolnej chwili i trafia do bufora dla komunikatów w danym kanale - w kontrolerze łącza po drugiej stronie połączenia między procesorami. Proces odbierający odbiera komunikat odczytując go z bufora danego kanału.
Systemy wieloprocesorowe z rozproszoną pamięcią wspólną Trzecim rodzajem systemu wieloprocesorowego jest system z rozproszoną pamięcią (ang. distributed shared memory) inaczej zwaną wirtualną pamięcią dzieloną (ang. virtual shared memory). W systemach takich, które są obecnie najsilniej rozwijane, każdy procesor ma lokalną pamięć operacyjną. Jednakże, każda pamięć jest umieszczona we wspólnej przestrzeni adresowej całego systemu. Każdy procesor może mieć dostęp do pamięci lokalnej dowolnego innego procesora.
Komunikacja między procesorami w systemach z rozproszoną pamięcią wspólną, odbywa się przez dostęp do zmiennych dzielonych. Odbywa się to po prostu przez wykonanie rozkazu "czytaj" lub "zapisz" zmienne w pamięci innego procesora. W każdym procesorze istnieje układ sterowania dostępem do pamięci. Układ sterowania dostępem do pamięci, rozpoznaje bieżące adresy używane w rozkazach procesora: lokalny lub odległy. Jeśli adres jest lokalny, to kieruje się adres do szyny dostępu do lokalnej pamięci. Jeśli adres jest odległy, to wysyła się adres wraz ze wskazaniem rodzaju operacji (odczyt/zapis) do innego procesora (ściślej do jego układu sterowania dostępem). Przesłanie adresu a później danych odbywa się za pośrednictwem sieci łączącej pamięci wszystkich procesorów (ściślej ich układy sterowania dostępem do pamięci).
System wieloprocesorowy z rozproszoną pamięcią wspólną Pamięć lokalna 1 We/Wy1 Pamięć lokalna 2 We/Wy2 Pamięć lokalna n We/Wy n Szyna lokalna Szyna lokalna Szyna lokalna Procesor 1 Ster. dostępu m Procesor 2 Ster. dostępu Procesor n Ster. dostępu Sieć dostępu do odległych modułów pamięci
Systemy wieloprocesorowe z rozproszoną pamięcią wspólną są nazywane w literaturze systemami ze skalowalnym przetwarzaniem równoległym (ang. Scalable Parallel Processing - SPP). Nazwa SPP wynika z tego, że ze wzrostem liczby procesorów w systemie, użytych do wykonania danego programu równoległego, wydajność systemu rośnie zgodnie ze współczynnikiem wzrostu liczby procesorów. Tę cechę nazywamy skalowalnością systemu równoległego (ang. parallel system scalability). System jest skalowalny jeśli jego wydajność (szybkość wykonywania programów) rośnie proporcjonalnie do liczby procesorów w systemie.
3. Miary wydajności systemów równoległych i rozproszonych Najprostszą miarą korzyści jaka wypływa ze zrównoleglenia obliczeń procesów jest przyspieszenie obliczeń. Zakładamy, ze mamy system równoległy zawierajacy p procesorów pracujących równolegle. Przyspieszenie obliczeń równoległych (ang. computation speedup) obliczeń jest zdefiniowane jako stosunek czasu wykonania programu na 1 procesorze T(1) do czasu wykonania programu na p procesorach T(p). S ( p ) = T (1) T ( p ) Przyspieszenie jest wielkością bezwymiarową i musi spełniać warunek S ( p ) p.
Przyspieszenie jest miarą skrócenia czasu wykonania programu dzięki zrównolegleniu, nie podaje jednak efektywności wykorzystania procesorów przy wykonaniu programu równoległego. Efektywność obliczeń równoległych (ang. efficiency) jest to stosunek przyspieszenia obliczeń do liczby procesorów p wykonujących obliczenia. S( p) E ( p) = = p p T (1) T ( p) Wzrost przyspieszenia obliczeń równoległych jest ograniczony, gdy wewnętrzne sekwencyjne części programu zaczynają dominować nad częścią zrównolegloną programu.
Skalowalność systemu równoległego jest to własność systemu równoległego stanowiąca zdolność do dostarczania niezmniejszonej wydajności równoleglych obliczeń przy zwiększaniu liczby procesorów w systemie. System równoległy jest w pełni skalowalny dla danego programu jesli przy n-krotnym zwiększeniu liczby procesorów przyspieszenie równoległe wykonania tego programu wzrosło n razy. Wykres przyspieszenia równoległego wykonania programu w funkcji liczby procesorów dla systemu w pełni skalowalnego jest liniowy. Dla systemu nie w pełni skalowalnego (nieskalowalnego) wzrost przyspieszenia równoległego w funkcji liczby procesorów nie jest liniowy i nachylenie krzywej przyspieszenia maleje. W większości przypadków systemy równoległe nie są w pełni skalowalne, gdyż przy zwiększeniu liczby procesorów wzrastają koszta komunikacji między procesorami (czas wymiany danych między procesorami podczas obliczeń równoległych) co powoduje wzrost przyspieszenia wolniejszy niż liniowy.
Czas wykonania obliczeń w procesorze systemu równoległego jest sumą czasu czystych obliczeń procesora i czasu komunikacji (wymiany danych wraz z wszelkimi opóźnieniami). Sprawność wykonania programu równoległego wykonanego na p procesorach Spr(p) jest to stosunek łącznego czasu czystych obliczeń obl(p) do sumy łącznego czasu obliczeń obl(p) i komunikacji kom(p). Spr( p) = obl( p) obl( p) + kom( p) = 1+ 1 kom( p) obl( p) Dla wielu programów, przy wzroście liczby procesorów łączny czas czystych obliczeń nie zmienia się lub rośnie bardzo wolno, natomiast łączny czas komunikacji rośnie stosunkowo szybko. W wyniku tego, przy wzroście liczby procesorów, często maleje sprawność równoległego wykonania programu.
Sprawność wykonania programu równoleglego może być wykorzystana dla oceny skalowalności systemu równoległego dla danego problemu obliczeniowego przy rosnącym rozmiarze zadań (np. rosnących rozmiarów danych dla danego algorytmu rozwiazania problemu). Przy zwiększeniu liczby procesorów, aby zachować tę samą sprawność systemu należy wykonać zadania o większym rozmiarze (wtedy rośnie składnik obl(p) i sprawność Spr(p) może utrzymać taką samą wartość. Można wyznaczyć tzw. funkcję stałej sprawności względem rozmiaru zadania (ang. isoefficiency function). Ten system równoległy jest lepiej skalowalny dla danego problemu obliczeniowego, dla którego funkcja stałej sprawności względem rozmiaru zadania rośnie wolniej.
4.1 Prawo Amdahla (1967) Każdy program zawiera dwa rodzaje obliczeń: obliczenia, które mogą być wykonywane tylko sekwencyjnie (szeregowo), obliczenia, które mogą być zrównoleglone i wykonane na pewnej liczbie równolegle pracujących procesorów. Prawo Amdahla podaje w jaki sposób obecność sekwencyjnych fragmentów obliczeń w programie wpływa na przyspieszenie równoległego wykonania programu. Założenia. Niech s oznacza ułamek całego czasu T(1) wykonania programu na 1 procesorze (sekwencyjnego), który procesor spędza w części szeregowej programu. Ułamek czasu T(1), który może być wykonany równolegle na pewnej liczbie procesorów p wynosi 1 s. Zakładając że, czas wykonania każdej linii programu jest jednakowy, wtedy s jest ułamkiem liczby linii sekwencyjnego fragmentu programu w całym programie, 1 s jest liczbą linii programu, którą można zrównoleglić.
Czas wykonania programu na p procesorach T(p) wynosi: T (1) T ( p) = st (1) + (1 s). p Przyspieszenie wykonania programu na p procesorach S(p) wynosi: T (1) S( p) = T ( p) T (1) = T (1) st (1) + (1 s) p = s + 1 (1 s) p gdzie s jest ułamkiem całego czasu wykonania programu na 1 procesorze, który odpowiada części programu, która nie może być zrównoleglona.
Biorąc pod uwagę powyższy wzór: S( p) = s 1 (1 s) + p zauważymy, że niezależnie od tego ile procesorów użyjemy w obliczeniach równoległych, przyspieszenie dla bardzo dużego p będzie ograniczone od góry wartością s 1. Dla dużej liczby procesorów zrównoleglenie programu sekwencyjnego, w którym część s nie może być zrównoleglona, może dać przyspieszenie conajwyżej s 1.-krotne Jeśli s = 0,5 to przyspieszenie równoległe może wynieść conajwyżej 2. Jeśli s = 0.1 to przyspieszenie równoległe może wynieść conajwyżej 10. Jeśli s = 0,05 to przyspieszenie równoległe może wynieść conajwyżej 20.
Jeżeli tylko 1% obliczeń jest wykonywany sekwencyjnie, = 0, 01 to przyspieszenie nie będzie większe niż 100. s, Wykres przyspieszenia programu w funkcji liczby procesorów n oraz wielkości części sekwencyjnej s programu
4.2 Prawo Gustafsona (1988) Mamy system równoległy złożony z p procesorów. Założenia. Znamy łączny czas obliczeń sekwencyjnych ts w programie oraz czas wykonania programu tp na komputerze równoległym złożonym z p procesorów. Chcemy wyznaczyć przyspieszenie równoległe wykonania programu. Przyspieszenie równoległe dane jest wzorem: S ( p ) = T (1) T ( p ) gdzie T(1) to czas wykonania sekwencyjnego na 1 procesorze a T(p) to czas wykonania równoległego na p procesorach. Mamy T(p) = tp. Trzeba wyznaczyć T(1). T ( 1) = ts + ( tp ts) p = ts(1 p) + ptp = ptp ts( p 1)
Dzielimy przez tp i otrzymujemy: S( p) = p ts( p 1) tp Widzimy, że przyspieszenie S(p) ma wartość maksymalną p dla ts = 0. Gdy ts 0 to przyspieszenie ma wartości mniejsze od p w stopniu zależnym od stosunku ts do tp. Np. dla ts/tp = 0.5 S(p) wynosi S(p) = p - 0.5 p +0.5 = 0.5 p + 0.5. Dla ts/tp = 0.1 mamy S(p) = p - 0.1 p + 0.1 = 0.9 p + 0.1. Różnica między prawami Amdahla i Gustafsona. Prawo Amdahla bada mozliwe przyspieszenia równoległe w funkcji liczby procesorów dla stałego rozmiaru problemu i programu. Prawo Gustafsona bada przyspieszenia równoległe w funkcji liczby procesorów dla zmiennego rozmiaru problemu i programu przy zachowaniu tej samej wartości czasu obliczeń równoległych.