Upload
lythuy
View
224
Download
4
Embed Size (px)
Citation preview
Kauno technologijos universitetas
Informatikos fakultetas
Programų sistemų inžinerijos katedra
Lygiagretūs skaičiavimai
Referatas
Parengė: dokt. Tomas Neverdauskas Priėmė: prof. R. Šeinauskas
Kaunas, 2011
Turinys
Įvadas ............................................................................................................................................................... 3
Lygiagretieji skaičiavimai ................................................................................................................................. 4
Kompiuterių architektūra ................................................................................................................................ 6
Flyno klasifikacija ......................................................................................................................................... 6
Nuoseklieji kompiuteriai .............................................................................................................................. 9
Lygiagretieji kompiuteriai .......................................................................................................................... 10
Lygiagrečiųjų kompiuterių atminties tipai ................................................................................................. 11
Bendrosios atminties kompiuteriai............................................................................................................ 11
Paskirstytosios atminties lygiagretieji kompiuteriai .................................................................................. 12
Klasteriai, GRID tipo lygiagretaus skaičiavimo sistemos ................................................................................ 13
LitGrid ............................................................................................................................................................ 14
Java kalba ir lygiagretus programavimas ....................................................................................................... 17
Kitos programavimo bibliotekos lygiagrečiam programavimui ..................................................................... 20
GPGPU - bendrosios paskirties skaičiavimai pasinaudojant vaizdo procesoriumi ........................................ 22
Kas yra GPGPU? ......................................................................................................................................... 22
Bitoninio rikiavimo algoritmas ................................................................................................................... 24
Taikymas praktikoje – IBM Watson projektas ............................................................................................... 26
Išvados ........................................................................................................................................................... 29
Literatūra ....................................................................................................................................................... 30
3
Įvadas
Nuolat tobulėjant techninei įrangai, daugėjant branduolių skaičiui procesoriuose, auga ir
lygiagrečių sistemų kūrimo, tyrimo ir tokiai techninei įrangai, skirtos programinės įrangos kūrimo poreikis.
Šiame referate apžvelgiama teorinės ir praktinės priemonės lygiagrečių skaičiavimų srityje.
Tokie didieji gamintojai, kaip „Intel“, AMD ir kiti procesorių gamintojai, didindami lustų
darbo spartą, jau dabar susidūrė su energijos sąnaudų ir šilumos problemomis. Kuo sparčiau dirba
procesorius, tuo daugiau energijos jis sunaudoja ir tuo daugiau išskiria šilumos. Šiuolaikinių procesorių
šilumos tankis gali siekti 70 – 90 W kvadratiniame centimetre. O tai reiškia, kad CD dėžutės dydžio
paviršius turėtų išspinduliuoti nuo 12,4 iki 19,9 KW šilumos.
Nebegalėdamos daugiau didinti dažnio, „Intel“, AMD ir kiti gamintojai nusprendė gaminti
procesorius, kuriuose yra keletas savarankiškai veikiančių branduolių. Tokio tipo procesoriai yra
lygiagrečiųjų skaičiavimų pagrindas. Lygiagretieji skaičiavimai įvardijami, kaip kitas esminis technologijų
progreso žingsnis ir pasak „Microsoft“ bei „Intel“ jau atėjo laikas jį žengti. Tačiau pasirodė, kad galima itin
greitiems skaičiavimams pritaikyti ir vaizdo plokščių procesorius.
Lygiagretūs skaičiavimai leidžia išnaudoti techninę įranga ir kuria naujas kompiuterinių
skaičiavimų galimybes.
4
Lygiagretieji skaičiavimai
Yra sukurta daug programavimo kalbų ir įrankių, skirtų nuosekliesiems kompiuteriams. Ši
patirtis yra svarbi ir naudojant lygiagrečiuosius algoritmus. Bet lygiagretieji skaičiavimai suformuluoja
daug naujų reikalavimų. Labai svarbu kurti programinius įrankius, leidžiančius efektyviai ir taupiai
realizuoti sudarytus lygiagrečiuosius algoritmus. Siekiama, kad programas galima būtų nesunkai perkelti iš
vieno lygiagrečiojo kompiuterio į kitą. Plėtojantis patiems lygiagretiesiems kompiuteriams, keičiasi ir
tobulėja programavimo kalbos. Yra sukurti keli lygiagrečiojo programavimo standartai, skirti
populiariesiems lygiagrečiųjų kompiuterių architektūros tipams. Palyginkime nuoseklųjį ir lygiagretųjį
skaičiavimus.
Nuoseklieji skaičiavimai (serial computing):
Vykdomi viename kompiuteryje su vienu procesoriumi/vykdomuoju įrenginiu.
Problema yra išskaidoma į diskrečią instrukcijų seką.
Instrukcijos yra vykdomos viena po kitos (nuosekliai).
Bet kuriuo laiko momentu gali būti vykdoma tik viena instrukcija.
1 pav. Nuosekliųjų skaičiavimų schema
Lygiagretieji skaičiavimai (parallel computing):
Vykdomi naudojant keletą procesorių (branduolių) vienu metu.
Problema yra išskaidoma į atskiras dalis, kuriuos gali būti sprendžiamos lygiagrečiai.
Kiekviena atskira dalis yra skaičiuojama nuosekliai.
5
Skirtingų dalių instrukcijos yra vykdomos skirtinguose CPU tuo pačiu metu t.y. keletas procesorių
kartu tuo pačiu metu sprendžia vieną problemą
2 pav. Lygiagrečiųjų skaičiavimų schema
Šiuolaikinė lygiagrečioji sistema privalo būti integruota sistema, kurią sudaro procesorių
aibė (jos aparatūra), atminties sistema (bendra, paskirstyta, laikinoji atmintis), ryšių (komutacijos)
sistema, sisteminė programinė įranga (OS, kompiliatoriai) bei taikomosios programos.
Uždaviniai lygiagretiesiems skaičiavimams:
Sukurti lygiagrečiuosius kompiuterius (daug procesorių, gerai organizuota atmintis, ryšiai).
Sukurti efektyvius lygiagrečiuosius algoritmus (svarbiausios uždavinių klasės, pritaikymas įvairių tipų
kompiuteriams, užduočių paskirstymo tarp procesorių uždavinys, teoriniai lygiagrečiųjų algoritmų
sudėtingumo modeliai, leidžiantys įvertinti algoritmų efektyvumą ir t.t.).
Sukurti “lygiagrečiąsias” kalbas.
Sukurti lygiagretaus programavimo įrankius.
Sukurti metodus ir priemones lygiagrečių skaičiavimų efektyvumui įvertinti.
Užtikrinti lygiagrečių programų pernešamumą.
Lygiagrečiųjų skaičiavimų taikymo sritys:
Orų prognozė ir klimato pokyčiai.
6
Branduolinės ir cheminės reakcijos.
Kosmologija, geologija, seismologija.
Žmogaus genomas, genų inžinerija.
Raketų, lėktuvų, automobilių projektavimas.
Vaizdų generavimas, grafika.
Finansinis, ekonominis modeliavimas.
Diskrečiojo optimizavimo uždavinių klasė (tvarkaraščių sudarymas oro bendrovėse,
krovinių pervežimo maršruto optimizavimas, skirtingos formos detalių taupus išdėstymas dideliuose
ruošiniuose, mikroschemų projektavimas). Norėdami rasti tokių uždavinių sprendinius, turime patikrinti
labai daug leistinų variantų, o tikrinant kiekviena variantą irgi reikia atlikti nemažai aritmetinių veiksmų.
Todėl dažnai tenkinamasi apytiksliu sprendiniu, kuris randamas patikrinus tik dalį leistinų variantų.
Gautasis sprendinio artinys bus tuos tikslesnis, kuo daugiau variantų sugebėsime patikrinti. Šiuo principu
yra sukurtos visos kompiuterinės šachmatų žaidimo programos.
Kompiuterių architektūra
Kai norime sudaryti efektyvius lygiagrečiuosius algoritmus riekia būti susipažinusiems su
svarbiausiais lygiagrečiųjų kompiuterių tipais. Reikia išsiaiškinti kaip lygiagretieji kompiuteriai yra sudaryti
ir kaip jie veikia.
Flyno klasifikacija
M.Flynas (Michael Flynn) 1972 metais pasiūlė įvairias kompiuterių architektūras
klasifikuoti remiantis komandų (I) ir duomenų (D) srautų skaičiumi. Taip skiriamos 4 klasės:
7
Lentelė 1. Flyno klasifikacija
Single Instruction Multiple Instruction
Single Data SISD MISD
Multiple Data SIMD MIMD
SISD - vienas komandų srautas ir vienas duomenų srautas:
3 pav. SISD
SIMD - vienas komandų srautas ir daug duomenų srautų:
4 pav. SIMD
MISD - daug komandų srautų ir vienas duomenų srautas:
8
5 pav. MISD
MIMD - daug komandų srautų ir daug duomenų srautų:
6 pav. MIMD
SISD - tai paprasti vienprocesoriniai kompiuteriai. Gali būti konvejerizuoti, turėti kelis FĮ
(koprocesorius, grafikos procesorius (įtaisus), vektorinius įtaisus).
SIMD - tai vektoriniai kompiuteriai, turintys skaliarinius ir vektorinius procesorius. Viską
valdo vienintelis centrinis VĮ, kuris valdymo signalus transliuoja visiems procesoriams (PE).
MISD klasės mašinose gali būti:
tas pats duomenų srautas eina per linijinį procesorių masyvą, kurio elementai vykdo skirtingus
komandų srautus. Ši architektūra taip pat žinoma sistolinių masyvų (systolic arrays) vardu. Jie
realizuoja specifinius algoritmus konvejerio principu.
tie patys duomenys paduodami į visus procesorius, tačiau kiekvienas iš jų vykdo savo programą.
SIMD ir MISD modeliai tinka tik specialiems uždaviniams spręsti. Tikrieji lygiagretūs
kompiuteriai programas vykdo MIMD režimu.
9
Nuoseklieji kompiuteriai
Dauguma šiuolaikinių senesnių personalinių procesorių ir darbo stočių yra sukurti
remiantis Neumano (John von Neumann) modeliu. Svarbiausios tokio kompiuterio dalys yra procesorius,
kurį sudaro valdymo įrenginys (VĮ, control unit), skaičiavimo įrenginys (SĮ, processing element) ir atminties
blokas (AB, storage unit arba memory) Ši schema pavaizduota 12 pav.
7 pav. Nuosekliojo kompiuterio schema
Visos šio skaičiavimo modelio operacijos vykdomas nuosekliai viena po kitos, vienu metu
aritmetiniai ir loginiai veiksmai atliekami tik su vienu duomenų rinkiniu. Flyno pasiūlytoje kompiuterių
klasifikacijoje nuoseklieji kompiuteriai sudaro SISD grupę.
Kompiuterio skaičiavimo greitis priklauso nuo dviejų svarbiausių veiksnių: procesoriaus
taktinio greičio, bei nuo greičio, kuriuo renginys keičiasi duomenimis su atmintimi. Nė vienas kompiuterio
veiksmas negali būti atliktas greičiau už vieno takto trukmę. Todėl kuo didesnis procesoriaus taktinis
greitis, tuo greičiau bus atliekami visi veiksmai.
Tačiau daugeliu atvejų kompiuterio spartą riboja duomenų pasikeitimo tarp skaičiavimo
įrenginio ir atminties greitis. Todėl stengiamasi šį laiką sutrumpinti hierarchiškai organizuojant atmintį.
Skiriame labai greitą, bet labai brangią registrinę atmintį. Joje saugomi tik kelių artimiausių operacijų
operandai. Skaičiai į registrinę atmintį patenka iš gana greitos operatyvios buferinės atminties.
Dauguma duomenų yra saugoma išorinėje standžiųjų diskų atmintyje. Tačiau duomenų
keitimasis tarp išorinės ir operatyviosios atminčių sąlygiškai yra lėtas.
Kurdami efektyvius algoritmus, turime stengtis:
Minimizuoti duomenų judėjimą tarp skirtingų atminties lygių, stengtis kuo greičiau skaityti duomenis,
esančius išorinėje atmintyje;
10
Keistis kuo didesniais duomenų kiekiais;
Kuo ilgiau naudoti duomenis, jau esančius atminties registre bei sparčiojoje atmintyje.
Sudarydami algoritmus dažniausiai darome prielaidą, kad naudojame virtualią atmintį,
kurios resursai yra pakankami, o kiekvieną atminties ląstelę pasiekiame nurodydami jos adresą bendrame
adresų sąraše. Duomenų kopijavimo uždavinį paliekame spręsti operacinei kompiuterio sistemai.
Algoritmai, kuriuose naudojama standžiųjų diskų atmintis, vadinami išoriniais algoritmais.
Juose daugiausia dėmesio skiriama ne aritmetiniams veiksmams minimizuoti, o efektyviai pasikeisti
duomenimis.
Lygiagretieji kompiuteriai
Nuoseklieji kompiuteriai turi tik vieną skaičiavimo ir valdymo įrenginį. Konstruodami
lygiagretųjį kompiuterį, galime naudoti daugiau procesorių arba didinti tik skaičiavimo įrenginių skaičių.
Jeigu kompiuteryje yra tik vienas valdymo įrenginys ir keli skaičiavimo įrenginiai, tai
vykdant programą visi šie skaičiuokliai arba atlieka tokią pačią operaciją su skirtingais duomenimis, arba
nevykdo jokių veiksmų. Toks skaičiavimo modelis yra vadinamas SIMD tipo (6 pav a). Tokie lygiagretieji
kompiuteriai dar vadinami matriciniais kompiuteriais, nes jie efektyvūs kai atliekami veiksmai su
matricomis.
8 pav. SIMD tipo lygiagretieji kompiuteriai
SIMD architektūros kompiuteriams priklauso ir vektoriniai procesoriai, juose ta pati
operacija atliekama daugeliu operandų.
Jeigu kompiuteryje yra keli procesoriai, galintys vykdyti skirtingas operacijas, tai turime
MIMD tipo skaičiavimo modelį (14 pav.). Tokiu kompiuteriu galime realizuoti daug bendresnių algoritmų,
tačiau sunkiau sinchronizuoti procesorių darbą.
11
9 pav. MIMD tipo lygiagretieji kompiuteriai
Lygiagrečiųjų kompiuterių atminties tipai
Sudarydami lygiagrečiuosius algoritmus sprendžiame kelis pagrindinius uždavinius, tarp jų
svarbiausias – uždavinio skaidymas į mažesnes užduotis, jų paskirstymas procesoriams ir duomenų
persiuntimas tarp procesorių. Būtent duomenų persiuntimo algoritmai esmingai priklauso nuo
kompiuterio atminties architektūros. Skiriamos dvi didelės lygiagrečiųjų kompiuterių grupės:
bendrosios atminties kompiuteriai;
paskirstytosios atminties kompiuteriai.
Bendrosios atminties kompiuteriai
Visi procesoriai atlieka veiksmus su tam tikrais duomenimis, kuriuos perskaito ir užrašo į
jiems skirtas atminties ląsteles. Bendrosios atminties lygiagretieji kompiuteriai turi tik vieną atminties
bloką ir visi procesoriai gali tiesiogiai pasiekti visas atminties vietas (13 pav.).
12
10 pav. Bendrosios atminties lygiagretieji kompiuteriai
Jeigu visų procesorių bet kokių duomenų persiuntimo greitis yra vienodas , tai sakome, jog
turime kompiuterį su tolygiai pasiekiama bendrąja atmintimi(UMA – uniform memory acces).
Tačiau daugelio procesorių grupė techniškai sunkiai realizuoja tokią sąlygą, todėl dažnai
atmintis skirstoma į dalis, kurios priklauso skirtingiems procesoriams. Ir šiuo atveju išlieka bendras
atminties adresavimas, bet procesoriai greičiau pasiekia duomenis, esančius lokalioje atminties dalyje, nei
duomenis, esančius kituose procesoriuose. Turime kompiuterius su netolygiai pasiekiama bendrąja
atmintimi (NUMA – nonuniform memory acces).
Kadangi kiekvienas procesorius gali tiesiogiai perskaityti ir užrašyti duomenis, esančius
kito procesoriaus atmintyje, tai UMA ir NUMA tipo kompiuteriai dar vadinami pasidalintosios atminties
lygiagrečiaisiais kompiuteriais
Paskirstytosios atminties lygiagretieji kompiuteriai
Tokio tipo kompiuteriai priklauso MIMD tipui. Tačiau dabar vienas procesorius gali
tiesiogiai perskaityti ir įrašyti tik duomenis, esančius jo lokalioje atmintyje (14 pav).
13
11 pav. Paskirstytosios atminties lygiagretieji kompiuteriai
Jeigu vykdant algoritmą reikalingi duomenys, saugomi kitame procesoriuje, tai antrasis
procesorius turi nusiųsti pirmajam pranešimą su reikalinga informacija. Pranešimo perdavimo
mechanizmas toks: vienas procesorius siunčia pranešimą, o kitas procesorius, kuriam reikalingi duomenys,
laukia, kol ateis pranešimas. Duomenų persiuntimu turi pasirūpinti pats programuotojas, nurodydamas,
kas, kam ir kada turi siųsti ar gauti pranešimą. Toks duomenų siuntimas tampa ir algoritmo vykdymo
sinchronizavimo tašku.
Taigi duomenų mainai paskirstytosios atminties lygiagrečiuose kompiuteriuose yra
sudėtingesni, nei bendrosios atminties kompiuteriuose. Tačiau šiuo atveju nesusiduriame su svarbia
problema, kuri egzistuoja bendrosios atminties kompiuteriuose, kai keli procesoriai vienu metu bando
skaityti ir/arba rašyti tą pačią atminties vietą.
Klasteriai, GRID tipo lygiagretaus skaičiavimo sistemos
Anksčiau aukščiausio našumo augimas buvo siejamas su superkompiuteriais, tačiau juos
naudojant atsirado trūkumai:
• superkompiuterių kaina yra aukšta,
• jų plėtimo galimybės ribotos
• elementų bazė greitai keičiasi ir superkompiuterių konstravimas nespėja su tuo
• superkompiuteriai greitai “sensta” našumo požiūriu
Klasteris – lygiagrečioji arba paskirstytoji sistema, kurią sudaro keli tarpusavyje susieti
kompiuteriai, naudojama kaip vieningas unifikuotas kompiuterinis resursas. Kiekviename klasterio mazge
veikia sava OS kopija. Mazgas gali būti paprastas kompiuteris arba multiprocesorinis kompiuteris, klasterį
14
sudarantys kompiuteriai gali turėti skirtingas konfigūracijas (skirtingą procesorių skaičių, skirtingos talpos
atmintis ir diskus). Klasterio mazgai gali būti sujungiami naudojant įprastas jungimo į tinklą priemones
(Ethernet, FDDI, Fibre Channel) arba specialius nestandartinius sujungimus (pvz. Memory Channel). Tokie
sujungimai įgalina mazgus bendrauti tarpusavyje nepriklausomai nuo išorinio tinklo tipo.
Sudarydami lygiagrečiuosius algoritmus, turime atsižvelgti į dvi svarbias kompiuterių
klasterių savybes. Pirma, lokaliojo tinklo (juo labiau – Ethernet tinklo) greitis yra daug mažesnis už
duomenų perdavimo greitį MIMD tipo paskirstytosios atminties kompiuteriuose. Todėl algoritmų,
kuriuose tenka dažnai keistis duomenimis, gali būti nedidelis, kai juos realizuojame vistualiuoju
lygiagrečiuoju kompiuteriu. Antra, kompiuterio klasterį gali sudaryti skirtingo tipo kompiuteriai. Be to kai
kurie iš kompiuterių patys gali turėti kelis procesorius. Todėl visuose algoritmuose turi būti numatyta
galimybė įvertinti procesorių heterogeniškumą. Pažymėtina, kad procesorių heterogeniškumas atsiranda
ir todėl, kad kai kurie klasterio kompiuteriai tuo pačiu metu yra naudojami kelių vartotojų ir jų apkrova
svyruoja net ir tada, kai visi kompiuteriai yra vienodi.
Gridas – paskirstytų procesorių pajėgumų ir paskirstytų informacijos laikymo sistemų
panaudojimo metodas, išpopuliarėjęs dėl schemų, leidžiančių panaudoti neužimtus skaičiavimo resursus,
išdėstytus visame pasaulyje. Gridas – bet kurios globalios paskirstytų skaičiavimų sistemos infrastruktūra,
tinkama plačiam taikomųjų uždavinių ratui – elektroninio verslo, paskirstytosios gamybos, duomenų
analizės, aukšto našumo informacijos apdorojimo, paskirstytųjų superskaičiavimų.
LitGrid
12pav. LitGrid schema
15
LitGrid funkcionavimas apima:
Grid infrastruktūros ir e-paslaugų grid infrastruktūros diegimą, palaikymą ir atnaujinimą
„Cloud computing“ technologijų analizę, projektavimą, eksperimentinį diegimą
Mokslo tyrimų ir mokslo plėtros darbų, reikalaujančių intensyvių skaičiavimų, mokymo uždavinių ir
/arba e-paslaugų, naudojant grid technologijas vystymą, aptarnavimą, naujų naudotojų paiešką, jų
mokymą
LitGrid CA sukūrimą ir jos palaikymo įdiegimą
LitGrid veiklos ir galimybių pateikimą visuomenei, potencialiems naudotojams, viešojo sektoriaus ir
verslo struktūroms, potencialių naujų grid projektų analizę
Santykius su slėniais, branduoliais, viešuoju sektoriumi
LitGrid pasiekti rodikliai:
institucijų (partnerių) skaičius – 13 (VU, KTU, VGTU, VDU, KU, ŠU - universitetai, FI, MII, PRI, TFAI -
institutai, Alytaus, Marijampolės, Panevėžio - kolegijos), LitGrid infrastruktūra taip pat naudojosi
Lietuvos energetikos institutas, Biochemijos institutas, VU fizikos fakultetas, kt.
mokslininkų ir specialistų skaičius – 93
taikomųjų tyrimų krypčių skaičius – 23
taikomųjų uždavinių skaičius – 44
procesorių skaičius - 495
norm. val. skaičius – apie 900 000 val.
mokslo projektų, programų, slėnių aptarnavimas, suteikiant skaičiavimų resursus ir paslaugas
numatomi grid technologijų pristatymai verslui
įjungimas į European Grid Initiative
16
LitGrid tolimesnėje veikloje numatoma:
kurti, palaikyti ir vystyti e-Infrastruktūrą: grid, cloud computing, HPC, virtualius repozitoriumus, kitus
duomenų rinkinius
aptarnauti: akademinę aplinką, viešąjį sektorių, verslo poreikius, užsakymus iš užsienio partnerių
suteikti funkcionalumą: skaičiavimų resursus, modeliavimo paslaugas, virtualių repozitoriumų ir
duomenų rinkinių saugojimą bei naudojimą
teikti „on demand“: skaičiavimus, duomenų repozitoriumus, susijusias e-paslaugas, kt.
vienyti ir sinchronizuoti veiklą: institucijų turimos kompiuterinės įrangos veiklą (administravimo,
funkcionalumo, organizaciniu požiūriais)
įsisavinti ir naudoti technologijų naujoves ar naujas technologijas, dalyvaujant projektuose: PRACE,
EGI, kituose
skatinti Lietuvos mokslininkų ir specialistų bendradarbiavimą su žymiais mokslo centrais (CERN, kitais)
17
Java kalba ir lygiagretus programavimas
Java kalba – viena iš nedaugelio programavimo kalbų, kurios pilnai palaiko
konkurencinį/lygiagretų skaičiavimą (concurent/parallel computing). Skirtumą tarp konkurencinio ir
lygiagretaus skaičiavimo gerai atvaizduoja žemiau pateikta diagramą.
13 pav. Lygiagretus skaičiavimas
Tam kad skaičiavimai vyktų tikrai lygiagrečiai reikia, kad kompiuteris turėtų kelis CPU ir
lygiagrečiam darbui pritaikytą architektūrą. Tuo tarpu paprastame asmeniniame kompiuteryje dažniausiai
yra vienas CPU, todėl užduotys konkuruoja dėl CPU laiko.
Java konkurencinio/lygiagretaus darbo mechanizmas realizuotas gijomis (angl. threads) ir
sinchronizacijos mechanizmu bei virtualios mašinos struktūra. Didžiausia dalis konkurencinio/lygiagretaus
darbo palaikymo yra klasėje Thread. Šios klasės egzemplioriai (angl. instances) ir yra virtualūs procesai
(gijos). Tik vienas Thread objektas gali būti vykdomas vienam CPU tuo pačiu laiku kiti Thread objektai tuo
metu yra įvairiose laukimo būsenose: laukia resursų, laukia CPU laiko, miega, yra laikinai sustabdytas ar
pabaigtas. Svarbiausi Thread metodai:
start() – užregistruoja giją gijų planuotojuje (angl. thread scheduler), kuris ir nuspręs, kada gija gaus
CPU laiko ir bus vykdoma
run() – metodas, kuris yra vykdomas, kada gija gauna CPU laiko. Kai šitas metodas pabaigiamas, t.y. iš
jo išeinama, gija laikoma pabaigta (angl. dead) ir daugiau nebegali būti vykdoma. Šis metodas neturi
18
būti kviečiamas tiesiogiai – gijai užtenka iššaukti start() metodą, kuris užregistruoja ją gijų
planuotojuje, kuris iššauks metodą run(), kai gija bus suplanuota vykdymui.
yield() – perveda einamu metu vykdomą giją į laukimo būseną ir atiduoda laiką kuriai nors iš
pasiruošusių gijų. Jeigu tokių nėra, tuomet gija vykdoma toliau. Visgi daug kas čia priklauso ir nuo gijų
planuotojo – dauguma jų ignoruoja mažesnio prioriteto gijas ir toliau vykdo einama giją.
sleep(int milliseconds) – užmigdo einamu metu vykdomą giją nurodytam laiko tarpui. Reikia pastebėti,
kad, baigus miegojimo laikui, gija nebūtinai bus vykdoma – gali būti kad jinai gaus CPU laiko tiktai
vėliau, dėl to, kad tuo metu CPU vartos kitos suplanuotos gijos.
suspend() – laikinai sustabdo giją, kol jai nebus iššauktas metodas resume(). Bet šitas metodas yra
laikomas pasenusiu ir nerekomenduojamas naudoti – iš vėlesnių Java versijų jis bus išmestas. Taip
padaryta todėl, kad naudojant jį labai lengva patekti į aklavietę, jeigu programuotojas neapgalvos visų
galimų situacijų.
resume() – atgaivina laikinai sustabdytą giją. Šis metodas taip pat pasenęs.
stop() – sustabdo giją. Šis metodas taip pat pasenęs, nes, naudojant jį, gija iškart nutraukiama
sisteminėmis priemonėmis, o tai labai lengvai gali baigtis neatlaisvintų nebenaudojamų resursų
palikimu.
setPriority(int priority) – nustato gijos prioritetą. Prioritetų traktavimas yra JVM ir gijų planuotojo
reikalas, nėra tiesiogiai pasakyta kaip jie turi būti interpretuojami.
getPriority() – grąžina gijos prioritetą.
Galimos gijų būsenos pavaizduotos žemiau esančiame paveiksle (13 pav.).
19
14 pav. Perėjimai tarp gijų būsenų Java kalboje
Kitas dalykas, aktualus programuojant yra gijų sinchronizacija ir kritinių sričių valdymas.
Sinchronizacija yra realizuota kalbos struktūroje: jai dedikuotas raktinis žodis synchronized. Šis raktinis
žodis gali būti taikomas metodui arba kodo fragmentui. Jo esmė – išskirti kritines sritis, kuriose esant
vienai gijai kitos gijos negali įeiti į kritines sinchronizuojamo objekto sritis. Tai realizuota monitorių
būsenomis: kiekvienas objektas turi savo monitorių ir kiekviena gija, įeidama į kritinę objekto kodo sritį,
monitoriaus užraktą pasiima; kitos gijos, norinčios įeiti į to objekto kritinę sritį, turi laukti kol pirmoji gija
išeis iš kritinės srities ir užraktą atiduos.
Object klasė, kuri yra visų Java kalbos klasių viršklasė, taip pat turi kelis metodus, kurie gali
būti kviečiami tiktai kritinėse srityse, t.y. synchronized metoduose ar kodo fragmentuose:
wait() – šis metodas grąžina objekto raktą iš einamos gijos ir perleidžia CPU kitoms gijoms. Einama gija
yra pervedama į laukimo būseną.
notify() – pažadina vieną iš laukiančių gijų.
notifyAll() – pažadina visas laukiančias gijas paeiliui.
20
15 pav. Sichronizacijos įtaką gijų vykdymui
Kitos programavimo bibliotekos lygiagrečiam programavimui
Yra daug populiarių programavimo kalbų, kuriomis užrašome nuosekliuosius algoritmus,.
Pirmiausia, reikia nuspręsti, ar realizuodami lygiagrečiuosius algoritmus kursime naujas programavimo
kalbas, ar užteks papildyti jau egzistuojančias. Į šį klausimą galėsime atsakyti tik tada, kai nustatysime,
kokių papildomų priemonių mums reikia, jei norime užrašyti bet kokį lygiagretųjį algoritmą. Taigi buvo
suburta specialistų grupė, kuri sudarė paskirstytųjų skaičiavimų standartą ir rekomendavo jį naudoti
paskirstytosios atminties lygiagrečiuosiuose kompiuteriuose. Ši duomenų persiuntimo sąsaja buvo
pavadinta MPI (angl. Message Parsing Interface). Ją sudarant buvo pasitelkta kitų programavimo
bibliotekų (PVM, Chameleon, PARMACS) ypatybės bei įvertinti naujausi teoriniai siūlymai. Svarbiausios
MPI ypatybės:
MPI yra biblioteka, o ne nauja programavimo kalba. Ji tik apibrėžia paprogramių vardus, parametrus
ir jų funkcinę paskirtį. Šias paprogrames galima naudoti Fortran 77 ir C kalbomis parašytose
programose; parengtos paprogramių Fortran 95 ir C++ versijos. Vartotojas programą rašo
standartine programavimo kalba tik kompiliuodamas prijungia MPI biblioteką.
21
MPI realizuotas išreikštinis duomenų siuntimo modelis. Apibrėžtos ne tik būtinosios priemonės, be
kurių negalime užrašyti lygiagrečiojo algoritmo, realizuojamo paskirstytosios atminties lygiagrečiuoju
kompiuteriu, bet ir daug papildomų paprogramių, lengvinančių algoritmo realizaciją arba padidinančių
algoritmo efektyvumą. MPI leidžia atlikti skaičiavimus su heterogeniškais kompiuteriais.
MPI standartas apibrėžia tik funkcinę paprogramės paskirtį, be nereglamentuoja jos realizacijos. Todėl
skirtingų tipų kompiuterių gamintojai gali šias paprogrames realizuoti efektyviausiu šiam kompiuteriui
būdu.
MPI standartu parašyta programa be pakeitimų gali būti perkelta iš vieno tipo kompiuterio į kito tipo
kompiuterį. Tai ypač svarbu kuriant matematinių algoritmų bibliotekas.
OpenMP yra vienas iš bandymų suformuluoti programavimo standartą, skirtą
lygiagretiesiems algoritmams realizuoti bendrosios atminties kompiuteriuose. Siekiama sudaryti nedidelį
rinkinį programavimo konstrukcijų, leidžiančių efektyviai realizuoti lygiagretųjį algoritmą. Kadangi
OpenMP yra skirtas kompiuteriams, naudojantiems bendrąją atmintį, tai programuotojui nereikia pačiam
rūpintis duomenų pasikeitimu tarp skirtingų procesorių. Pagrindinis jų tikslas – išskirti tas algoritmo(ar
juos realizuojančios programos) dalis, kurios gali būti vykdomos vienu metu.
22
GPGPU - bendrosios paskirties skaičiavimai pasinaudojant
vaizdo procesoriumi
Kas yra GPGPU?
GPGPU angliškai reiškia General-Purpose computation on GPUs. Verčiant pažodžiui -
Bendros Paskirties Skaičiavimai su GPU. Dėl galimybės programuoti vaizdo procesorius ir didelės jų galios
jie sudomino įvairių sričių specialistus. Priversti procesorių dirbti galima pasinaudojant įvairiomis
bibliotekomis. Dvi pagrindinės ir šiuo metu populiariausios: Direct3D, kuri turi HLSL (angl. „High Level
Shading Language“), ir OpenGL su GLSL (angl. „OpenGL Shading Language“). Taip pat NVIDIA pristatė
CUDA (angl. „Compute Unified Device Architecture“) programavimo įrankį, kuris leidžia
programuoti vaizdo procesorius kalba, panašia į populiariąją C kalbą.
Duomenys vaizdo atmintyje laikomi tekstūrų arba atminties blokų (buferių), į kuriuos
surašomos viršūnių erdvėje koordinatės, pavidalu. Tekstūra – tai vienmatis, dvimatis ar trimatis
paveiksliukas. Tekstūroje galime laikyti duomenis, kurių reikės atlikti skaičiavimams ir išvesti į ją
skaičiavimo rezultatus.
16 pav. GPU ir CPU palyginimas
23
Šių dienų kompiuteriuose vaizdo procesorius (angl. „GPU“ – Graphics Processing Unit) yra
būtinas komponentas. Jis gali būti integruotas į motininę plokštę arba prijungtas atskirai vaizdo plokštėje.
Šis procesorius gali atlikti ypač daug operacijų, per sekundę savo galingumu kelis kartus aplenkdamas net
pačius naujausius bendrosios paskirties procesorius. Grafikas rodo, kiek apytiksliai milijardų operacijų su
slankaus kablelio skaičiais per sekundę galėjo atlikti naujausi bendrosios paskirties procesoriai (žydra
kreivė) ir vaizdo procesoriai (raudona kreivė) nuo 1998 iki 2006 metų. Vaizdo procesoriaus pagrindinė
užduotis yra manipuliuoti 3D ir 2D vaizdus, skaičiuoti erdvinių objektų pozicijas ir apšvietimą. Nuo
apytiksliai 2000 metų nauji vaizdo procesoriai gali būti programuojami vadinamųjų šešėliavimo programų
pagalba (angl. „Shaders“). Tai leido kurti dar realistiškesnę kompiuterinę grafiką ir įgyvendinti naujus
apšvietimo skaičiavimo metodus. Taip pat naujos galimybės sudomino ir kitų sričių specialistus.
Taigi duomenų apdorojimą grubiai vaizduoja sekanti diagrama. Objektai trimačiame
pasaulyje dažniausiai aprašomi trikampiais. Šių trikampių viršūnės apdorojamos vadinamosiose viršūnių
programose (angl. „Vertex shader“). Toliau iš tų viršūnių susidarantys trikampiai paverčiami į taškus ir
perduodami taškų programai (angl. „Pixel shader“). Po to šis apdorotas taškas išvedamas į ekraną arba
išsaugojamas atmintyje ir vėl iš naujo panaudojamas skaičiuojant kitas viršūnes ir taškus. Naujos kartos
vaizdo procesoriuose (palaikančiuose 10-tą Direct3D versiją) atsirado dar daugiau programuojamų
konvejerio dalių, tačiau jos nėra svarbios šiai straipsnio temai.
17 pav. GPU duomenų apdorojimo schema
Dėl tokios duomenų apdorojimo, konvejerio vaizdo procesoriuje, architektūros, duomenis
galima lengvai apdoroti lygiagrečiai. Kiekviena viršūnė nepriklauso nuo kitų apdorojamų viršūnių ir
kiekvienas taškas nepriklauso nuo kitų taškų. Todėl naujausi vaizdo procesoriai (2007m.) turi net iki 128
skaičiavimo elementų, galinčių vykdyti viršūnių ir taškų programas vienu metu. Kiekvienas skaičiavimo
24
elementas veikia apytiksliai 1500MHz dažniu. Dėl to jų visuma aplenkia visus bendrosios paskirties
procesorius. Šią skaičiavimo elementų didėjimo tendenciją matome ir šiandienos bendrosios paskirties
procesoriuose, kurie jau turi iki 4 branduolių. Tačiau norint panaudoti šią galią, reikia stipriai keisti
programos vykdymo eigą, priversti programą skaičiavimus vykdyti lygiagrečiai.
Bitoninio rikiavimo algoritmas
Vienas iš vaizdo procesoriaus pritaikymo būtų gali būti didelio kiekio duomenų rikiavimas.
Tai operacija, kuri dažnai atliekama realiose situacijose, pavyzdžiui, įrašų rikiavimas duomenų bazėse. Tai
galima atlikti vadinamuoju bitoninio rikiavimo algoritmu. Jis vykdomas keliomis (tiksliau log(n), kur n –
duomenų kiekis, log – dvejetainis logaritmas) pakopomis. Algoritmo vykdymo metu surikiuoti mažesni
duomenų blokai jungiami į dvigubai didesnius blokus. Šį algoritmą su vienmačiu masyvu arba vienmate
tekstūra vaizdžiai iliustruoja diagrama žemiau.
18 pav. Duomenų rikiavimo žingsniai
25
Ši diagrama vaizduoja bitoninio rikiavimo algoritmą su 8 skaičiais. Algoritmas vykdomas
trimis pakopomis. Vienos pakopos rezultatas yra sekančios pakopos duomenys. Kiekvienoje pakopoje
masyvas išdalinamas į jau surikiuotus blokus, pažymėtus raudonai ir žaliai. Gretimi blokai lyginami taip,
kaip vaizduoja rodyklės. Mažesnis elementas perkeliamas į žalią regioną, o didesnis į raudoną.
Bitoninio rikiavimo algoritmas ypatingas tuo, kad duomenų palyginimus ir sukeitimus galima atlikti
lygiagrečiai, iškart visam duomenų masyvui (tekstūrai). Taip vienu metu išnaudojami visi vaizdo
procesoriaus skaičiavimo elementai. Čia pateikiamas tik vienmačio masyvo rikiavimo algoritmas, bet
dažniausiai naudojami dvimačiai masyvai, nes vaizdo procesoriai labiau pritaikyti dirbti su dvimatėmis
tekstūromis (paveikslėliais). Taip pat šis algoritmas nėra pats našiausias lygiagretus rikiavimo algoritmas.
Lygiagretūs rikiavimo algoritmai, vykdomi vaizdo procesoriuje, greičiu konkuruoja su
algoritmais, vykdomais bendrosios paskirties procesoriuose, pavyzdžiui, greitu rikiavimu (angl. „Quick
sort“). Pigūs vaizdo procesoriai rikiuoja duomenis taip pat greit kaip žymiai brangesni bendrosios
paskirties procesoriai (lyginama tuomet kainavusi $265 NVIDIA 7800 GT vaizdo plokštė su $2200
kainavusiu 3.6 GHz Dual Xeon serveriu).
26
Taikymas praktikoje – IBM Watson projektas
Dar 1997 IBM išgarsėjo panaudoję savo super kompiuterį „Deep Blue“, kuris šachmatų
žaidime nugalėjo pasaulio čempioną G. Kasparovą. 2011 metais IBM ėmėsi kito labai ambicingo tikslo
nugalėti geriausius JAV populiariaus žaidimo „Jeopardy“ žaidėjus. Žaidimo esmė – pasakomas atsakymas,
žaidėjas turi iškelti tinkamą klausimą. Tačiau šie klausimai pateikiami žmogiška kalba (anglų), dažnai būna
labai abstraktūs ir priklausantys nuo konteksto.
Watson sudaro:
90 IBM Power 750 serverių
I/O, klasterių valdymo įrengimai
2,880 POWER7 procesorių branduoliai ir 16 terabaitų RAM
Kūrimo išlaidos – 3 mln. JAV dolerių
Kompiuterio kaina - 3 mln. JAV dolerių
19 pav. WATSON superkompiuteris
27
20 pav. Watson veikimo algoritmas
Programinė įranga panaudota kuriant sistemą:
Java ir C++ programavimo kalbos
Apache Hadoop
Apache UIMA
SUSE Linux Enterprise Server 11
Tokie skaičiavimo pajėgumai leido įveikti geriausius žaidėjus žmones ir šiam kompiuteriui
kartu su IBM mokslininkais parodyti, kad didelioms problemoms spręsti lygiagrečių algoritmų
panaudojimas yra esminis faktorius.
29
Išvados
1. Lygiagretūs skaičiavimai leidžia išnaudoti techninę įranga ir kuria naujas kompiuterinių
skaičiavimų galimybes.
2. Techninės įrangos tobulėjimas paralelizavimo linkme, kuria tinkamą terpę programinės įrangos,
naudojančios lygiagrečius skaičiavimus, kūrimui.
3. Lygiagretūs skaičiavimai randa vis daugiau pritaikymų namų vartotojų kompiuteriuose ir leidžia
pasiekti galingumus (naudojant GPGPU), kurių anksčiau siekdavo tik superkompiuteriai.
30
Literatūra
1. Raimondas Čiegis „Lygiagretieji algoritmai“ 2001 m., Vilnius, 226 p.
2. Darius Šilingas. Lygiagretus daugialypis integravimas su Java kalba. Prieiga internete:
http://vaidila.vdu.lt/~i5dasi/parallel/javathreads.doc *žiūrėta 2011 - 03 – 20 ]
3. The Message Passing Interface (MPI) standard. Prieiga internete:
http://www.mcs.anl.gov/research/projects/mpi/ *žiūrėta 2011 - 03 –19 ]
4. Nvidia GPU Computing Developer Home Page. Prieiga internete:
http://developer.nvidia.com/object/gpucomputing.html *žiūrėta 2011-03-21]
5. Lietuvos akademinių institucijų lygegrečiųjų ir paskirstytų skaičiavimų tinklas. Prieiga internete:
http://www.litgrid.lt/ *žiūrėta 2011-03-21]
6. JAVA - Threads and Locks, Prieiga internete:
http://java.sun.com/docs/books/jls/third_edition/html/memory.html http://www.litgrid.lt/
*žiūrėta 2011-03-20]