Paralelna obrada

S Vikipedije, slobodne enciklopedije
IBM-ov Blu Džin (engl. Blue Gene)

Paralelna obrada je oblik računanja u kojem su mnogi proračuni sprovedeni istovremeno, a radi na principu da se veliki problemi često mogu podeliti na manje, koji se zatim rešavaju istovremeno („paralelno“). Postoji nekoliko različitih oblika paralelnog računarstva: bit-nivo, nivo instrukcija, podataka, i task paralelizam. Paralelizam se koristi već mnogo godina, uglavnom u računarstvu visokih performansi, ali interesovanje za njega je u poslednje vreme poraslo zbog fizičkih ograničenja koje sprečavaju skaliranje frekvencije. Kako je potrošnja energije (a samim tim i roizvodnja toplote) računara postala problem u poslednjih nekoliko godina, paralelno računarstvo je postalo dominantna paradigma u računarskoj arhitekturi, uglavnom u obliku višejezgranih procesora.

Paralelni računari se mogu grubo klasifikovati prema nivou na kojem hardver podržava paralelizam: gde višejezgrani i višeprocesorski računari imaju više elemenata obrade unutar jedne mašine, a klasteri, MPPS i rešetke koristite više računara da rade na istom zadatku. Specijalizovane paralelne računarske arhitekture se ponekad koriste zajedno sa tradicionalnim procesorima, za ubrzavanje specifičnih zadataka.

Teže je pisati paralelne računarske programe nego sekvencijalne, jer konkurentnost uvodi nekoliko novih klasa potencijalnih softverskih grešaka. Komunikacija i sinhronizacija između različitih podzadataka su obično neke od najvećih prepreka za dobijanje dobrih performansi paralelnog programa.

Maksimalna moguća brzina nekog programa kao rezultat paralelizacije je poznat kao Amdalov zakon.

Pozadina[uredi | uredi izvor]

Tradicionalno, računarski softver je napisan za serijsko izračunavanja. Za rešavanje problema, algoritam je konstruisan i realizovan kao serijski tok instrukcija. Ove instrukcije se izvršavaju na procesoru na jednom računaru. Samo jedna instrukcija može izvršiti u vreme nakon što se završi prethodna instrukcija.

Paralelno računarstvo, s druge strane, koristi više elemenata za obradu istovremeno da reši problem. Ovo se postiže podelom problema na nezavisne delove, tako da svaki element obrade može da izvrši svoj deo algoritma istovremeno sa ostalima. Elementi obrada mogu biti raznovrsni i obuhvataju resurse kao što su računar sa više procesora, nekoliko umreženih računara, specijalizovani hardver, ili bilo koju njihovu kombinaciju.

Frekvencijsko skaliranje je bio dominantan razlog za poboljšanje performansi računara od sredine 1980-ih do 2004. Izvršavanja programa je jednako broju instrukcija pomnožen prosečnim vremenom po instrukciji. Održavanje svega ostalog konstantnim i povećavajući frekvenciju takta smanjuje se prosečno vreme koje je potrebno da se izvrši instrukcija. Povećanje takta na taj način smanjuje vreme rada za sve programe sa računanjem.

Međutim, potrošnja energije po čipu je data jednačinom P = C × V2 × F, gde je P snaga, C je kapacitivnost kada se uključi po ciklusu (srazmerno broju tranzistora čiji ulaz se menja), V je napon, i F je takt. Povećanje takta povećava količinu energije koja se troši. Povećanje potrošnje energije je konačno dovelo do toga da Intel maja 2004 otkaže svoje Teksas i Džejhak procesore, što se obično navodi kao kraj frekvencijskog skaliranja kao dominantne paradigme arhitekture računara.

Murov zakon je empirijsko zapažanje da se gustina tranzistora u mikroprocesoru udvostručuje svakih 18 do 24 meseci. Uprkos problemima potrošnje energije, i ponovljenih predviđanja njegovog kraja, Murov zakon i dalje na snazi. Sa završetkom frekvencijskog skaliranja, ovi dodatni tranzistori (koji se više ne koriste za frekvencijsko skaliranje) mogu da se koriste za dodavanje dodatnog hardvera za paralelno računarstvo.

Amdalov zakon i Gustafsonov zakon[uredi | uredi izvor]

