Rinnakkaistietokoneet luento 3 521475S
Rinnakkaiset Numeeriset Algoritmit Silmukattomat algoritmit Eivät sisällä silmukka lauseita kuten DO,FOR tai WHILE Nopea suorittaa Yleisimmässä muodossa koostuu peräkkäisistä sijoituslauseista, esim. a = b + c; b = d + a Silmukoiden puuttuminen poistaa indeksit ja riippuvuusvektorit
Rinnakkaisuus lauseen sisällä Rinnakkaisuus lauseen sisällä saadaa hyödynnettyä käyttämällä hyväksi aritmeettisten lausekkeiden ominaisuuksia: kommutatiivisuus: esim. ab = ba distributiivisuus: esim. a(b + c) = ab + ac assosiatiivisuus: esim. a + (b + c) = (a + b) + c Lausekkeet kooostuvat atomeista (operandit) ja aritmeettisista operaatiosta (+, *, -) tai loogisista operaatioista (OR,AND) Yhdellä prosessorilla lausekkeen, jossa on n operandia, kestää n 1 aikayksikköä (n-1 operaatioiden lkm., kun yksi operaatio suoritetaan aina kahden operandin välillä)
Käytettäessä haluttua määrää prosessoreita. lauseke voidaan evaluoida log(n) aikayksiköässä (kahden logaritmi), eli jokaisella aikayksiköllä operandien määrä puoliintuu log(n) on lausekkeen evaluointiin käytettävien aikayksiköiden määrän teoreettinen alaraja (lower bound): ei sisällä laskennan vaatiman kommunikoinnin viemää aikaa, joka on selviö, kun evaluointi tehdään fyysisellä koneella Esimerkki: kahdeksan (8) luvun yhteen lasku:
Puun korkeuden pienentäminen (treeheight reduction) Puun korkeus rinnakkaislaskennassa tarkoittaa laskennan vaatimien askelten (aikayksiköiden) lukumäärää Tavoite on pienentää puun korkeutta ja kasvattaa rinnakkaisuutta Katsotaan lauseketta (((a+b) * c) * d) käyttämällä hyväksi assosiatiivisuus ominaisuutta lauseke saadaan muotoon (a+b) * (c*d):
Puun korkeutta voidaan pienentää myös hyödyntämällä kommutatiivisuutta:
Puun korkeuden pienentäminen hyödyntämällä distributiivisuutta:
Lauseiden välinen rinnakkaisuus Lauseiden välistä rinnakkaisuutta voidaan analysoida muodostamalla riippuvuusgraafeja Vaikka lauseiden välillä on riippuvuuksia, rinnakkaisuutta voidaan joskus kasvattaa uudelleen kirjoittamalla lauseet: lauseen sijoitus (statement substitution) on yksi tapa Katsotaan esimerkkiä: S1: x = a + bcd S2: y = ex + f S3: z = my + x datavuograafi on esitetty kuvassa 2.8a Lausekkeiden riippuvuuksista johtuen ei hyödynnettävää rinnakkaisuutta laskennassa
Kuva 2.8a
Rinnakkaisuutta voidaan kuitenkin hyödyntää muuttujatasolla: sijoittamalla S1 ja S2 lauseeseen S3 saadaan uusi lause S: S: a + mf + bcd + mea + bcdem jossa on hyödynnettävää rinnakkaisuutta: datavuograafi kuvassa 2.8b
Kuva 2.8b
Matriisin kertolasku A ja B kaksi n x n matriisia Tulo C = AB, missä jokainen C:n elementti on muotoa: ij Kertolasku voidaan esittää sisäkkäisiä silmukoita käyttäen ohjelmana: for i = 1 to n for j = 1 to n for k = 1 to n c k ij = ck-1 ij + a ik b kj end k end j end i n c = a k = 1 ik b kj
Kirjoitetaan ohjelma muodossa: D = for i = 1 to n for j = 1 to nfor k = 1 to n a(i,j,k) = a(i,j-1,k) b(i,j,k) = b(i-1,j,k) c(i,j,k) = c(i,j,k-1) + a(i,j,k)b(i,j,k) end k end j end i [ d d ] 1 2 d3 = 1 0 0 0 1 0 0 0 1 b a c i j k Lause a(i,j,k) = a(i,j-1,k) ilmaisee, että muuttujan a arvo on iteraatioavaruuden pisteessä (i,j,k) riippumaton indeksistä j: ts. muuttujan a:n arvo määräytyy (i,k)-tason pisteen mukaan (kts. kuva 2.9) Vastaavasti lause b(i,j,k) = b(i-1,j,k) ilmaisee, että muuttujan b arvo on iteraatioavaruuden pisteessä (i,j,k) riippumaton indeksistä i: ts. muuttujan b:n arvo määräytyy (j,k)-tason pisteen mukaan (kts. kuva 2.9) i määrää matriisi A:n rivin ja k elementin rivin sisällä (i ja k määrittävät yksiselitteisesti matriisin elementin) j määrää matriisi B:n sarakkeen ja k elementin sarakkeen sisällä (j ja k määrittävät yksiselitteisesti matriisin elementin)
Muuttujat a, b ja c määritellään seuraavasti: a(i,j,k) = a j ik b(i,j,k) = b i kj c(i,j,k) = c k ij missä alaindeksit identifioivat fyysisen muuttujan (muistipaikan) ja yläindeksi antaa muuttujalle ajallisen ulottuvuuden: esim. c(i,j,k) ja c(i,j,k-1) viittaavat samaan muistipaikaan eri ajan hetkinä (= eri k:n iteraatioilla)
Kuva 2.9: Datavuo ja riippuvuudet C:n sarake (j = C:n sarake) ( i = C:n rivi) sisätulo: muodostaa yhden C:n elementin riville i ja sarakkeelle j
Sekventiaalisessa tapauksessa (eli 1 prosessori käytössä) matriisin kertolaskun ajallinen kompleksisuus on O(n 3 ) (määriteltynä tarvittavien kertolaskujen mukaan) jokainen sisätulon tekijä a ik b kj lasketaan peräkkäin (ei rinnakkain) ja jokaiselle C:n elementille (joita on yhteensä n x n kpl) lasketaan n tekijää (kertolaskua) O(n 3 ) vastaan kuvan 2.9 kuution solmujen lukumäärää
Jos käytössä on n prosessoria voidaan laskea C:n rivejä (tai sarakeita) rinnakkain: eli yksi prosessori laskee aina yhden C:n rivin (tai sarakkeen) n riviä valmistuu yht aikaa eli kompleksisuus putoaa O(n 2 ) Jos käytetään n 2 prosessoria, jokainen prosessori voi laskea yhden C:n elementin rinnakkain muiden kanssa yksi C:n rivi valmistuu yhden askeleen aikana kompleksisuus on O(n) Jos käytetään n 3 prosessoria voidaan jokainen kertolasku laskea yhden askeleen aikana kompleksisuus on O(log(n)), eli saman kuin laskettaessa yhteen n lukua (jokaisen sisätulon vaatimia yhteenlaskuja voidaan suorittaa rinnakkain. Yhteenlaskuja on n-1 kappaletta / C:n elementti, joista voidaan laskea aina puolet saman aikaisesti jokaiselle C:n elementille O(log(n)) O(log(n)) on rinnakkaislaskennan kompleksisuuden teoreettinen alaraja matriisin kertolaskun tapauksessa
Relaksaatio (relaxation) Menetelmä jota käytetään mm.: Osittaisdifferentiaaliyhtälöiden numeerisessa ratkaisussa Kuvankäsittelyssä Relaksaatio voidaan kuvata seuraavalla silmukalla: for i = 1 to l for j = 1 to m for k = 1 to n u(i,j,k) = ¼[u(i-1,j+1,k)+u(i-1,j,k+1)+u(i,j-1,k)+u(i,j,k-1)] end k end j end i Menetelmä päivittää muuttujan u:n arvon pisteessä (i,j,k) valittujen ympäristön muuttujien keskiarvolla
Em. Relaksaatio-ohjelma on ensimmäisiä algoritmeja, joita analysoitiin rinnakkaislaskennan näkökulmasta [Lambort 1974] on tutkinut relaksaatio-menetelmän rinnakkaistamista ja esitteli ajatuksen hypertasosta: tasossa oleva joukko iteraatioavaruuden pisteitä joissa laskenta voidaan tehdä rinnakkaisena Hypertaso on hyödyllinen käsite johon mm. algoritmien muunnokset perustuvat Silmukka suoritetaan lmn kertaa: kerran jokaisessa indeksijoukon pisteessä (i,j,k) Tutkitaan millaista rinnakkaisuutta algoritmissa esiintyy ja mikä on laskentaan käytettävä aika
Katsotaan u(8,2,4) laskemista. u(8,2,4) on keskiarvo arvoista u(7,3,4),u(7,2,5) (laskettu iteraatiolla i=7),u(8,1,4) ja u(8,2,3) (laskettu iteraatiolla i=8) for i = 1 to l for j = 1 to m for k = 1 to n u(i,j,k) = ¼[u(i-1,j+1,k)+u(i-1,j,k+1)+u(i,j-1,k)+u(i,j,k-1)] end k end j end i
Kuva 2.10: (k,j)-indeksitaso ja riippuvuudet L7 L8 (8,2,4) riippuvainen arvoista, pisteissä: (7,2,5),(7,3,4),(8,1,4) ja (8,2,3), joka riippumattomia toisistaan ja voidaan laskea rinnakkain laskennan eteneminen iteraatiolla i
Pisteet (8,2,4),(8,3,3) ja (8,4,2) voidaan laskea samanaikaisesti: sijaitsevat suoralla j + k = 6, kun i = 8 (eli, k = -j + 6, kun i = 8) Kaikki pisteet tällä suoralla voidaan laskea samanaikaisesti Vastaavasti pisteet (7,2,5),(7,3,4),(7,4,3) ja (7,5,2) suoralla j + k = 7, kun i = 7, voidaan laskea samanaikaisesti keskenään Pisteet suorilla L8 ja L7 voidaan laskea samanaikaisesti, koska laskenta suorien pisteissä riippuu aikaisemmin lasketuista arvoista Suorien L8 ja L7 pisteet kuuluvat tasolle 2i + j + k = 21
Kuva 2.11: hypertaso 2i+j+k +c = 0 indeksiavaruudessa tällä tasolla oleville pisteille (i,j,k) laskenta voidaan tehdä rinnakkain silmukkaa suoritettaessa
Tapa 2: analysoidaan käyttäen riippuvuusvektoreita: D = [ d d d ] 1 2 3 d4 1 = 1 0 Riippuvuusmatriisista nähdään, että esim. piste (8,2,4) on riippuvainen pisteistä (7,3,4),(7,2,5),(8,2,3) ja (8,1,4) (ts. piste (8,2,4) on käyttäjä, joka käyttää aiemmin tuotettuja arvoja ja riippuvuusvektorit kertovat siirtymän tuottajasta käyttäjään, eli pisteeseen (8,2,4)) Tason 2i+j+k + c = 0 tulkinta on, että kaikki riippuvuusvektorit tämän tason pisteille kulkevat samaan suuntaan, eli riippuvuudet (4kpl) tulevat edelliseltä rinnakkain lasketulta tasolta tämän hetkiselle tasolle: eli ei riippuvuuksia saman tason pisteiden välillä, mikä luonnollisesti tuhoaisi rinnakkaisuuden 1 0 1 0 0 1 0 1 0
Rinnakkaislaskennan vaatima aika riippuu kriittisestäpolusta, jolla tarkoitetaan polkua indeksiavaruudessa, jonka kahta pistettä ei voida suorittaa samanaikaisesti: polku ei ole välttämättä uniikki Esim. edellisessä esimerkissä, kriittinen polku muodostuu pisteistä, joista jokainen on eri rinnakkain laskettavalla tasolla (jokaiselta tasolta voidaan valita mielivaltainen piste, eli kriittinen polku ei ole uniikki) Kriittisen polun pituus antaa teoreettisen minimin rinnakkaislaskenta-askelten lukumäärälle (se, että kriittinen polku ei ole uniikki, ei muuta polun pituutta, eli siinä olevien pisteiden lukumäärää) Em. esimerkissä laskennallinen kompleksisuus on O(l+m+n), mikä viittaa rinnakkain laskettavien tasojen lukumäärään (karkeasti indeksiavaruuden diagonaalin pituuteen): tämä on huomattava parannus sekventiaaliseen aikaan O(lmn)