SKRIPTA II DIO
Paralelni algoritmi
Sortiranje Selekcijom Dosadasnja analiza ukazuje da mozda drugi pristup treba primijeniti da bi performanse procedure CREW SORT bile odgovarajuce na EREW modelu. Sada cemo prouciti jedan takav pristup. Ideja je sekvencijalnu proceduru QUICKSORT prilagoditi izvrsavanju na paralelnom racunaru. Uocimo Uocimo da, kako je N < n, mozemo pisati N = n 1 x , gdje je 0 < x < 1. Sada definisimo m i kao i (n / 2 ) -ti najmanji element u S, za 1 ≤ i ≤ 2 1 / x - 1. m i se moze upotrijebiti za razbijanje S-a na 2 1 / x podnizova velicine n / 2 1 / x . Ovi podnizovi oznaceni sa S , S 2 , ... , S , S ., S , … ,S 2 j (1 x ) 1 (gdje je j = 2 ), zadovoljavaju naredno svojstvo: Svaki element iz Si je manji ili jednak od svakog elementa iz S i za 1 ≤ i ≤ 2j – 1. Ovo je ilustrovano na slici 4.6 . Proces razbijanja u podnizove moze biti rekurzivno primijenjen na svaki podniz S i , dok se citavi niz S ne sortira u neopadajucem poretku. Ovaj se algoritam moze izvrsiti paralelno, prvo pozivom procedure PARALLEL SELECT za nala nalaze zenj nje e elem elemen enat ata a m i , a zati zatim m krei kreira ranj njem em pods podsek ekve venc ncii S i . Algo Algori rita tam m se primjenjuje paralelno na podsekvece od S1, … , Sj , koristeci N/j procesora po jednoj podsekvenci. Potom se isto uradi sa preostalih S , ... , S 2 j podsekvenci.Uocite da je broj procesora potrebnih za sortiranje svake podsekvence velicine n / 2 1 / x tacno jednak i kod odgovarajuce rekurzivne primjene algoritma , a to je (n/2 1 / x ) 1 x . Vazno je narocito da 2 1 / x bude cio broj konacne velicine. Time je osigurana gornja granica ukupnog vremena izvrsavanja , kao i postojanje svih m i -ova. Inicijalno, svih N raspolozivih procesora racunaju x iz N = n 1 x . Ako x ne zadovoljava uslove: gornji cio dio(1/x) ≤ 10 (i) n ≥ 2 gornjicio (1 / x ) (ii) onda najmani realan broj veci od x koji zadovoljava uslove (i) i (ii) se uzima umjesto x. Sam algoritam je dat u vidu procedure EREW SORT: −
1/ x
j
1
−
1 j +
2 j +
−
+ 1
j + 1
−
−
2
Sortiranje Selekcijom Dosadasnja analiza ukazuje da mozda drugi pristup treba primijeniti da bi performanse procedure CREW SORT bile odgovarajuce na EREW modelu. Sada cemo prouciti jedan takav pristup. Ideja je sekvencijalnu proceduru QUICKSORT prilagoditi izvrsavanju na paralelnom racunaru. Uocimo Uocimo da, kako je N < n, mozemo pisati N = n 1 x , gdje je 0 < x < 1. Sada definisimo m i kao i (n / 2 ) -ti najmanji element u S, za 1 ≤ i ≤ 2 1 / x - 1. m i se moze upotrijebiti za razbijanje S-a na 2 1 / x podnizova velicine n / 2 1 / x . Ovi podnizovi oznaceni sa S , S 2 , ... , S , S ., S , … ,S 2 j (1 x ) 1 (gdje je j = 2 ), zadovoljavaju naredno svojstvo: Svaki element iz Si je manji ili jednak od svakog elementa iz S i za 1 ≤ i ≤ 2j – 1. Ovo je ilustrovano na slici 4.6 . Proces razbijanja u podnizove moze biti rekurzivno primijenjen na svaki podniz S i , dok se citavi niz S ne sortira u neopadajucem poretku. Ovaj se algoritam moze izvrsiti paralelno, prvo pozivom procedure PARALLEL SELECT za nala nalaze zenj nje e elem elemen enat ata a m i , a zati zatim m krei kreira ranj njem em pods podsek ekve venc ncii S i . Algo Algori rita tam m se primjenjuje paralelno na podsekvece od S1, … , Sj , koristeci N/j procesora po jednoj podsekvenci. Potom se isto uradi sa preostalih S , ... , S 2 j podsekvenci.Uocite da je broj procesora potrebnih za sortiranje svake podsekvence velicine n / 2 1 / x tacno jednak i kod odgovarajuce rekurzivne primjene algoritma , a to je (n/2 1 / x ) 1 x . Vazno je narocito da 2 1 / x bude cio broj konacne velicine. Time je osigurana gornja granica ukupnog vremena izvrsavanja , kao i postojanje svih m i -ova. Inicijalno, svih N raspolozivih procesora racunaju x iz N = n 1 x . Ako x ne zadovoljava uslove: gornji cio dio(1/x) ≤ 10 (i) n ≥ 2 gornjicio (1 / x ) (ii) onda najmani realan broj veci od x koji zadovoljava uslove (i) i (ii) se uzima umjesto x. Sam algoritam je dat u vidu procedure EREW SORT: −
1/ x
j
1
−
1 j +
2 j +
−
+ 1
j + 1
−
−
2
Slika 4.6: Podjela niza za sortiranje selekcijom
3
EREW SORT procedura procedure EREW SORT (S) if |S| ≤ k then QUICKSORT (S) else (1) for i = 1 to k - 1 do
PARALLEL SELECT (S, i | S | / k )
{Dobijanje m } i
end for
(2) S1 ← {s ∈ S: s ≤ m1} (3) for i = 2 to k - 1 do Si ← {s ∈ S: m
i− 1
≤
s≤ m } i
end for
(4) S ← { s ∈ S: s ≥ m } (5) for i = 1 to k/2 do in parallel EREW SORT (Si) k
k − 1
end for (6) for i = (k/2) + 1 to k do in parallel
EREW SORT (Si) end for end if.
Uocite da su u koracima od 2-4 sekvence Si su kreirane metodom skiciranom u Lekciji2 koja je povezana sa procedurom PARALLEL SELECT. Takodje u koraku 3, elementi iz S koji su manji od m i , a veci ili jednaki od m i su prvi smjesteni u Si. Ako je |Si| < | S | / k , onda su elementi jednaki sa m i dodati u Si, tako da je ili |Si| = | S | / k , ili nema preostalih elemenata za dodavanje u Si. Ovo je potsjecanje na uradjeno sa QUICKSORTom. Koraci 2 i 4 su izvrseni ekvivalentno. 1 −
Primjer 4.6
S = {5,9, 12, 16, 18,2, 10, 13, 17,4,7, 18, 18, 11, 3, 17,20,19, 14, 8, 5, 17, 1, 11, 15, 10,6} (tj. n =27). Neka imamo na raspolaganu pet procesora P1, P2, P3, P4, P5 na EREW SM SIMD racunaru (dakle N = 5). Stoga je 5 = (27) 1 x , x ≅ 0.5 , i k = 2 na 1 x tj 4. Rad procedure EREW SORT SORT za ove ulazne ulazne podatke je prikazan prikazan na slici 4.7. Koraci 1, m = 6, m 2 = 11, m = 17 su izracunati. izracunati. Cetiri Cetiri podsekvenc podsekvence e su kreirane kreirane S1, S2, S3 i S4 u koracima 2-4 kako je predstavljeno predstavljeno na slici 4.7 4.7 b). U koraku 5) procedura je primijenjena primijenjena reku rekurz rziv ivno no i isto istovr vrem emen eno o na S i Si. Si. Uoci Uocite te da je |S1| = |S2| |S2| = 7, pa je stog stoga a 71 x zaokruzeno na 2 (kako je predlozeno u lekciji2). Drugim rijecima 2 procesora se koriste za sortiranje svake od podsekvenci S1 i S2 (peti processor ostaje slobodan). Za S1 procesori P1 i P2 racunaju racunaju m1 = 2 , m2 = 4 i m3 = 5, i cetiri cetiri podsekvenc podsekvence e su kreirane kreirane {1,2}, {3,4}, {3,4}, {5,5}i {6} svaka u sortiranom poretku. Za S2, procesori P3 i P4 racunaju m1 = 8, m2 = 10 i m3 = 11 i cetiri podsekvence {7,8}, {9, l0},{10,11} i {11} svaka takodje u sortiranom poretku. Prikaz niza S na kraju koraka (5) dat je na slici 4.7c) . U koraku 6) procedura je rekurzivno i istovremeno primijenjena na S3 i S4. Kako je opet |S3| = 7 i |S4| = 6 , 7 1 x i 6 1 x su zaok zaokru ruze zeni ni na 2. Po dva dva proc proces esor ora a se kori korist ste e za sort sortir iran anje je svak svake e od podsekvenci S3 i S4. −
−
1
3
−
−
−
4
Za S3, m1 = 13, m2 = 15 i m3 = 17 su izracunati, kao i cetiri podniza {12, 13}, {14,15}, {16,17}i {17} i svaki je vec sortiran. Za S4, m1 = 18, m2 = 18 i m3 = 20 su izracunati, kao i cetiri podsekvence {17,18},{18,18},{19,20},{}. Prikaz niza S poslije koraka 5 je dat na slici 4.7d).
(a)Inicijalno
| |
S1
|
S2
|
S3
|
S4
S3
|
S4
(b)Poslije koraka (4)
| | (c)Poslije koraka (5)
(d) Poslije koraka (6) Slika 4.7: Sortiranje niza od 27 elemenata procedurom EREW SORT.
Analiza Poziv procedure QUICKSORT zahtijeva konstantno vrijeme. Kroz analizu procedure PARALLEL SELECT iz lekcije2 saznali smo da koraci 1-4 zahtijevaju cn x vremenskih jedinica za neku konstantu c. Vrijeme izvrsavanja procedure EREW SORT je stoga:
t(n) = cn x + 2t(n/k) = O(n x logn) Kako je p(n) = n 1 x , cijena procedure je c(n) = p(n) x t(n) = O(n log n), sto je optimalno. Uocite da kako je n 1 x < n/logn, optimalna cijena je ogranicena na prostoru N < n/log n. Procedura EREW SORT stoga odgovara proceduri CREW SORT prema performansama. (i) Ona koristi broj procesora N koji je podlinearan obimu ulaza n i prilagodjava se njemu. (ii) Ima malo vrijeme izvrsavanja koje se mijenja inverzno u odnosu na N. (iii) Cijena je optimalna za N < n/log n. −
−
Procedura EREW SORT ima dodatnu prednost, a to je mogucnost izvrsavanja na slabijem modelu izracunavanja koji ne dozvoljava visestruke operacije citanja iz iste memorijske lokacije.
5
Interesantno je takodje uociti da procedura EREW SORT predtavlja “Odraz u ogledalu” proceduri CREW SORT. Oba algoritma mogu teorijski biti modelirana pomocu binarnog drveta. U proceduri CREW SORT, podnizovi se unose u listovima, jedan podniz po listu, sortiraju se lokalno, potom se spajaju u par od strane roditeljskih cvorova, sve dok se rezultat ne dobije u korijenu. S druge strane, u proceduri EREW SORT, niz koji se sortira se upisuje u korijen i dijeli na dva nezavisna podniza {S1, … , Sj} i {S , …, S 2 j }. Podjela se zatim nastavlja u svakom cvoru zasebno, sve dok u svakom listu ne dobijemo podniz koji jednom kad se lokalno sortira daje rezultat na izlazu. j + 1
Brza Furijeova transformacija 6
Algoritam FFT nije jednostavan, i do njega se ne dolazi direktno. Ograničićemo se na samo jednu njegovu primjenu, mnozenje polinoma. Problem. Izracunati proizvod dva zadata polinoma p( x ) i q( x ). Formulacija problema je precizna samo na prvi pogled, jer nije preciziran nacin predstavljanja polinoma. Obicno se polinom P =
Predstavlja nizom svojih koeficijenata uz 1, x , x 2 , . . . , x n 1 ; ali to nije jedina mogućnost. Alternativa je predstavljanje polinoma stepena n - 1 svojimm vrijednostima u n različitih tačaka: te vrijednosti jednoznačno određuju polinom. Drugi način predstavljanja je interesantan zbog jednostavnosti množenja. Proizvod dva polinoma stepena n-1 je polinom stepena 2 n-2, pa je određen je svojim vrijednostima u 2 n-1 tačaka. Ako pretpostavimo da su vrijednosti polinoma činilaca date u 2n - 1 tačaka, onda se proizvod polinoma izračunava pomožu 2 n - 1, odnosno O(n) običnih mnozenja. Za dat polinom P(x) duzine n i polinom Q(x) duzine m ,možemo pretpostaviti da je m=n jer polinom možemo da dopunimo nulama.Ne umanjujući opštost pretpostavljamo n=m=2 k , m+n-2=2n-2=2(n1) Nažalost, predstavljanje polinoma vrijednostima za neke primjene nije pogodno. Primjer je izračunavanje vrijednosti polinoma u zadatim tačkama pri reprezentaciji vrijednostima, ovo je mnogo teže nego ako su zadati koeficijenti polinoma. Međutim, ako bismo mogli da efikasno prevodimo polinome iz jedne u drugu predstavu, dobili bismo odličan algoritam za množenje polinoma.Upravo to se postize primenom FFT. Prelaz od predstave polinoma koeficijentima na predstavu vrijednostima u tačkama, rešava se izračunavanjem vrijednosti polinoma.Vrijednost polinoma p( x ) (zadatog koeficijentima) u bilo kojoj tački može se pomoću Hornerove šeme izračunati pomouću n množenja. Izračunavanje vrijednosti p( x ) u n proizvoljnih tačaka izvodljivo je dakle pomoću n 2 množenja. Prelaz od predstave polinoma vrijednostima na predstavu koeficijentima zove se interpolacija. Interpolacija u opštem slučaju takođe zahtjeva O( n 2 ) operacija. Ovde je ključna ideja da se ne koristi proizvoljnih n tačaka: mi imamo slobodu da polje i izaberemo proizvoljan skup od n različitih tačaka. Brza Furijeova transformacija koristi specijalan skup tačaka, tako da se obje transformacije, izračunavanje vrijednosti i interpolacija, mogu efikasno izvršavati. Razmotrimo problem izračunavanja vrijednosti polinoma. Potrebno je izračunati vrednosti dva polinoma stepena n - 1 u 2n - 1 tačaka, da bi se njihov proizvod, polinom stepena 2n-2, mogao interpolirati. Međutim, polinom stepena n-1 može se predstaviti kao polinom stepena 2n-2 izjednačavanjem sa nulom vodećih n-1 koeficijenata. Zbog toga se bez gubitka opštosti može pretpostaviti da je problem izračunati vrijednosti proizvoljnog −
n −1
polinoma P = ∑a j x
j
stepena n- 1 u n različitih tačaka. Cilj je pronaći takvih n tačaka, u
j −0
kojima je lako izračunati vrijednosti polinoma. Zbog jednostavnosti pretpostavljamo da je n stepen dvojke. Koristićemo matričnu terminologiju da bismo uprostili označavanje. Izračunavanje vrijednosti polinoma P u n tačaka x ,... x n može se predstaviti kao izračunavanje proizvoda matrice i vektora: 0
1
−
7
Pitanje je kako izabrati vrijednosti x ,... x n tako da se ovo množenje uprosti. Posmatrajmo dvije proizvoljne vrste r i s. Voljeli bismo da ih ucinimo što sličnijim, da bismo uštedeli na mnozenjima. Ne moze se staviti xr = x s jer su tačke različite, ali se x r 2 = x s 2 može postići stavljajući. x s = −x r Ovo je dobar izbor, jer je svaki paran stepen xr jednak odgovarajućem parnom stepenu x s , neparni stepeni razlikuju se samo po znaku. Isto se može uraditi i sa ostalim parovima vrsta. Naslućuje se u kom pravcu treba tražiti n specijalnih vrsta, za koje bi se gornji proizvod svodio na samo n/ 2 proizvoda vrsta matrice sa kolonom koeficijenata. Rezultat bi bio polovljenje veličine ulaza, a time i vrlo efikasan algoritam. Pokušajmo da postavimo ovaj problem kao dva odvojena problema dvostruko manje veličine. Podjela polaznog problema na dva potproblema veličine m = n/ 2 može se opisati sledećim izrazom 0
1
−
Polazna n x n matrica podeljena je na dve vrlo sliqne podmatrice dimenzija n/ 2 x n. Za svako j = 0,1,…, n/ 2 -1, važi x n / 2 j = −x j . Zgodno je dakle napisati izraze za P ( x ) i P ( − x ), odnosno uopšte P ( x ), sa razdvojenim članovima parnog i neparnog stepena: j j
+
n / 2 −1
Ako sa P 0 ( x) = ∑a 2 j x , odnosno P 1 ( x) = j
j =0
n / 2 −1
∑a
2 j +1
x j
označimo polinome stepena n/ 2-
j =0
1 sa koeficijentima polinoma P parnog, odnosno neparnog indeksa, dolazimo do jednakosti P ( x) = P 0 ( x 2 ) + xP 1 ( x 2 )
Zamjenom x sa -x dobijamo P (− x) = P 0 ( x 2 ) + (− x ) P 1 ( x 2 ) Izračunavanje P ( x j ) , j = 0,1,..., n - 1 svodi se na računanje P ( x j ) i P ( − x j ) za j = 0, 1,...,n/ 2-1,odnosno na izračunavanje 2 2 samo n/ 2 vrijednosti P 0 ( x j ) , n/ 2 vrijednosti P 1 ( x j ) , i dopunskih n/ 2 sabiranja, n/ 2 oduzimanja i n množenja. Dakle, imamo dva potproblema veličine n/ 2 i O(n) dopunskih operacija. Može li se nastaviti rekurzivno na isti način? Ako bi nam to pošlo za rukom, došli bismo do poznate diferencne jednačine T (n) = 2T (n=2) +O(n), čije je rešenje T (n) = O(n log n). Problem izračunavanja P ( x ) (polinoma stepena n - 1) u n tačaka sveli smo na 2 izračunavanje P 0 ( x ) i P 1 ( x 2 ) (dva polinoma stepena n/ 2 - 1) u n/ 2 tačaka. To je regularna redukcija, izuzev jednog detalja: vrijednosti x u P ( x ) mogu se proizvoljno birati, ali vrijdnosti x u izrazu (na primjer) P 0 ( x 2 ) mogu biti samo pozitivne. Pošto smo do redukcije dolši korišćenjem negativnih brojeva, ovo predstavlja problem. Izdvojimo iz 2
8
prethodne
matrice
koja
odgovara
izračunavanju
vrijednosti P 0 ( x
2
):
Da bismo još jednom izveli redukciju na isti način, morali bismo da stavimo npr. 2 2 x / 4 = − ( x0 ) . Pošto su kvadrati realnih brojeva uvjek pozitivni,ovo je nemoguće, bar ako se ograničimo na realne brojeve. Poteškoća se prevazilazi prelaskom na kompleksne = ix brojeve. Problem se može opet podijeliti na dva dijela stavljajući x za j = 0,1...,n/ 4-1 (i je ovdje koren iz -1, kompleksan broj). Ovo razdvajanje zadovoljava iste uslove kao i prethodno. Prema tome, problem veličine n/ 2 može se riješiti svođenjem na dva problema veličine n/ 4, izvodeći O(n) dopunskih operacija.Za sledeće razdvajanje potreban nam je broj z takav da je z 8 = 1 i z j različito od 1 za 0 < j < 8, odnosno primitivni osmi korijen iz jedinice; tada je z 4 = -1 i z z 2 = i . Opštije, potreban nam je primitivni n-ti koren iz jedinice. Označimo ga sa ω (zbog jednostavnosti se n ne spominje eksplicitno; u okviru ovog odeljka radi se uvek o jednom istom n). Broj ω zadovoljava sledeće uslove: n
j +n / 4
Za n tačaka x ,... x n sledeći proizvod: 0
1
−
biramo brojeve 1, ω, ω 2 ,..., ω n
Ovaj proizvod se zove Furijeova transformacija vektora najpre da je ispunjen uslov
x n / 2
1
−
j
. Prema tome, izračunava se
( a 0 , a1 ,..., a n
ω n / 2+ j = ω n / 2 ω
j
1
−
).
Zapazimo
= − x j , j = 0,1,..., n/ 2 – 1.
Prema tome, prva redukcija problema veličine n na dva manja je i dalje ispravna.Dalje, dva potproblema proizaxla iz ove redukcije imaju po n/ 2 tačaka, ω, ω 2 ,..., ω n 1 , što je upravo problem veličine n/ 2, u kome umesto ω figuriše ω 2 - primitivni n/ 2-ti korijen iz jedinice. Prema tome, dalje se može nastaviti rekurzivno. Složenost algoritma zadovoljava diferencnu jednačinu T (n) = 2T (n/ 2) + O(n), čije je rešenje O(n log n). Algoritam omogućuje efikasno izračunavanje Furijeove transformacije vektora koeficijenata −
9
polinoma, pa je dobio ime brza Furijeova transformacija, odnosno FFT.
Inverzna Furijeova transformacija .
Brza Furijeova transformacija rešava samo pola problema: vrijednosti zadatih polinoma p( x ) i q( x ) mogu se efikasno izračunati u tačkama 1, ω, ω 2 ,..., ω n 1 , izmnožiti parovi dobijenih vrednosti, i tako naći vrijednosti polinoma p( x )q( x ) u navedenim tačkama. Ostaje problem interpolacije, odnosno određivanja koeficijenata proizvoda polinoma na osnovu vrednosti u tačkama. Na sreću, ispostavlja se da je problem interpolacije vrlo sličan problemu izračunavanja vrijednosti, i da ga rešava praktično isti algoritam. Vratimo se matričnoj notaciji. Neka A T transponovana matrica matrice A. Označimo vektor koeficijenata polinoma sa a = ( a 0 , a1 ,..., a n 1 ) T ; a vektor vrijednosti polinoma sa v = ( P (1), P (ω),…, P (ω n 1 )) T . Ako su zadati koeficijenti polinoma a, njegove vrijednosti v u n tačaka 1, ω, ω 2 ,..., ω n 1 dobijaju se prema izračunavanjem proizvoda v = V (ω)a. S druge strane, ako su zadate vrijednosti polinoma v = ( P (1) ,P (ω),…, P (ω n 1 )) T = (v 0 , v1 ,..., v n 1 ) T , a potrebno je izračunati njegove koeficijente, odnosno V (ω)a = v je sistem linearnih jednačina po a. Rešavanje sistema jednačina ima u opštem slučaju dosta veliku vremensku složenost O(n 3 ), ali se ovdje radi o jednom specijalnom sistemu jednačina. Lako se proverava da je V (ω) V (ω 1 )=nI gde je sa I označena jedinična matrica reda n. Zaista, ako je r razli čito od s, onda je proizvod (r +1)-e vrste matrice V (ω) i (s+1)-e kolone matrice V (ω 1 ) jednak −
−
−
−
−
−
−
−
n −1
Ako je pak r = s, onda je taj proizvod P 1 ( x) = ∑ω
rk −rk ω
= n . Time je
dokazana sledeća
k =0
teorema. Teorema 1. Inverzna matrica matrice V (ω) Furijeove transformacije je V (ω) =1/n V (ω 1 ) −
Rešavanje sistema jednačina v = V (ω)a svodi se dakle na izračunavanje proizvoda a =1/n V (ω 1 )v −
10
Posao se dalje pojednostavljuje zahvaljujući sledećoj teoremi. Teorema 2. Ako je ω onda je ω 1 takođe primitivni n-ti koren iz jedinice. Prema tome, proizvod 1/n V (ω 1 )v može se izračunati primenom brze Furijeove transformacije, zamenjujui ω sa ω 1 . Ova transformacija zove se inverzna Furijeova transformacija. −
−
−
Složenost. Uzimajući sve u obzir, proizvod dva polinoma može se izračunati izvodeći O(n log n) operacija (sa kompleksnim brojevima).
MERGE - Spajanje 11
Uvod
Pomenuli smo u poglavlju 2 da selekcija pripada klasi problema poznatih kao problemi poređenja. Drugi takav problem koji će biti razmatran u ovoj knjizi je problem spajanja. Definiše se kao: Neka su A=(a,, a,, ...,a,) i B=(b,, b,, ...,bs) dvije sekvence brojeva sortiranih u neopadajućem redosledu; zahtijeva se spajanje A i B, kojim se formira treća sekvenca C=(c1,c2,...,cr+s) takođe sortirana u neopadajućem redosledu, tako da svako iz C pripada ili A ili B i da se svako i svako pojavljuju tačno jednom u C. U kompjuterskim naukama, spajanje se pojavljuje u više konteksta uključujući baze podataka i fajl menadžment uopšte. Mnoge od ovih aplikacija, naravno, uključuju spajanje nenumeričkih podataka. Dalje, često je potrebno da jednom kad se spajanje završi da se izbrišu duplikati u rezultirajućoj sekvenci. Tipičan primjer je spajanje dvije mejl liste gdje je svaka sortirana po abecedi. Ove varijante ne nude novo proučavanje i mogu biti riješene prilično lako jednom kad je osnovni problem riješen. Spajanje je prilično dobro shvaćeno u sekvencijalnom modelu računanja i postoji jednostavan algoritam za njegovo rješenje. U najgorem slučaju, kad je r=s=n, algoritam se izvršava u O(n) vremena. Ovo je optimalno s obzirom da svaki element iz A i B mora biti posjećen bar jednom, ovo čini Ω (n) koraka potrebnih za spajanje. Naš cilj u ovom poglavlju je da pokažemo kako problem može biti riješen sa nekoliko paralelnih kompjuterskih modela. Treba uočiti Ω (n/N) najmanje moguće vrijeme potrebno za paraleni algoritam spajanja koji koristi N procesora. U odjeljku 3.2 počinje opisivanje specijalne namjene paralelne arhitekture za spajanje. Paralelni algoritam za CREW SM SIMD model je prezentovan u odjeljku 3.3 koji je adaptivan i optimalan. S obzirom da algoritam poziva sekvencijalnu proceduru za spajanje, ova procedure je takođe opisana u odjeljku 3.3. U odjeljku 3.4 je pokazano kako operacije konkurentnog čitanja mogu biti uklonjene iz paralelnog algoritma simulacijom toga na EREW kompjuteru. Konačno, adaptivni i optimalni algoritam za EREW SM SIMD model je prezentovan u odjeljku 3.5 čije je vrijeme izvršavanja kraće od vremena izvršavanja simulacije u odjeljku 3.4. Algoritam je baziran na sekvencijalnog proceduri za pronalaženje medijana dvije sortirane sekvence, što je takođe opisano u odjeljku 3.5.
Mreža za spajanje
U poglavlju 1 vidjeli smo paralelne arhitekture specijalne namjene mogu biti upotrebljene na bilo koji od sledećih načina: 1. korišćenjem specijalizovanih procesora sa uobičajenom međusobnom vezom 2. korišćenjem prilagođene veze unutar mreže za povezivanje standardnih procesora, ili 3.
korišćenjem kombinacije 1. i 2.
U ovom odjeljku mi ćemo uzeti treći od ovih pristupa. Spajanje će biti zadovoljeno kolekcijom veoma jednostavnih procesora koji komuniciraju kroz mrežu specijalne namjene. Ova paralelna arhitektura specijalne namjene je poznata kao (r,s)-spajajuća mreža. Svi procesori koji će biti korišćeni su identični i nazivaju se komparatorima. Kao što 12
je ilustrovano na slici 3.1, komparator ima dva ulaza i dva izlaza. Jedina operacija komparatora je da uporedi vrijednosti sa dva ulaza i da postavi manju i veću od njih dvije na gornju i donju izlaznu liniju respektivno. Korišćenjem ovih komparatora mi nastavljamo da gradimo mrežu koja uzima kao ulaz dvije sortirane sekvence A=(a1,a2,...,ar) i B=(b1,b2,..,bs) i proizvodi kao izlaz jednu sortiranu sekvencu C=(c1,c2,...,cr+s). Sledeća prezentacija je veoma pojednostavljena sa dvije pretpostavke: 1. dvije ulazne sekvence su iste veličine, tj. r=s=n≥1, i 2. n je stepen broja 2. Počinjemo razmatranjem spajajuće mreže za prve tri vrijednosti n. Kad je n=1, jedan komparator je dovoljan. On daje kao izlaz dva ulaza u sortiranom redu.
Slika 3.1 Komparator
Kad je n=2, vidje sekvence A=(a1,a2) i B=(b1,b2) su korektno spojene u mreži na slici 3.2. Ovo je lako dokazano. Procesor P1 upoređuje najmanji element A sa najmanjimm elementom B. Njegov gornji izlaz mora biti najmanji element u C, a to je c1. Slično, donji izlaz procesora P2 mora biti c4. Jedno dodatno upoređivanje je izvedeno od strane P3 za proizvođenje dva srednja elementa u C. Kad je n=4, možemo koristiti dvije kopije mreže sa slike 3.2 praćene sa tri komparatora, kao što je prikazano na slici 3.3 za A=(3,5,7,9) i B=(2,4,6,8). Uopšteno, (n,n)-spajajuća mreža je upotrebljena za sledeću rekurzivnu konstrukciju. Prvo, elementi niza A i B na neparnim pozicijama, a to su (a1, a3, a5, ..., an-1) i (b1, b3, b5, ..., bn-1) su spojene koristeći (n/2,n/2)-spajajuću mrežu za proizvođenje sekvence (d1, d2, d3, ...,dn). Istovremeno elementi niza na neparnim pozicijama su takođe spojeni korišćenjem (n/2,n/2)-spajajuće mreže za proizvođenje sekvence (e1, e2, e3, ..., en). Završna sekvenca (c1, c2, ...,c2n) je sačinjena od c1=d1, c2n=en, c2i=min(di+1, ei) i c2i+1=max(di+1,ei) za i=1, 2, ...,n-1. Završna poređena su izvendena na rangu n-1 komparatora kao što je prikazano na slici 3.4. Primijetimo da je svaka od (n/2,n/2)-spajajuća mreža konstruisana primjenom istog pravila rekurzivno, korišćenjem dvije (n/4,n/4)-spajajuće mreže praćene sa (n/2)-1 komparatorima. Spajajuća mreža na slici 3.4 je bazirana na metodi poznatoj kao par-nepar spajanje. Kako ova metoda uopšteno radi je prikazano u nastavku. Primijetimo prvo da je d1=min(a1,b1) i en=max(an,bn) što znači da su c1 i c2n izračunati pravilno. Sada posmatrajmo sekvencu (d1, d2, ..., dn), i elementi su manji ili jednaki sa di+1. Svaki od ovih neparno obilježenih elemenata je ili iz A ili iz B. Prema tome, 2i elementi iz A i B su manji ili jednaki sa di+1. Drugim riječima,
13
Slika 3.4 Spajanje dvije sekvence sa po dva elementa
Slika 3.3. Spajanje dva niza od po četri elementa di+,>= c2i . Slično tome, ei >= c2i. Sa druge strane, u nizu {c 1,c2, … c2n}, 2i elementi iz A i B su manji od ili jednaki c 2i+1. Ovo znači da c 2i+1 je veći od ili jedank (i+1) neparni elementi pripadaju jednom ili A ili B. Drugim riječima, c2i+, >= di+1. Slično, c2i+1 >= ei . Od c2i <= c2i+1 , prethodna nejednakost podrazumijeva da c 2i = min(di+1,ei), i c2i+1 = max(di+1,ei), tako da uspostavlja ispravnost neparnih čak i spajanje.
14
Analiza. Naša analiza spajanja će se koncentrisati na vrijeme, broj procesora, i ukupan
broj operacija potrebnih za spajanje. (i) Running Time. Počinjemo pretpostavljajući da komparator može da pročita unose, izvrši poređenje i praviti izlazne podatke sve u jednoj jedinici vremena. Sada, neka t(2n) označava vrijeme koje je potrebno za ( n,n) spajanje mreža za spajanje dvije sekvence dužine n svaka. Rekurzivna priroda ovkve mreže donosi sledeće ponavljanje za t(2n): t(2) = 1 t(2n) = t(n) + 1
za n = 1 za n > 1
(Pogledaj Sliku 3.1), (Pogledaj Sliku 3.4),
čije riješenje se lako može vidjeti da je t(2n) = 1 + log n . Ovo je znatno brže od najboljeg, naime, O(n),vrijeme izvršavanja postiže na sekvencijalnom računaru. Ovdje smo zainteresovani za brojanje broja komparatora potrebnih za neparno spajanje. Neka se sa p(2n) označava broj komparatora u (n,n) mrežnom spajanju. Opet imamo ponavljanje :
(ii) Broj procesora.
p(2) = 1
za n = 1 (Pogledaj Sliku 3.1),
p(2n) = 2p(n) + (n - 1) za n > 1 (Pogledaj Sliku 3.4), čije rješenje p(2n) = 1 + n log n je takođe jednostavan. (iii)
Cost. Budući da t(2n) = 1 + log n i p(2n) = 1 + n log n , ukupan broj poređenja
obavljenih od strane (n,n)spajanja mreže, tj mrežne cijene, je c(2n) = p(2n) x t(2n) = O(n log 2 n)
Naša mreža dakle ne košta optimalno jer obavlja više operacija nego O(n) dovoljnih za spajanje redom.
Diskusija. U ovom odeljku predstavljen je primjer posebne namjene arhitekture
za spajanje. Ovo spajanje mreža , kako smo ih nazvali, imaju sledeće interesantne mogućnosti : redoslijed poređenja koji obavljaju je fiksiran unaprijed. Bez obzira na ulaz mreža će uvijek obavljati isti broj poređenja u unaprijed određenom redoslijedu. To je razlog zašto se kaže da su takve mreže nesvjesne svojih ulaza. Naša analiza je pokazala da je (n,n)-spajanje mreža je izuzetno brzo, pogotovo kada se uporedi sa najboljim mogućim sekvencijalnim algoritmima za spajanje. Na primje, može spojiti dvije sekvence dužine 2 20 elemenata svako u dvadesetjedan korak: isti rezultat zahtjeva više od dva miliona koraka na sekvencionalni računar. Nažalost takva brzina se postiže korišćenjem nerazumnog broja procesora. Opet, za n=2 20, naše (n,n)-spajanje mreže se sastoji od preko dvadeset miliona komparatora! Pored toga, arhitektura mreže je veoma neredovna, i žice koje povezuju komparatore su dužine različite od n.
15
Ovo sugeriše da, iako teoretski privlačan, spajanje mreža ne bi bila praksa za velike vrijednosti n.
MERGING na CREW modelu Nase proucavanje odd-even merging-a je identifikovalo problem povezan sa mrezama za merging generalno, naime sa njihovom nefleksibilnoscu. Fiksan broj komparatora je sastavljen u fiksnu konfirugaciju da stapa sekvence fiksne velicine. Mada se ovo moze pokazati adekvatno za neke aplikacije, pozeljno je generalno da imamo pri ruci paralelni algoritam koji se prilagodjava broju raspolozivih procesora na paralelnom racunaru. Ova sekcija opisuje takav algoritam. Pored toga sto je adaptivan, algoritam je takodje I optimalan: potrebno vrijeme pomnozeno sa brojem koriscenih procesora je jednak, u okviru konstantnog faktora mnozenja, donjoj granici broja operacija potrebnih za merge. Algoritam radi na CREW SM SIMD modelu. To podrazumijeva postojanje I koriscenje sekvencijalne procedure za merging dvije sortirane sekvence. Sekvencijalni merging
Date su dvije sekvence brojeva A={a1,a2,…,ar } i B={b1,b2 ,...,bs} sortirane u neopadajucem poretku. Potrebno je spojiti A I B da formiramo trecu sekvencu C, takodje sortiranu u neopadajucem poretku. Proces spajanja obavlja jedan procesor. Ovo moze da uradi sledeci algoritam. Dva pokazivaca se koriste, jedan za svaku sekvencu. Inicijalno , pokazivaci su pozocionirani na elemente a 1 i b1, respektivno. Manji od a 1 i b1 se prodruzuje c1, i pokazivac na sekvencu iz koje je c 1 se pomijera jedno mjesto naprijed. Ponovo, dva elementa pod pokazivacima se porede, manji postaje c 2 i pokazivac ide naprijed. Ovo se nastavlja dok se jedna od dvije ulazne sekvence ne isprazni; elementi iz preostale sekvence se kopiraju u C. Algoritam je dat u sledecoj SEQUENTIAL MERGE proceduri. Opis je pojednostavljen podrazumijevajuci postojanje dva fikciona elementa a r+, i bs+, oba jednaka beskonacnosti.
16
Procedura uzima kao ulaz sekvence A i B i vraca na izlazu sekvencu C. Buducu da svako poredjenje vodi do kreiranja jednog elemenra u C, postoji tacno r+s takvih poredjenja, a u najgorem slucaju kad je r=s=n, recimo,algoritam radi za O(n) vremena. U pogledu na Ω(n) donju granicu na spajanju izvedenom u prethodnoj sekciji, procedura SEQUENTIAL MERGE je optimalna. Paralelni merging
CREW SM SIMD kompjuter se sastoji od N procesora P 1, P 2, ...,P N. Potrebno je dizajnirati algoritam za ovaj kompjuter koji uzima dvije sekvence A i B kao ulaz i daje C kao izlaz, kao sto je definisano ranije. Ne umanjujuci opstost podrazumijevamo da je r ≤s. Pozeljno je da paralelni algoritam zadovoljava osobine postavljene u sekciji 2.4, naime da: (i) broj procesora koji koristi algoritam bude sublinearan i prilagodljiv (ii) da vrijeme rada algoritma bude prilagodljivo i znacajno manje nego kod sekvencijalnog algoritma, i (iii) da cijena bude optimalna. Sada cemo opisati algoritam koji zadovoljava ove osobine. On koristi N procesora gdje je N≤r i u najgorem slucaju kada je r=s=n radi za O((n/N)+log n) vremena. Algoritam je dakle optimalan za N≤ n/log n. Pored osnovnih aritmetickih i logickih funkcija obicno dostupnih, svaki od N procesora se pretpostavlja sposobnim da izvede sledece dvije procedure: 1. Proceduru SEQUENTIAL MERGE 2. Proceduru BINARY SEARCH opisanu naprijed. Procedura uzima kao ulaz sekvencu S={s1,s2,...,sn} brojeva sortiranih u neopadajucem poretku i broj x. Ako broj x pripada S procedura vraca index k elemenra s s u S koji je jednak x. U suprotnom, procedura vraca 0. Binarno pretrazivanje je bazirano na principu podijeli pa osvoji. U svakom koraku se poredi x sa elementom iz S. Ili su dva elementa jednaka i procedura zavrsava, ili se polovina elemenata sekvence pod pretpostavkom, odbacuju. Proces se nastavlja dok je broj preostalih elemenata 0 ili 1, i nakon najvise jos jednog poredjenja procedura se zavrsava.
Buduci da je broj elemenata pod pretpostavkom reduciran za pola u svakom koraku, procedura treba O(log n) vremena u najgorem slucaju. Sada smo spremni da opisemo prvi paralelni algortiam za spajanje za racunar sa dijeljenom memorijom. Algoritam je prezentovan kao procedura CREW MERGE.
17
Korak 1: {Selektuj N-1 element od A koji dijeli sekvencu na N podsekvenci aproksimativno iste velicine. Nazovimo ovu podsekvencu A', B' je podsekvenca od B dobijena na isti nacin. Ovaj korak se radi kao: }
Korak 2: {Merge A'i B'u sekvencu trojki V={v1,v2,...,v2N-2}, gdje se svaka trojka sastoji od elemenata A' ili B' koji slijede po poziciji u A' ili B' koji slijede po imenu originalne sekvence koja je A ili B. Ovo se radi kao: } (i)
procesor Pi koristi BINARY SEARCH na B' da nadje najmanje j takvo da je ai'
(ii)
if postoji j
end if end for (i) (ii)
procesor Pi koristi BINARY SEARCH na A' da nadje najmanje j takvo da je bi'
end if end for.
Korak 3: {Svaki procesor spaja i ubacuje u C elemente dvije podsekvence, jedne iz A i jedne iz B. Indeksi ova dva leemnta(jednog iz A i jednog iz B) na kojima svaki procesor pocinje spajanje, su prvo izracunati i sacivani u nizu Q uredjenih parova. Ovaj korak se radi kao:}
(i) koristi BINARY SEARCH na B da nadje najmanji element j takav da je
b j>ak'
18
Procesor Pi koristi SEQUENTIAL MERGE i Q(i)=(x,y) da spoji dvije podsekvence jednu koja pocinje od a x i drugu koja pocinje od by i postavlja rezultat spajanja u niz C pocevsi od pozicije x+y-1. Spajanje se nastavlja dok (i) ne naidje element veci ili jednak prvoj komponenti od v 2i ,u svakom od A i B (kada je i ≤N-1) (ii) nijedan element ne ostane ni u A ni u B (kada je i=N) end for.□ Prije analize vremena rada algoritma, napravicemo sledeca dva napomene U generalnim slicajevima, element a i iz A se poredi sa b i iz B da se odredi (i) koji je manji; ako se ispostavi da su jednaki, algoritam odlucuje da vrati a i. (ii) Operacije konkurentnog citanja se vrse kad god se pozove procedura BINARY SEARCH, naime,u koracima 2.1, 2.2, i 3.2. Zaista, u svakom od ovih primjera vise procesora radi BINARY SEARCH nad istom sekvencom. Analiza.Korak po korak analiza CREW MERGE:
Korak 1: Svi procesi rade paralelno, i svaki racina dva indeksa. Stog aje potrebno konstantno vrijeme. Korak 2: Ovaj korak se sastoji od dvija poziva BINARY SEARCH procedure za sekvencu duzine N-1, svaki pracen naredbom dodjele. Ovo uzima O(log s) vremena. Korak 3: Korak 3.1 se sastoji od dodjela konstantnog vremena, a korak 3.2 zahtijeva najvise O(log s) vremena. Da analiziramo korak 3.3 prvo vidimo da V sadrzi 2N-2 elementa koji dijele C u 2N-1 podsekvence sa maksimalnom velicinom jednakom ([r/N]+ [s/N]). Ova m aksimalna velicina se pojavljuje ako,npr. jedan element a i' iz A' je jednak elementu b' iz B'; tada je [r/N] elemenata manjih ili jednakih od ai' (i vecih ili jednakih od a i1' ) takodje manje ili jednako od b j', i slicno, [s/N] elemenata manjih ili jednakih od b j'(i vecih ili jednakih od bi-1') su takodje manji ili jednaki od a i'. U koraku 3 svaki procesoe pravi dvije takve podsekvence od C cija totalna velicina stoga nije veca od 2([r/N]+[s/N]), osim P, koji pravi samo jednu podsekvencu od C. Slijedi da procedura SEQUENTIAL MERGE uzima najvise O((r+s)/N) vremena. U najgorem slucaju, r=s=n, i buduci da je n≥N, vremenom izvrsavanja algoritma dominira vrijeme potrebno u koraku 3. Tako t(2n)=O((n/N)+ log n)
Kako je p(2n)=N, c(2n)= p(2n) x t(2n)=O(n+N log n), i cijena algoritma je optimalna za N≤n/log n. Primjer
Pretpostavimo da je dostupan CREW SM SIMD racunar sa 4 prosesora, i potrebno je spojiti A={2,3,4,6,11,12,13,15,16,20,22,24} i B={1,5,7,8,9,10,14,17,18,19,21,23}, i r=s=12. Dvije podsekvence A'={4,12,16} i B'={7,10,18} su nadjene u koraku 1 i zatim spojene u koraku 2 da se dobije V={(4,1,A),(7,1,B),(10,2,B),(12,2,A),(16,3,A),(18,3,B)}. U koracima 3.1 i 3.2 suodredjeni: Q(1)=(1,1), Q(2)=(5,3),Q(3)=(6,7) i Q(4)=(10,9). U koraku 3.3 procesor P 1 pocinje od elementa a,=2 i b1=2 i spaja sve elemente A i B manje od 7, tako praveci podsekvencu {1,2,3,4,5,6} od C. Slicno procesor P 2 opcinje od a ,=11 i b3=7 i spaja sve elemente manje od 12, praveci {7,8,9,10,11}. Procesor P 3 pocinje od
19
a,=12 i b,=14 i pravi {12,13,14,15,16,17}. Konacno P 4pocinje od a,,=20 i b 9=18 i pravi {18,12,20,21,22,23,24}. Rezultujuca sekvenca C je tada {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24}. Elementi od A' i B' su podvuceni u C.□
Spajanje na EREW modelu Kao sto smo vidjeli u prethodnom poglavlju konkurentne operacije za čitanje se izvode na nekoliko mjesta procedure CREW MERGE. Sada pokazujemo kako ova procedura može biti prilagođena da radi na N-procesora EREW SM SIMD kompjuteru, koji po definiciji, ne dopušta bilo koji pokušaj da više od jednog procesora pristupa memorijskoj lokaciji. Ideja prilagođavanja je prilično jednostavna: sve što treba da uradimo jeste da simuliramo operacije višestrukog čitanja. Jednom kada se takva simulacija pronađe, može se koristiti od strane algoritma paralelnog spajanja(i u suštini od strane bilo kojeg algoritma sa operacijama višestrukog čitanja) za izvođenje bilo svake read operacije iz EREW memorije. Naravno zahtijeva se da ova simulacija bude efikasna. Jednostavno čekanje svih zahtjeva da se čitaju sa date memorijske lokacije i njihovo opsluživanje jednog za drugim je neadekvatno: to može povećati vrijeme izvršavanja za factor N u najgorem slučaju. Sa druge strane, korišćenje procedure BROADCAST iz poglavlja 2 je neprikladno: operacija višestrukog čitanja iz memorijske lokacije ne mora obavezno uključiti sve procesore. Tipično, nekoliko proizvoljnih podskupova skupa procesora pokušava da dobije pristup različitim lokacijama, jednu lokaciju po podskupu. Sada ćemo predstaviti formalniju proceduru MULTIPLE BROADCOST. Pretpostavimo da algoritam napravljen da radi na CREW SM SIMD kompjuteru zahtijeva ukupno M lokacija dijeljene memorije. U želji da simuliramo ovaj algoritam na EREW modelu sa N procesora gdje je N= 2q za q ≥ 1 povećavamo veličinu memorije od M do M(2N-1). Dakle svaku od M lokacija zamišljamo kao korijen binarnog drveta sa N listova. Svako drvo ima q+1 nivoa i ukupno 2N-1 čvorova kako što je prikazano na slici 3.5 za N=16. Čvorovi drveta predstavljaju uzastopne lokacije u memoriji. Dakle ako je lokacija D korijen, onda su njegov lijevi i desni potomak D+1 i D+2 respektivno. U suštini, lijevi i desni potomak od D+x su D+x+1 i D+x+2 respektivno. Pretpostavimo da procesor P i želi da u nekom trenutku čita iz neke lokacije d(i) u memoriji. On stavlja svoj zahtjev na lokaciju d(i)+(N-1)+(i-1), list stabla ukorijenjenog u d(i). Ovo se radi inicijalizacijom 2 lokalne promjenljive u P i : 1. level(i) , koja čuva trenutni nivo do kojeg je P i zahtjev stigao, je inicijalizovana na 0 i 2. loc(i) , koja čuva trenutni čvor drveta do kojeg je došao P i zahtjev je inicijalizovan na (N-1)+(i-1). Primijetimo da Pi samo treba da čuva poziciju u drvetu povezanom sa d(i) i da je njegov zahtjev dostignut i nije stvarna memorijska lokacija d(i) + (N - 1) + (i - 1).
20
Simulacija se sastoji od 2 faze: faze ascent i descent . U toku faze ascent procesori se ponašaju na sledeći način: Na svakom nivou procesoru P i koji zauzima lijevog potomka se daje prvo prioritet da nastavi sa svojim zahtjevom nivo iznad u drvetu.
To se izvodi markiranjem lokacije roditelja posebnim markerom , recimo [i]. On tada update-uje svoju lokaciju i nivo. U tom slučaju zahtjev kod desnog potomka je imobilizovan za ostatak postupka. U suprotnom(tj. Ako nema procesora da zauzima lijevog potomka) procesor koji zauzima desnog potomka može “dobiti” lokaciju roditelja. Ovo se nastavlja sve dok najviše 2 procesora dostignu nivo (logN)-1. Svaki od njih redom čita vrijednosti smještene u korijenu i faza descent počinje. Upravo pročitana vrijednost ide niz drvo memorijskih lokacija sve dok svaki zahtjev za čitanjem od strane procesora nije ispunjen.
21