Grafički prikaz Amdalovog zakona

Optimalno, ubrzanje usled paralelizacije bi bilo linearno. Udvostručavanje broja procesnih elemenata bi trebalo da prepolovi vreme putovanja, i to udvostručenje drugi put bi trebalo da ponovo prepolovi vreme rada. Međutim, veoma mali broj paralelnih algoritama postigne optimalno ubrzanje. Većina njih ima skoro linearno ubrzanje za mali broj procesnih elemenata, koji se poravnava u konstantnoj vrednosti za veliki broj procesnih elemenata.

Potencijalno ubrzanje algoritma na paralelnoj platformi je po Amdalovom zakonu, koji je prvobitno formulisao Džin Amdal 1960. On navodi da će mali deo programa koji se ne može paralelizirati ograničiti ukupno ubrzanje pri paralelizaciji. Program koji rešava veliki matematički ili inženjerski problem se obično sastoji od nekoliko delova koje je moguće paralelizirati i nekoliko delova koje nije moguće paralelizirati (uzastopni delovi). Ako je deo vremena rada koje program troši na delove koji se ne mogu paralelizirati, onda:

je maksimalno ubrzanje paralelizacijom programa. Ako sekvencijalni deo programa čini 10% od radnog vremena (), ne može se dobiti više od 10 × ubrzanja, bez obzira na to koliko je procesora dodato. Ovo stavlja gornju granicu na korisnost dodavanja više uporednih izvršnih jedinica. „Kada zadatak ne može biti raspodeljen zbog uzastopnih ograničenja, primena višeg napora nema uticaja na raspored. Nošenje deteta traje devet meseci, bez obzira na to koliko žena nosi decu."

Gustafsonov zakon je još jedan zakon u računarstvu, blisko povezan sa Amdalovim zakonom. On navodi da je ubrzanje sa procesora:

I Amdalov i Gustafsonov zakon pretpostavljaju da je radno vreme sekvencijalnog dela programa nezavisno od broja procesora. Amdalov zakon pretpostavlja da je ceo problem fiksne veličine, tako da je ukupan iznos posla koji treba da se uradi paralelno takođe nezavisan od broja procesora, dok Gustafson zakon pretpostavlja da ukupan iznos posla koji treba da se uradi paralelno varira linearno sa brojem procesora.

Zavisnosti[uredi | uredi izvor]

Razumevanje zavisnosti podataka je ključno u sprovođenju paralelnih algoritama. Nijedan program ne može da radi brže od najdužeg lanca zavisnih proračuna (poznat kao kritičan put), jer se kalkulacije koje zavise od prethodnih kalkulacija u lancu moraju izvršiti po redu. Međutim, većina algoritama se ne sastoji samo od dugog lanca zavisnih proračuna, već obično postoje mogućnosti da se izvrši nezavisno računanje paralelno.

Neka su Pi i Pj dva segmenta programa. Bernstajnovi uslovi opisuju kada su one nezavisne i kada se mogu izvršiti paralelno. Za Pi, neka Ii budu sve ulazne promenljive a Oi, a isto tako za Pj.

Povreda prvog uslova uvodi zavisnost protoka, što odgovara prvom segmentu koji proizvodi rezultat korišćen od drugog segmenta. Drugi uslov predstavlja anti-zavisnost, kada drugi segment (Pj) proizvodi promenljivu koja je potrebna prvom segmentu (Pi). Treći i poslednji uslov predstavlja izlaznu zavisnost: kada dva segmenta pišu na istoj lokaciji, rezultat dolazi iz poslednjeg logički izvršenog segmenta.

Razmotrite sledeće funkcije koje pokazuju nekoliko vrsta zavisnosti:

1: function Dep(a, b)
2: c := a•b
3: d := 3•c
4: end function

Operacija 3 u Dep(a, b) ne može da se izvrši pre (ili čak paralelno sa) operacijom 2, jer operacija 3 koristi rezultat iz operacije 2. To krši uslov 1, i na taj način uvodi zavisnost u algoritam.

1: function NoDep(a, b)
2: c := a•b
3: d := 3•b
4: e := a+b
5: end function

U ovom primeru, ne postoje zavisnosti između instrukcija, tako da svi oni mogu biti izvršeni paralelno. Bernstajnovi uslovi ne dozvoljavaju da se memorija deli između različitih procesa. Zbog toga je neophodno neko sredstvo za sinhronizaciju između adresa, kao što su semafore, barijere ili neka druga metoda sinhronizacije.

Race uslovi, zajedničko isključenje, sinhronizacija i paralelno usporavanje[uredi | uredi izvor]

Podzadaci u paralelnom programu se često nazivaju nitima. Neke paralelne računarske arhitekture koriste manje, lagane verzije niti poznatih kao vlakna (engl. threads), dok druge koriste veće verzije poznate kao procesi. Međutim, „niti“ su opšte prihvaćene kao opšti izraz za podzadatke. Niti često treba da ažuriraju vrednosti promenljivih koje se dele između njih. Instrukcije između dva programa mogu biti prošarane u bilo kom redosledu. Na primer, razmotrite sledeći program:

Nit A Nit B
1A: Čitaj promenjivu P 1B: Čitaj promenjivu P
2A: Dodaj 1 na promenjivu P 2B: Dodaj 1 na promenjivu P
3A: Piši nazad na promenjivu P 3B: Piši nazad na promenjivu P

Ako se instrukcija 1B obrađuje između 1A i 3A, ili ako je instrukcija 1A obrađivana između 1B i 3B, program će izračunati pogrešne rezultate. Ovo je poznato kao race slučaj. Programer mora da koristi zaključavanje za pružanje međusobne isključivosti. Brava je konstrukt programskog jezika, napravljen za omogućavanje jednoj niti da preuzmu kontrolu nad promenljivom i spreči druge niti da čitaju ili pišu po njoj, dok promenljiva ne bude otključana. Nit koja drži zaključavanje je slobodana da izvrši svoju kritičnu sekciju (odeljak programa koji zahteva isključivi pristup nekoj promenljivoj), i za otključavanje podataka kada se završi. Dakle, da garantuje ispravno izvršavanje programa, gornji program se može napisati ponovo tako da koristi zaključavanje:

Nit A Nit B
1A: Zaključaj promenjivu P 1B: Zaključaj promenjivu P
2A: Čitaj promenjivu P 2B: Čitaj promenjivu P
3A: Dodaj 1 na promenjivu P 3B: Dodaj 1 na promenjivu P
4A: Piši nazad na promenjivu P 4B: Piši nazad na promenjivu P
5A: Otključaj promenjivu P 5B: Otključaj promenjivu P

Jedna nit će uspešno zaključati promenljivu P, dok druga nit biti blokirana bez mogućnosti da se nastavi sve dok se ponovo P ne otključa. Ovo garantuje ispravno izvršenje programa. Iako je neophodno da bi obezbedilo ispravno izvršavanje programa, zaključavanje može u velikoj meri da uspori program.

Zaključavanje više promenljivih koristeći ne-atomično zaključavanje uvodi mogućnost zastoja programa. Atomično zaključavanje zaključava više promenljivih odjednom. Ako ih ne može zaključati, ne zaključava nijednu. Ako od dve niti svaka treba da se zaključa iste dve promenjive koristeći neatomično zaključivanje, moguće je da će jedna nit blokirati jednu a druga drugu promenjivu. U tom slučaju, nijedna nit ne može da se završi.

Mnogi paralelni programi zahtevaju da njihovi podzadaci rade sinhronizovano. Ovo zahteva korišćenje barijere. Barijere su uglavnom implementirane koristeći softversko zaključavanje. Jedna klasa algoritama, poznata kao lock-free i wait-free algoritmi, potpuno zaobilazi potrebu za barijerama i zaključavanjem. Ipak ovaj pristup je težak za implementaciju.

Ne ubrzaju svi paralelizmi. Generalno, kad se zadatak podeli na više niti, te niti troše sve veći procenat svog vremena komunicirajući međusobno. U slučaju dovoljno velikog broja niti, vreme komuniciranja će postati veće od vremena korišćenog za rešavanje problema, i dalja paralelizacija uvećava umesto da umanji obim posla. Ovo je poznato kao paralelno usporenje.

Fini, grubi i sramni paralelizam[uredi | uredi izvor]

Aplikacije su obično klasifikovane po tome koliko često njihovi podzadaci moraju da se sinhronizuju ili da komuniciraju. U slučaju da mnogo puta komuniciraju u sekundi, to je fini paralelizam, ako komuniciraju malo to je grubi paralelizam, a ako retko ili nikad ne komuniciraju to je sramni paralelizam. Najlakše je paralelizovati sramno paralelne aplikacije.

Modeli doslednosti[uredi | uredi izvor]

Paralelni programski jezici i paralelni računari moraju imati model doslednosti. Ovaj model definiše pravila kako se operacije na računarskoj memoriji dešavaju i kakvi će rezultati biti.

Jedan od prvih modela je bio Leli Lemortov sekvencijalni model. Sekvencijalna doslednost je osobina paralelnog programa da paralelno izvršavanje ima isti rezultat kao i sekvencijalni program. Program je sekvencijalno dosledan ako su rezultati jednog izvršenja isti kao da su operacije svih procesora izvršene u nekom redosledu, i operacije svakog pojedinačnog procesora pojavljuju u ovom redosledu po redosledu određen svojim programom.

Transakciona softverska memorija je čest tip modela doslednosti. STM uzima koncept atomičnih transakcija iz teorije baza podataka i primenjuje ih na pristupe memoriji.

Matematički, ovi modeli se mogu predstaviti na nekoliko načina. Petrijeve mreže, uvedene u doktorskoj tezi Karla Adama Petrija su bile rani pokušaj da se kodifikuju ovi modeli. Dataflou je napravio Dataflou arhitekturu po ovom principu sa ciljem da fizički implementira ideje od Dataflou teoriji. Počev odd početka 1970, procesni račun kao što je račun komunikacionih sistema i procesi sa sekvencijalnim komuniciranjem su razvijeni da omoguće algebarsko rezonovanje o sistemima sastavljenim od interreagujućih komponenti. Skorašnji dodaci ovoj familiji računa kao što je Pi račun, su dodali mogućnost za rezonovanje dinamičkih topologija.

Flinova taksonomija[uredi | uredi izvor]

Majkl Flin je napravio jedan od najranijih klasifikacionih sistema za paralelne ili sekvencijalne računare i programe, koji se danas zove Flinova taksonomija. Flin je klasifikovao računare i programe po tome da li su operisali koristeći jedan skup ili više skupova instrukcija, i da li su ti skupovi koristili jedan ili više skupova podataka. Jedna-instrukcija-jedni-podaci (SISD) klasifikacija je ekvivalentna potpuno sekvencijalnom programu. Jedna-instrukcija-više-podataka (SIMD) klasifikacija je analogna ponavljanju jedne operacije nad velikim skupom podataka. Ovo se često radi u aplikacijama obrade signala. Više instrukcija jedni podaci (MISD) se retko koristi. Postoje arhitekture koje koriste ovo ali malo aplikacija je napravljeno. Više instrukcija više podataka (MIMD) programi su najčešći paralelni programi.

Prema Dejvidu Patersonu i Džonu Henesiju, „neke mašine su hibridi ovih kategorija, ali ovaj klasični model je preživeo zato što je jednostavan, lak za razumevanje, i daje dobre aproksimacije. Takođe je najčešće korišćena šema možda zbog lakog razumevanja.“[1]

Tipovi paralelizma[uredi | uredi izvor]

Paralelizam na nivou bita[uredi | uredi izvor]

Od pojave VLSI proizvodne tehnologije 1970-ih, ubrzanje se postizalo tako što su se uvećavale širine računarske reči. Povećanje veličine reči smanjuje broj instrukcija koje procesor mora da obradi da bi odrradio operaciju nad promenjivim čije su veličine veće od širine reči. Na primer, kada 8-bitni procesor treba da sabere 16-bitne cele brojeve, on mora prvo da sabere donjih 8 bitova, pa onda gornjih 8 bitova, tako da ovom procesoru trebaju dva ciklusa za sabiranje, a 16-bitnom jedan.

Istorijski, 4-bitne procesore su zamenili 8-bitni, njih 16-bitni, a njih 32-bitni. 32-bitni procesori su bili standard dve decenije. Tek su skoro 64-bitni procesori postali uobičajeni.

Paralelizam na nivou instrukcije[uredi | uredi izvor]

Kanonski petofazni cevovod, RISC mašina (IF = Uzimanje instrukcije, ID = Dekodiranje instrukcije, EX = Izvršavanje, MEM = pristup memoriji, WB = pisanje u registar)

Računarski program je u osnovi tok instrukcija koje izvršava procesor. Ove instrukcije se mogu reorganizovati i kombinovati u grupe koje se onda paralelno izvršavaju bez menjanja ishoda programa. Ovo se zove paralelizam na nivou instrukcije. Napredak u ovom vidu paralelizma su dominirali računarskom arhitekturom od 1980-ih do 1990-ih.[2]

Moderni procesori imaju višefazne instrukcijske cevovode. Svaka faza u cevovodu odgovara različitoj akciji koju procesor izvršava na toj instrukciji u toj fazi. Kanonski primer je RISC procesor, sa 5 faza: donesi, dekodiraj, izvrši, pristupi memoriji i piši nazad. Pentijum 4 je imao 35 faza.[3]

petofazni cevovodni superskalarni procesor, sposoban da izvrši dve instrukcije po ciklusu. Može da ima dve instrukcije u svakoj fazi cevovoda, za ukupno 10 instrukcija (pokazano zeleno) koje se simultano izvršavaju.

Paralelizam na nivou zadatka[uredi | uredi izvor]

Paralelizam na nivou zadatka je karakteristika paralelnih programa gde se potpuno drugačije kalkulacije mogu izvršiti na ili istim ili različitim skupovima podataka. Paralelizam na nivou zadatka se obično ne skalira sa veličinom problema.

Hardver[uredi | uredi izvor]

Memorija i komunikacija[uredi | uredi izvor]

Glavna memorija u paralelnom računaru je ili deljena memorija ili distribuirana memorija. Distribuirana memorija podrazumeva da je memorija logički distribuirana, ali često imlicira da je i fizički distribuirana. Distribuirana deljena memorija i memorija virtuelizacije kombinuju ova dva pristupa gde procesni element ima svoju lokalnu memoriju i pristup memoriji na nelokalnim procesorima. Pristup lokalnoj memoriji je obično brži od pristupa nelokalnoj memoriji.

Logički pogled na Non-Uniform Memory Access (NUMA) arhitekturu. Procesori u jednom direktorijumu mogu da pristupe memoriji tog direktorijuma sa manje latencije nego što mogu da pristupe memoriji drugog direktorijuma.

Računarske arhitekture u kojima se svaki element glavne memorije može pristupiti sa jednakom latencijom i propusnim opsegom se zovu uniformni pristup memoriji (UMA). Tipično se ovo može postići samo u sistemu sa deljenom memorijom. Sistem koji nema ovu osobinu se zove neuniformni pristup memoriji (NUMA). Distribuirani memorijski sistemi imaju neuniformni pristup memoriji.

Računarski sistemi koriste keš – male, brze memorije koje su blizu procesora i koji sadrže kopije memorijskih vrednosti. Paralelni sistemi imaju taj problem da će možda u keš memoriji stajati pogrešna kopija neke vrednosti. Ovi sistemi zahtevaju sistem koherencije keša. Bus snooping je jedna od čestih metoda kojom se vodi računa o vrednostima u kešu.

Komunikacija procesor – procesor i procesor – memorija se može implementirati hardverski na nekoliko načina uključujući preko deljene memorije, deljenog busa, ili crossbar prekidača.

Klase paralelnih računara[uredi | uredi izvor]

Paralelni računari na bazi povezanih mreža moraju da imaju neku vrstu rutiranja da bi omogućili prolazak poruka kroz čvorove koji nisu direktno povezani. Oni nisu međusobno ekskluzivni. Na primer grupe simetričnih procesora su relativno česte.

Višejezgrano računanje[uredi | uredi izvor]

Višejezgrani procesor je procesor koji sadrži više jedinica obrade (jezgara) na istom čipu. Ovi procesori se razlikuju od superskalarnih procesora koji mogu da odrade više instrukcija po ciklusu iz jedne niti.

Svako jezgro može potencijalno biti i superskalar. Svakog ciklusa, svako jezgro može pustiti više instrukcija iz jednog toka instrukcija. Simultano višenitno obrađivanje je prva forma ideje višejazgranih procesora.

Simetrično mikroprocesiranje[uredi | uredi izvor]

Simetrični mikroprocesor je računarski sistem sa više identičnih procesora koji dele memoriju i povezani su busom. Zasićenje busa sprečava skaliranje arhitekture busa. Kao rezultat SMPi generalno ne sadrže više od 32 procesora.

Distribuirano računarstvo[uredi | uredi izvor]

Distribuiran računar (takođe poznat kao multiprocesor sa distribuiranom memorijom) je računarski sistem sa distribuiranom memorijom u kome su elementi obrada povezan sa mrežom. Distribuirani računari su veoma skalabilni.

Softver[uredi | uredi izvor]

Paralelni programski jezici[uredi | uredi izvor]

Istovremeni programski jezici, biblioteke, API i paralelni modeli programiranja (kao što su algoritamski kosturi) stvoreni su za programiranje paralelnih računara. Oni se generalno mogu podeliti u klase na osnovu pretpostavki koje donose o osnovnoj memorijskoj arhitektura deljene memorije, distribuiranja memorije, ili deljene distribuirane memorije. Programski jezici zajedničke memorije komuniciraju manipulacijom deljene memorije promenljive. Distribuirana memorija koristi prosleđivanje poruka. POSIX Threads i OpenMP su dva najšire korišćema APIja sa deljenom memorijom, dok je Message Passing Interface najkorišćeniji sistem za prosleđivanje poruka. Jedan koncept koji se koristi u programiranju paralelnih programa je koncept „fjučera“, gde je jedan deo programa „obećava“ da će isporučiti potrebne podatke drugom delu programa u nekom budućem vremenu.

Automatska paralelizacija[uredi | uredi izvor]

Automatska paralelizacija sekvencijalnog programa od strane kompajlera je sveti gral u paralelnom računarstvu. Uprkos decenijama rada na ovome, nije bilo mnogo uspeha.

Mejnstrim jezici paralelnog računanja ostaju eksplicitno paralelni ili parcijalno implicitni, gde programer daje direktive za paralelizaciju. Nekoliko potpuno implicitnih paralelnih programskih jezika postoje: SISAL, Parallel Haskell, System C (za FPGAe), Mitrion-C, VHDL, i Verilog.

Application checkpointing[uredi | uredi izvor]

Dok računarski sistem raste što se kompleksnosti tiče, prosečno vreme između grešaka se smanjuje. Application checkpointing je tehnika gde računarski sistem uzima snimak aplikacije, sve trenutne alokacije resusra i stanja promenjivih. Ovi podaci će se iskoristiti ako račuanrski sistem propadne. Application checkpointing znači da program može da se restartuje od poslednjeg checkpoint-a, umesto od početka.

Algoritamske metode[uredi | uredi izvor]

Kako paralelni računari postaju veći i brži, postaje moguće da reše probleme koji su se ranije predugo rešavali. Paralelno računarstvo se koristi u širokom spektru oblasti, od bioinformatike (savijanje proteina i analize sekvenci) do ekonomije (matematičke finansije). Uobičajene vrste problema koje se nalaze u paralelnim računarskim aplikacijama su:

  • Gusta linearna algebra
  • Retka linearna algebra
  • Spektralne metode
  • Problem n-tela
  • Sturkturni problemi mreže
  • Nestrukturni problemi mreže
  • Montekarlo simulacija
  • Kombinatorna logika
  • Dinamičko programiranje
  • Prolazak grafa
  • Grafički modeli
  • Simulacija mašine sa konačnim stanjem

Reference[uredi | uredi izvor]

  1. ^ Patterson and Hennessy, p. 748.
  2. ^ Culler et al. p. 15.
  3. ^ Pat, Jejl (april 2004). "The Microprocessor Ten Years From Now: What Are The Challenges, How Do We Meet Them? Arhivirano 2008-04-14 na sajtu Wayback Machine (wmv). Distinguished Lecturer talk at Carnegie Mellon University. Dobavljeno 7. novembra 2007.

Dodatna literatura[uredi | uredi izvor]

Dodatna literatura[uredi | uredi izvor]

  • Kredel, Heinz (2010). „Parallel and distributed Gröbner bases computation in JAS”. arXiv:1008.0011Slobodan pristup. 

Spoljašnje veze[uredi | uredi izvor]