Você está na página 1de 205

Jn Hank

Zklady paralelnho programovania v jazyku C# 3.0

Jn Hank

Zklady paralelnho programovania v jazyku C# 3.0

Artax 2009

Autor: Ing. Jn Hank, MVP Zklady paralelnho programovania v jazyku C# 3.0 Recenzenti: Vydanie: Rok prvho vydania: Nklad: Jazykov korektra: Vydal: doc. RNDr. Jozef Fecenko, CSc. Ing. udovt Markus, CSc. prv 2009 150 ks Ing. Peter Kubica Artax a.s., abovesk 16, 616 00 Brno pre Microsoft s.r.o., Vyskoilova 1461/2a, 140 00 Praha 4 Artax a.s., abovesk 16, 616 00 Brno 978-80-87017-03-6

Tla: ISBN:

Uebn text Zklady paralelnho programovania v jazyku C# 3.0 bol schvlen v Edinom plne Ekonomickej univerzity v Bratislave na rok 2009 ako vysokokolsk uebnica pre tudentov povinnho predmetu Automatizcia programovania v tudijnom programe Hospodrska informatika, 2. stupe (ininierske tdium).

Obsah
vod................................................................................................................................................................ 4 Obsahov truktry knihy ..................................................................................................................... 7 Typografick konvencie ......................................................................................................................... 9 1 Architektonick truktra vvojovo-exekunej platformy Microsoft .NET Framework 3.5 ........................................................................................................................................ 11 1.1 Virtulny exekun systm (VES) ....................................................................................... 12 1.2 Bzov kninica tried (BCL) .................................................................................................. 14 1.3 Spolon typov systm (CTS) ............................................................................................. 16 1.4 Spolon jazykov pecifikcia (CLS) ................................................................................ 19 2 Zostavenie riadenej aplikcie a jeho truktra ...................................................................... 21 2.1 Klasifikcia zostaven riadench aplikci ....................................................................... 25 3 Technick rozbor riadenej exekcie jednovlknovej riadenej aplikcie .................... 26 4 Technick rozbor riadenej exekcie viacvlknovej riadenej aplikcie........................ 34 5 Typolgia vlkien ............................................................................................................................... 46 6 Technick rozbor procesorovch architektr potaovch systmov ...................... 49 6.1 Jednojadrov procesory architektry IA-32 bez technolgie HT .......................... 49 6.2 Jednojadrov procesory architektry IA-32 s technolgiou HT ............................ 53 6.3 Viacjadrov procesory architektry IA-32/Intel 64 bez technolgie HT ........... 57 6.3 Viacjadrov procesory architektry IA-32/Intel 64 s technolgiou HT ............. 59 6.4 Viacprocesorov architektry IA-32/Intel 64 ............................................................... 63 6.5 Softvr na programov identifikciu procesorov architektry Intel IA-32 a Intel 64 ............................................................................................................................................... 66 7 Paraleln programovanie a paraleln objektovo orientovan programovanie (POOP) ........................................................................................................................................................ 71

8 Kvantifikcia nrastu vkonnosti pri POOP ............................................................................ 72 9 Amdahlov zkon ................................................................................................................................. 78 10 Gustafsonov zkon .......................................................................................................................... 83 10.1 Komparcia Amdahlovho a Gustafsonovho zkona ................................................. 86 11 Linerny, sublinerny a superlinerny nrast vkonnosti pri POOP ....................... 87 12 Kontrukcia programovch vlkien v jazyku C# 3.0 ........................................................ 89 12.1 Manipulcia s primrnym programovm vlknom .................................................. 89 12.2 Manipulcia s pracovnm programovm vlknom .................................................. 92 13 Fond pracovnch programovch vlkien ............................................................................ 103 14 Synchronizcia programovch vlkien a synchronizan primitva ....................... 111 14.1 Preteky vlkien ..................................................................................................................... 113 14.2 Praktick prklad detekcie a korekcie pretekov vlkien v jazyku C# 3.0 ..... 119 14.3 Uviaznutie vlkien ............................................................................................................... 131 14.4 Atomick opercie ............................................................................................................... 137 14.5 Mutexy ...................................................................................................................................... 141 15 Varianty paralelizmu .................................................................................................................... 147 16 Praktick cvienie: Paralelizcia sekvennej riadenej aplikcie................................ 156 17 Paraleln platforma Microsoft Parallel Extensions ......................................................... 165 17.1 Microsoft Parallel Extensions: Praktick cvienie .................................................. 171 18 OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov . 178 18.1 Exekun prostredie rozhrania OpenMP a exekcia paralelnch aplikci . 182 18.2 Praktick pouitie rozhrania OpenMP pri implementcii paralelnho algoritmu numerickej integrcie v jazyku C++ .................................................................. 186 Zver .......................................................................................................................................................... 196 O autorovi................................................................................................................................................ 198

Pouit literatra ................................................................................................................................. 201

vod
S prchodom viacjadrovch procesorov sa pred vvojrmi, programtormi a softvrovmi expertmi otvoril nov svet monost vvoja modernho potaovho softvru. Ako tvorcovia potaovch systmov sa u nememe spolieha na neustle zvyovanie sa taktovacej frekvencie procesorov, ktor poas predchdzajcich rokov zabezpeovalo implicitn nrast vkonnosti naich softvrovch produktov. Perspektva je zreten, pretoe poet exekunch jadier na procesoroch sa bude aj v budcnosti rchlo mnoi. Ak chceme vyui synergick efekt, ktor generuje sasn viacjadrov hardvrov revolcia, musme sa naui, ako zhotovova paraleln programy. Teda programy, ktor s schopn sbene vykonva viacero loh, priom doku flexibilne vyuva vetku disponibiln vpotov kapacitu hardvrovej platformy. Cieom predkladanej vysokokolskej uebnice je poskytn zkladn teoretickopraktick vubov kurz paralelnho programovania v jazyku C# 3.0 na vvojovoexekunej platforme Microsoft .NET Framework 3.5. Paraleln programovanie je jednou z paradigiem, ktorch zvldnutie je nutn na to, aby sme mohli spene eli vzvam budcich technologickch progresov. Hoci bola tto vysokokolsk uebnica primrne projektovan pre potreby tudentov 2. stupa vysokokolskho (ininierskeho) tdia odboru Hospodrska informatika na Fakulte hospodrskej informatiky Ekonomickej univerzity v Bratislave, sme presveden o tom, e rovnako dobre posli aj tudentom na inch vysokch kolch informatickho zamerania. Prirodzene, poznatky uvdzan v tejto publikcii s vhodou vyuij i komern vvojri, programtori a softvrov experti, ktorch poslanm je analyzova, navrhova a implementova paraleln potaov aplikcie. Napriek tomu, e potaov vedy poznaj mnoho praktickch modelovch prstupov k paralelnmu programovaniu, rozhodli sme sa koncentrova na paraleln programovanie v jednom z najmodernejch programovacch jazykov, C# 3.0 od spolonosti Microsoft. Naa voba bola podmienen viacermi faktormi.

Po prv, posluchi odboru Hospodrska informatika na Fakulte hospodrskej informatiky Ekonomickej univerzity v Bratislave absolvuj poas 1. stupa svojho vysokokolskho (bakalrskeho) tdia vubov kurzy programovacch jazykov C a C++, v rmci ktorch sa zoznamuj so truktrovanou a objektovo orientovanou filozofiou vvoja potaovho softvru. Kee chceme, aby tudenti rozvjali svoje nadanie v tride C C++ C#, je prklon k jazyku C# logickm vystenm naich snh o priame prepojenie pedagogickho procesu s potrebami praxe. Po druh, pri paralelnom programovan v jazyku C# 3.0 s tudenti schopn maximalizova svoju pracovn produktivitu, pretoe vvojovo-exekun platforma Microsoft .NET Framework 3.5 obsahuje nielen virtulny exekun systm, ktor riadi ivotn cykly vytvorench aplikci, ale aj robustn bzov kninicu tried, implementujcu niekokotiscov mnoinu dtovch typov, ktor s charakteristick vysokou mierou abstrakcie. Po tretie, domnievame sa, e znalosti objektovo orientovanho programovania (OOP) a paralelnho objektovo orientovanho programovania (POOP) prispej k maximalizcii pracovnho uplatnenia tudentov po skonen 2. stupa vysokokolskho tdia. Samozrejme, vemi radi uvtame, ak sa tudenti rozhodn alej prehlbova svoje informatick vedomosti aj v rmci 3. stupa vysokokolskho (doktorandskho) tdia. Sme presveden o tom, e ak schopn mlad udia ovldnu sofistikovan informan technolgie, ich potencil je nekonen. Vysokokolsk uebnica Zklady paralelnho programovania v jazyku C# 3.0 je poda naich zisten jedinou slovenskou publikciou, ktor poskytuje elementrny vubov kurz paralelnho programovania pomocou najmodernejch technolgi spolonosti Microsoft. Autor knihy by si rd splnil svoju mil povinnos a srdene poakoval recenzentom, doc. RNDr. Jozefovi Fecenkovi, CSc. a Ing. udovtovi Markusovi, CSc. za dkladn pretudovanie diela a nmety na jeho alie skvalitnenie. Rovnako primne akuje autor Ing. Jimu Burianovi a Mgr. Miroslavovi Kubovkovi zo spolonosti Microsoft za ich mnohoron aktvnu spoluprcu, ktorej vsledkom s hodnotn produkty 5

permanentne zlepujce stav akademickho a vvojrskeho ekosystmu. V neposlednom rade vyjadruje autor hlbok ctu a poakovanie vetkm nadanm a aktvnym tudentkm a tudentom, ktorch usilovn prca a udsk prstup pomhaj zvyova kvalitu pedagogickho procesu.

Jn Hank Bratislava, februr 2009

Obsahov truktry knihy


Vysokokolsk uebnicu tvor dovedna 18 kapitol s nasledujcim tematickm zameranm: 1. kapitola: Kapitola podva vklad hlavnch komponentov, z ktorch sa sklad vvojovo-exekun platforma Microsoft .NET Framework 3.5. Charakterizovan je virtulny exekun systm, bzov kninica tried, spolon typov systm a spolon jazykov pecifikcia. 2. kapitola: Kapitola charakterizuje zostavenie riadenej aplikcie (aplikcie .NET) a ozrejmuje jej intern truktru. 3. kapitola: Kapitola sa sstreuje na technick analzu riadenej exekcie jednovlknovej riadenej aplikcie. 4. kapitola: Kapitola sa koncentruje na technick analzu riadenej exekcie viacvlknovej riadenej aplikcie. 5. kapitola: Kapitola predstavuje zkladn typolgiu vlkien, priom charakterizuje programov (aplikan) vlkna, vlkna jadra operanho systmu a hardvrov vlkna. 6. kapitola: Kapitola prezentuje technick podrobnosti hlavnch typov procesorovch architektr sasnch potaovch systmov. Vklad sa venuje nasledujcim typom procesorov: jednojadrov procesory architektry Intel IA-32 bez a s technolgiou HT, viacjadrov procesory architektry Intel IA-32/Intel 64 bez a s technolgiou HT a viacprocesorov architektry Intel IA-32/Intel 64. 7. kapitola: Kapitola poukazuje na zmenu paradigmy z objektovo orientovanho programovania (OOP) na paraleln objektovo orientovan programovanie (POOP). 7

8. kapitola: Kapitola sa zaober kvantifikciou nrastu vkonnosti potaovch aplikci pri pouit paralelnho objektovo orientovanho programovania. 9. kapitola: Kapitola charakterizuje Amdahlov zkon, priom poukazuje na dsledky plynce z jeho praktickho pouitia. 10. kapitola: Kapitola zoznamuje itateov s Gustafsonovm zkonom a umouje zauja in pohad na kvantifikciu nrastu vkonnosti potaovch aplikci pri paralelnom objektovo orientovanom programovan. 11. kapitola: Kapitola definuje a vizulne analyzuje linerny, sublinerny a superlinerny nrast vkonnosti pri paralelnom objektovo orientovanom programovan. 12. kapitola: Kapitola sa tematicky orientuje na praktick paraleln programovanie v jazyku C# 3.0. itatelia sa dozvedia, ako sa v tomto programovacom jazyku vytvraj pracovn vlkna a ako meme s tmito vlknami manipulova. 13. kapitola: Kapitola vyzdvihuje pouitie fondu pracovnch programovch vlkien s algoritmizciou praktickho problmu. 14. kapitola: Kapitola sa venuje problematike synchronizcie programovch vlkien a vysvetleniu vybranch synchronizanch primitv. 15. kapitola: Kapitola ponka vklad variantov paralelizmu (implicitn a explicitn paralelizmus, dtov paralelizmus, lohov paralelizmus, paralelizmus dtovch tokov, deklaratvny a imperatvny paralelizmus). 16. kapitola: Kapitolu tvor praktick cvienie, v ktorom je demontrovan proces paralelizcie pvodne sekvennej riadenej aplikcie. 8

17. kapitola: Kapitola zoznamuje itateov s paralelnou platformou Microsoft Parallel Extensions. 18. kapitola: Kapitola ponka teoreticko-praktick pohad na natvne rozhranie OpenMP, ktor sli na podporu paralelizcie vpotovch procesov.

Typografick konvencie
Aby sme vm tanie tejto knihy sprjemnili v o mono najvej miere, bol prijat kdex typografickch konvenci, pomocou ktorch dolo k tandardizcii a unifikcii pouitch textovch tlov a grafickch symbolov. Verme, e prijat konvencie zvia prehadnos a pouvatesk prvetivos vkladu. Prehad pouitch typografickch konvenci uvdzame v tab. A. Typografick konvencia tandardn text vkladu, ktor neoznauje zdrojov kd, identifiktory, modifiktory a kov slov jazyka C# 3.0, ani nzvy inch syntaktickch elementov a entt, je formtovan tmto typom psma. Ukka pouitia typografickej konvencie Vvojovo-exekun platforma Microsoft .NET Framework 3.5 kreuje spolone s jazykom C# 3.0 jednotn technologick bzu na vytvranie modernch riadench aplikci pre Windows, web a inteligentn mobiln zariadenia.

Tab. A: Prehad pouitch typografickch konvenci

Typografick konvencia

Ukka pouitia typografickej konvencie Nov projekt tandardnej aplikcie pre systm Windows (Windows Forms Application) v prostred produktu Visual C# 2008 zalome takto: 1. Otvorme ponuku File, ukeme na poloku New a klikneme na prkaz Project. 2. V dialgovom okne New Project klikneme v stromovej truktre Project Types na poloku Visual C#. 3. Zo spravy projektovch abln (Templates) vyberieme ikonu ablny Windows Forms Application. 4. Do textovho poa Name zapeme nzov pre nov aplikciu a stlame tlaidlo OK.
// Defincia premennej typu // string. string sprva; // Inicializcia premennej. sprva = "Vitajte v jazyku " + "C# 3.0!"; // Zobrazenie okna so sprvou // pomocou metdy Show triedy // MessageBox. MessageBox.Show(sprva);

Nzvy ponk, poloiek ponk, ovldacch prvkov, komponentov, dialgovch okien, podpornch softvrovch nstrojov, typov projektov ako aj nzvy alch sast grafickho pouvateskho rozhrania s formtovan tunm psmom. Tunm psmom s rovnako formtovan aj identifiktory programovch entt, ktor s uvdzan priamo vo vkladovom texte.

Fragmenty zdrojovho kdu jazyka C# 3.0, prpadne akchkovek inch programovacch jazykov s formtovan neproporcionlnym psmom Courier New.

Tab. A: Prehad pouitch typografickch konvenci (pokraovanie)

10

Kapitola 1: Architektonick truktra vvojovo-exekunej platformy Microsoft .NET Framework 3.5

1 Architektonick truktra vvojovo-exekunej platformy Microsoft .NET Framework 3.5


Vvojovo-exekun platforma Microsoft .NET Framework 3.5 obsahuje kolekciu nasledujcich zkladnch (jadrovch) komponentov: 1. 2. 3. 4. Virtulny exekun systm (Virtual Execution System, VES). Bzov kninica tried (Base Class Library, BCL1). Spolon typov systm (Common Type System, CTS). Spolon jazykov pecifikcia (Common Language Specification, CLS).

Komponenty vvojovo-exekunej platformy Microsoft .NET Framework 3.5 s znzornen na obr. 1.1.

Obr. 1.1: Zkladn komponenty vvojovo-exekunej platformy Microsoft .NET Framework 3.5

Pre oznaenie bzovej kninice tried sa niekedy pouva aj oznaenie FCL, teda Framework Class Library.

11

Kapitola 1: Architektonick truktra vvojovo-exekunej platformy Microsoft .NET Framework 3.5 V nasledujcom texte ponkneme strun charakteristiku spomenutch zkladnch komponentov vvojovo-exekunej platformy Microsoft .NET Framework 3.5.

1.1 Virtulny exekun systm (VES)


Virtulny exekun systm je softvrov stroj, ktor realizuje riaden exekciu aplikci .NET. Prijmime dohovor, e termny aplikcia .NET a riaden aplikcia bud reprezentova akkovek typov potaov program, ktor vyhovuje tmto poiadavkm: Program bol vytvoren v niektorom z .NET-kompatibilnch programovacch jazykov. Proces spustenia a vykonania programu na potai je riaden virtulnym exekunm systmom. Kee virtulny exekun systm vytvra prostredie pre beh ubovonej riadenej aplikcie, je zrejm, e medzi nm a riadenou aplikciou existuj vemi zke vzby. Spojenie medzi uvedenmi entitami je dokonca tak tesn, e bez virtulneho exekunho systmu nie je mon vykonanie aplikcie .NET na potaovej stanici. Zatia o termn virtulny exekun systm je v oblasti potaovch vied veobecnm pomenovanm softvrovho stroja, ktor uskutouje riaden exekciu potaovho programu, spolonos Microsoft ako tvorca vvojovo-exekunej platformy .NET Framework 3.5 oznauje svoju vlastn, teda konkrtnu implementciu virtulneho exekunho systmu, ako spolon behov prostredie CLR2. Hoci v bench praktickch podmienkach sa termny virtulny exekun systm a spolon behov prostredie vzjomne zamieaj, povaujeme za dleit poukza na skutonos, e spolon behov prostredie je len jednou z potencilnych konkrtnych implementci virtulneho exekunho systmu.

Akronym CLR je skratkou viacslovnho pomenovania Common Language Runtime.

12

Kapitola 1: Architektonick truktra vvojovo-exekunej platformy Microsoft .NET Framework 3.5 V zujme zachovania istoty vkladovho textu budeme alej v tejto publikcii pouva termn virtulny exekun systm. Virtulny exekun systm poskytuje riadenm nzkorovovch softvrovch sluieb, do ktorej patr: aplikcim spravu

Just-In-Time (JIT) kompilcia pseudostrojovho kdu MSIL (Microsoft Intermediate Language3) do podoby natvnych (strojovch) intrukci triedy x86. Alokcia a dealokcia pamovch segmentov, ktor s asociovan s objektmi. Garancia typovej bezpenosti. Sprva aplikanch domn a programovch vlkien. Automatick manament ivotnch cyklov objektov, ktor zabezpeuje automatick sprvca pamte (Garbage Collector, GC). Interoperabilita medzi vrstvami natvneho a riadenho programovho kdu. Virtulny exekun systm vykonva svoju innos nad vrstvou, ktor tvor operan systm triedy Microsoft Windows4. Vizualizciu komunikanho modelu medzi riadenou aplikciou, virtulnym exekunm systmom, operanm systmom Microsoft Windows a hardvrom potaa zobrazuje obr. 1.2.

Jazyk MSIL sa niekedy oznauje len ako IL (Intermediate Language), resp. CIL (Common Intermediate Language). 4 Napriek tomu, e virtulny exekun systm, podobne ako aj alie zkladn komponenty vvojovo-exekunej platformy Microsoft .NET Framework 3.5, boli spene prenesen na in potaov platformy a operan systmy (naprklad Mac OS i Linux), budeme v tejto publikcii uvaova iba o operanch systmoch triedy Microsoft Windows.

13

Kapitola 1: Architektonick truktra vvojovo-exekunej platformy Microsoft .NET Framework 3.5

Obr. 1.2: Komunikan model medzi riadenou aplikciou, virtulnym exekunm systmom, operanm systmom a hardvrom potaa

1.2 Bzov kninica tried (BCL)


Bzov kninica tried je abstraktnou kninicou, ktor bola vytvoren v slade so smernicami pre hladk implementciu objektovo orientovanej a komponentovej paradigmy programovania. Bzov kninica tried je mnoinou tiscov hodnotovch a odkazovch dtovch typov, ku ktorm patria truktry, vymenovan typy, triedy, 14

Kapitola 1: Architektonick truktra vvojovo-exekunej platformy Microsoft .NET Framework 3.5 rozhrania a delegti. Dtov typy zapuzdren do bzovej kninice tried disponuj vopred naprogramovanou funkcionalitou. Monos ich okamitho pouitia efektvne minimalizuje as, ktor by bolo nutn vynaloi na vytvorenie adekvtneho dtovho typu v rii finlneho vvojra. Okrem rchlej technologickej adopcie je konkurennou vhodou bzovej kninice tried rovnako aj zvenie pracovnej produktivity vvojra a v neposlednom rade tie poskytnutie vysokej miery abstrakcie pri prci s objektmi a spriaznenmi dtovmi truktrami. Vetky hodnotov a odkazov dtov typy deklarovan v bzovej kninici tried s na zklade svojho pracovnho zaradenia roztrieden do fyzicko-logickch celkov, tzv. mennch priestorov. Koreov menn priestor m nzov System, priom zdruuje vetky zkladn menn priestory. Z uvedenho je zrejm, e menn priestory sm by vnran do seba. (Technika vnrania mennch priestorov znamen umiestnenie jednho mennho priestoru do tela inho mennho priestoru.) Kee hbka vnrania mennch priestorov me by variabiln, smieme pre lepiu nzornos usporiadanie mennch priestorov graficky znzorni pomocou stromovch truktr (obr. 1.3).

Obr. 1.3: Vybran menn priestory bzovej kninice tried 15

Kapitola 1: Architektonick truktra vvojovo-exekunej platformy Microsoft .NET Framework 3.5 Menn priestory, ktor s vnoren v koreovom mennom priestore System, resp. menn priestory, ktor s vnoren vo vnorench mennch priestoroch, s dosiahnuten aplikciou opertora priameho prstupu (tie bodkovho opertora) (.). S nrastom rovn vnrania sa zvyuje absoltna poetnos vskytu bodkovch opertorov v identifikanch vrazoch, pomocou ktorch s pre ns poadovan menn priestory dosiahnuten. Naprklad: System.Collections, System.Drawing, System.Diagnostics, System.Reflection a System.Threading (jedna rove vnorenia), System.Drawing.Drawing2D, System.Drawing.Imaging, System.Data.OleDb, System.Linq.Expressions a System.Security.Cryptography (dve rovne vnorenia). Bzov kninica tried je rozriten, o znamen, e ak to povaha zabudovanch dtovch typov umouje, meme na ich zklade vytvra nov, odvoden, pouvatesky deklarovan dtov typy. Najvou mierou rozritenosti disponuj triedy a rozhrania.

1.3 Spolon typov systm (CTS)


Spolon typov systm definuje poiadavky, ktor musia spa vetky dtov typy, s ktormi vvojri na platforme Microsoft .NET Framework 3.5 pracuj. Spolon typov systm rozdeuje dtov typy do dvoch zkladnch skupn: 1. Hodnotov dtov typy. 2. Odkazov dtov typy. Kad z uvedench mnon dtovch typov je tvoren primitvnymi typmi a pouvatesky deklarovanmi typmi (obr. 1.4). Primitvne typy s dtov typy priamo vstavan do spolonho typovho systmu, priom jazykov pecifikcie .NET-kompatibilnch programovacch jazykov spravidla definuj pecilne kov 16

Kapitola 1: Architektonick truktra vvojovo-exekunej platformy Microsoft .NET Framework 3.5 slov, prostrednctvom ktorch s tieto primitvne typy explicitne dosiahnuten. Pouvatesky deklarovan dtov typy s produktom abstraktnho myslenia vvojrov, programtorov a softvrovch expertov. Tieto dtov typy nie s vstavan do spolonho typovho systmu, no spolon typov systm garantuje podmienky, za akch sm by uveden typy vytvran a pouvan.

Obr. 1.4: Klasifikcia dtovch typov spolonho typovho systmu Dtov typy, ktor definuje spolon typov systm, s znme ako systmov dtov typy. Primitvne typy .NET-kompatibilnch programovacch jazykov spolupracuj s ekvivalentnmi systmovmi dtovmi typmi. Naprklad, v jazyku C# 3.0 existuje kov slovo int, ktor na syntaktickej rovni reprezentuje primitvny integrlny znamienkov dtov typ jazyka C# 3.0, ktor je schopn interpretova 32-bitov celoseln hodnoty. V skutonosti je vak kov slovo int iba inm pomenovanm (tzv. aliasom) pre prslun systmov dtov typ System.Int32. Presnejie, primitvny typ int jazyka C# 3.0 odkazuje na hodnotov truktru Int32, 17

Kapitola 1: Architektonick truktra vvojovo-exekunej platformy Microsoft .NET Framework 3.5 ktorej deklarcia je umiestnen v koreovom mennom priestore System. Analogick interakcie jestvuj aj medzi ostatnmi primitvnymi hodnotovmi dtovmi typmi jazyka C# 3.0 (tab. 1.1).
Primitvny typ jazyka C# 3.0 bool char short ushort int uint long ulong float double Ekvivalentn systmov typ System.Boolean System.Char System.Int16 System.UInt16 System.Int32 System.UInt32 System.Int64 System.UInt64 System.Single System.Double Rozsah hodnt logick pravda (true), logick nepravda (false) znaky spravy Unicode (interne 16-bitov cel sla bez znamienka) <-32768, 32767> <0, 65535> <-231, 231 1> <0, 232 1> <-263, 263 1> <0, 264 1> <-3,4 x 1038, 3,4 x 1038> <-1,79 x 10308, 1,79 x 10308> Charakteristika 8-bitov logick hodnota 16-bitov seln kd textovho znaku spravy Unicode 16-bitov celoseln hodnota so znamienkom 16-bitov celoseln hodnota bez znamienka 32-bitov celoseln hodnota so znamienkom 32-bitov celoseln hodnota bez znamienka 64-bitov celoseln hodnota so znamienkom 64-bitov celoseln hodnota bez znamienka 32-bitov relna hodnota s jednoduchou presnosou 64-bitov relna hodnota s dvojnsobnou presnosou

Tab. 1.1: Vzah primitvnych hodnotovch typov jazyka C# 3.0 a ekvivalentnch systmovch dtovch typov Spolon typov systm vytvra unifikovan typov abstrakciu, ktor je zdiean vetkmi .NET-kompatibilnmi programovacmi jazykmi. To je citen vhoda, pretoe jednotn typov systm napomha spene rozvin koncepciu skutonej jazykovej interoperability. Na platforme Microsoft .NET Framework 3.5 je teda 18

Kapitola 1: Architektonick truktra vvojovo-exekunej platformy Microsoft .NET Framework 3.5 mon, aby medzi sebou komunikovali aplikcie (resp. komponenty), ktor boli napsan v rznych programovacch jazykoch. Povedan inak, aplikcia jazyka C# 3.0 me vyuva dynamicky viazan kninicu (*.dll) pripraven v jazyku Visual Basic 2008 bez toho, aby existovalo riziko vzniku programovch chb plyncich z nekorektnho pouitia dtovch typov, resp. typovej inkompatibility.

Obr. 1.5: Spolon typov systm umouje spoluprcu aplikci pripravench v rznych .NET-kompatibilnch programovacch jazykoch

1.4 Spolon jazykov pecifikcia (CLS)


Spolon typov systm je zrukou toho, e aplikcie napsan v rznych programovacch jazykoch vvojovo-exekunej platformy Microsoft .NET Framework 3.5 mu medzi sebou vies plnohodnotn informan dialg. Lene okrem dtovch typov je nutn tandardizova tie schopnosti programovacch jazykov a ich kompiltorov. Kolekcia zkladnch poiadaviek, ktor mus spa akkovek .NET-kompatibiln programovac jazyk, formuje spolon jazykov pecifikciu. Spolon jazykov pecifikcia naprklad vrav, ako mu programtori pouva primitvne dtov typy, i ako vytvra nov, pouvatesky deklarovan dtov 19

Kapitola 1: Architektonick truktra vvojovo-exekunej platformy Microsoft .NET Framework 3.5 typy. Spolon jazykov pecifikcia tie determinuje syntakticko-smantick programov kontrukcie, ktor svisia s intanciciou tried, implementciou rozhran, dedinosou, polymorfizmom a aplikciou alch elementov objektovo orientovanej paradigmy programovania. V neposlednom rade spolon jazykov pecifikcia zaruuje spracovanie typovo bezpench operci na softvrovch objektoch. Z technickho hadiska vymedzuje spolon jazykov pecifikcia minimlnu mnoinu syntakticko-smantickch kontrukci, ktormi mus disponova ubovon .NET-kompatibiln programovac jazyk. To samozrejme neznamen, e dan programovac jazyk neme obsahova aj in, tzv. komplementrne programov kontrukcie. Tieto komplementrne kontrukcie vak mu psobi len ako nadstavba primrnych kontrukci, ktorch prtomnos vyaduje spolon jazykov pecifikcia. Naprklad, navzdory tomu, e spolon jazykov pecifikcia nedefinuje pouitie smernkov a smernkovej aritmetiky, programovac jazyk C# 3.0 umouje vvojrom pouva smernky a realizova ich aritmetiku v blokoch tzv. nebezpenho (unsafe) zdrojovho kdu. No jazyk Visual Basic 2008 pouitie smernkov nepodporuje, take spoluprca v tejto oblasti s jazykom C# 3.0 nie je mon. Je teda potrebn poukza na skutonos, e zatia o syntaktickosmantick programov kontrukcie definovan spolonou jazykovou pecifikciou s garantovan naprie vetkmi .NET-kompatibilnmi programovacmi jazykmi, pre komplementrne programov kontrukcie to neplat. Korelciu medzi syntakticko-smantickmi programovmi kontrukciami implementovanmi v jazykoch C# 3.0, C++/CLI a Visual Basic 2008 meme znzorni pomocou Vennovch diagramov (obr. 1.6).

20

Kapitola 2: Zostavenie riadenej aplikcie a jeho truktra

Obr. 1.6: Spolon jazykov pecifikcia determinuje mnoinu syntaktickosmantickch programovch kontrukci, ktor mus obsahova akkovek .NETkompatibiln programovac jazyk

2 Zostavenie riadenej aplikcie a jeho truktra


Zostavenie5 je pomenovanie pre mnoinu spriaznench sborov, medzi ktormi existuj vzjomn prepojenia a ktor s pre potreby sprvy, riadenia verzi a distribcie povaovan za samostatn logick jednotku. Ak vravme o zostaven riadenej aplikcie, tak mme na mysli vetky sasti, z ktorch je dan aplikcia zloen. Zostavenie je spravidla tvoren nasledujcimi komponentmi: Manifest. Kad zostavenie riadenej aplikcie mus obsahova manifest, ktor charakterizuje zostavenie a vymedzuje jeho intern truktru. V manifeste s zoskupen tieto informcie:

Termn zostavenie je v originli oznaovan termnom assembly.

21

Kapitola 2: Zostavenie riadenej aplikcie a jeho truktra o o o o Nzov zostavenia. Zoznam sborov, ktor s sasou zostavenia (spolone s ich kryptografickmi heovmi kdmi). Zoznam importovanch a exportovanch zostaven a dtovch typov. seln identifikcia verzie zostavenia v tvare: H.V.Z.R kde: H je hlavn slo verzie. V je vedajie slo verzie. Z je slo zostavenia. R je slo revzie. o Textov identifikcia kultry zostavenia.

Na kad zostavenie pripad prve jeden manifest. MSIL kd. Zdrojov kd jazyka C# 3.0, podobne ako zdrojov kd akhokovek inho .NET-kompatibilnho programovacieho jazyka, je kompiltorom preloen do formy MSIL kdu. MSIL kd je nzkorovov objektov pseudostrojov kd, pretoe procesory triedy x86 nedoku jeho intrukcie explicitne spracova. Naopak, MSIL kd je strojovm kdom pre virtulny exekun systm. Kd MSIL zavdza unifikciu, pretoe umouje prakticky realizova ideu jazykovej interoperability na platforme .NET (obr. 2.1).

22

Kapitola 2: Zostavenie riadenej aplikcie a jeho truktra

Obr. 2.1: Jazykov interoperabilita je dosiahnuten vaka unifikovanmu kdu pseudostrojovho jazyka MSIL To znamen, e aplikcie vytvoren v rznych .NET-kompatibilnch programovacch jazykoch mu bez problmov spolupracova. To ist plat aj pre komponenty: jedna aplikcia smie by zloen z viacerch komponentov, priom komponenty mu by vyvinut v rznych .NETkompatibilnch programovacch jazykoch. Typov metadta. Typov metadta s dta o dtovch typoch, s ktormi riaden aplikcia pracuje. Vzhadom na to, e informcie o vetkch pouvanch dtovch typoch s integrovan v zostaven riadenej aplikcie, tto aplikcia nie je explicitne zvisl od externch typovch, resp. objektovch kninc. Elimincia uvedenej zvislosti je vekou vhodou, najm ak uvime, ak akopdna bola prca s typickmi COM aplikciami a ich typovmi kninicami. Kee dta o dtovch typoch s uskladnen 23

Kapitola 2: Zostavenie riadenej aplikcie a jeho truktra v zostaven riadenej aplikcie, meme s nimi kedykovek pracova. Dynamick inpekciu typovch metadt smieme realizova pomocou mechanizmu reflexie. Reflexia m podobn vlastnosti ako dynamick identifikcia dtovch typov (RTTI, Run-time Type Identification), ktor poznme z jazyka C++. Natvne intrukcie x86 na inicializciu virtulneho exekunho systmu. Operan systmy triedy Windows s natvnymi aplikciami. Podobne aj virtulny exekun systm je natvnou aplikciou (hoci v jeho podru beia riaden aplikcie). Kee je nutn pred tartom riadenej aplikcie korektne spusti a inicializova virtulny exekun systm, musia by v zostaven riadenej aplikcie prtomn tartovacie bloky natvneho kdu. Ich lohou je spusti virtulny exekun systm a uvies ho do okamite pouitenho stavu. Ke pouvate (prpadne in proces) zale operanmu systmu poiadavku na spustenie aplikcie .NET, operan systm sa skutonos, e ide o riaden aplikciu, dozvie z prznakov, ktor s uloen v hlavike priamo spustitenho sboru riadenej aplikcie. Pretoe operan systm vie, e spustenie riadenej aplikcie si vyaduje natartovanie a inicializciu virtulneho exekunho systmu, podrob exekcii natvne intrukcie, ktor zahajuj innos virtulneho exekunho systmu. Aplikan zdroje. Riaden aplikcia me obsahova rzne zdroje, ku ktorm patria obrzky, tabuky reazcov, ikony, sbory elektronickej dokumentcie, manuly i videosbory interaktvnych kurzov. Vetky tieto zdroje mu programtori zahrn do zostavenia riadenej aplikcie.

24

Kapitola 2: Zostavenie riadenej aplikcie a jeho truktra

2.1 Klasifikcia zostaven riadench aplikci


Nasledujci zoznam uvdza klasifikciu zostaven riadench aplikci poda rznych kritri: 1. kritrium: Poet sborov: Jednosborov zostavenia. Ak obsahuje zostavenie riadenej aplikcie len 1 sbor, tak ide o jednosborov zostavenie. K tejto kategrii zostaven patria naprklad zostavenia tandardnch konzolovch aplikci (ich obsahom je prve jeden priamo spustiten sbor). Viacsborov zostavenia. Ak obsahuje zostavenie riadenej aplikcie 2 a viac sborov, tak ide o viacsborov zostavenie. Viacsborovm zostavenm je naprklad zostavenie, ktor okrem priamo spustitenho sboru obsahuje tie dynamicky previazan kninicu so zdieanou aplikanou logikou. 2. kritrium: Siln pomenovanie: Zostavenia so slabm menom. Ak nie je stanoven inak, vetky implicitne vytvoren zostavenia riadench aplikci s tzv. slabo pomenovan zostavenia. Ak zostavenie disponuje slabm menom, nie je vybaven svojou identitou, ktor sa sklad z tchto sast: meno, slo verzie, kultra, verejn k a digitlny podpis. Zostavenia so silnm menom. Ak zostavenie obsahuje svoju identitu, ide o silno pomenovan zostavenie. Zostavenia so silnm menom sm okrem svojich dtovch typov pracova len s dtovmi typmi inch silno pomenovanch zostaven.

25

Kapitola 3: Technick rozbor riadenej exekcie jednovlknovej riadenej aplikcie 3. kritrium: Dynamick aspekty zostavenia: Statick zostavenia. Implicitne s vetky vytvoren zostavenia riadench aplikci statick. To znamen, e vetky sasti zostavenia s uloen na pevnom disku potaa, odkia sa v prpade potreby natavaj do operanej pamte potaa. Dynamick zostavenia. Ak je zostavenie vytvoren a uloen v operanej pamti potaa, ide o dynamick zostavenie. Po svojej exekcii mu by dynamick zostavenia uloen na pevn disk (tm sa z nich stan statick zostavenia).

3 Technick rozbor riadenej exekcie jednovlknovej riadenej aplikcie


Riaden exekcia je termn, ktorm oznaujeme proces spustenia a nasledujceho spracovania programovch intrukci riadenej aplikcie. Adjektvum riaden implikuje prtomnos virtulneho exekunho systmu, ktor riadi ivotn cykly riadench aplikci. Riaden exekcia jednovlknovej riadenej aplikcie sa sklad z tchto etp: 1. Vytvorenie fyzickho procesu. Ke operan systm zist, e m by spusten riaden aplikcia, pridel jej svisl adresovaten pamov priestor. Tento pamov priestor je znmy ako fyzick proces riadenej aplikcie. Na 32-bitovch verzich operanho systmu Windows je kadej riadenej aplikcii pridelen fyzick proces so 4-gigabajtovm virtulnym adresovatenm pamovm priestorom. Z pohadu operanho systmu je fyzick proces zkladnm izolanm primitvom, ktor dovouje sben spracovanie viacerch potaovch programov.

26

Kapitola 3: Technick rozbor riadenej exekcie jednovlknovej riadenej aplikcie 2. Spustenie virtulneho exekunho systmu a jeho inicializcia. Po alokcii fyzickho procesu dochdza k aktivcii virtulneho exekunho systmu, ktor bude zodpovedn za manaovanie ivotnho cyklu riadenej aplikcie. 3. Vytvorenie primrnej aplikanej domny. Podobne, ako sa operan systm spolieha na fyzick procesy oby izolan primitva, tak virtulny exekun systm nahliada na aplikan domny. Aplikan domna je logick proces, ktor existuje v rmci fyzickho procesu. V jednom fyzickom procese me koexistova viacero aplikanch domn. Navye, v kadej aplikanej domne smie bea jedna riaden aplikcia, alebo jedna as riadenej aplikcie. Spravovanie kontextu medzi viacermi aplikanmi domnami je ovea efektvnejie ako riadenie viacerch fyzickch procesov. Kad riaden aplikcia m jednu hlavn, tzv. primrnu aplikan domnu, ktor automaticky vytvra virtulny exekun systm. alie, tzv. pracovn alebo tie vedajie aplikan domny, vytvra programtor poda svojich potrieb. 4. Vytvorenie primrneho programovho vlkna6. Programov vlkno predstavuje exekun kanl, na ktorom s spracvan intrukcie riadenej aplikcie. Virtulny exekun systm vklad do primrnej aplikanej domny prve jedno primrne programov vlkno, na ktorom sa bude je poet uskutoova exekcia programovch prkazov. Nech programovch vlkien riadenej aplikcie. Potom meme zavies nasledujcu kategorizciu: Ak Ak ide o jednovlknov riaden aplikciu. ide o viacvlknov riaden aplikciu.

Implicitne s vetky riaden aplikcie jednovlknov. Primrne programov vlkno vak me v prpade potreby vytvra aj alie, tzv. pracovn, resp. vedajie programov vlkna. V tejto kapitole sa budeme venova
6

Termn vlkno sa niekedy stotouje s termnom podproces.

27

Kapitola 3: Technick rozbor riadenej exekcie jednovlknovej riadenej aplikcie ozrejmeniu podstaty riadenej exekcie jednovlknovej riadenej aplikcie. Riaden exekciu viacvlknovej riadenej aplikcie rozoberieme v kapitole 4 Technick rozbor riadenej exekcie viacvlknovej riadenej aplikcie. Vizulny model jednovlknovej riadenej aplikcie je zobrazen na obr. 3.1.

Obr. 3.1: Jednovlknov riaden aplikcia 5. Just-In-Time (JIT) kompilcia MSIL kdu. Len o je primrne programov vlkno pripraven, dochdza k prekladu MSIL kdu do podoby strojovho kdu pomocou Just-In-Time (JIT) kompiltora a k exekcii zskanho strojovho kdu na primrnom programovom vlkne. MSIL kd, nachdzajci sa v zostaven riadenej aplikcie, bude v konenom dsledku preloen do strojovho kdu triedy x86. Za bench okolnost realizuje preklad MSIL kdu do strojovho kdu JIT kompiltor. JIT kompiltor je stroj, ktor je sasou virtulneho exekunho systmu. Ak MSIL kd preklad JIT kompiltor, ide o proces, ktor nazvame preklad na poiadanie. JIT kompiltor je spravidla povolan vdy, ak neexistuje vopred skompilovan natvna verzia riadenej aplikcie. JIT kompiltor preklad 28

Kapitola 3: Technick rozbor riadenej exekcie jednovlknovej riadenej aplikcie jednotliv metdy MSIL kdu poda priority ich exekcie, priom raz preloen metdy s uskladnen do vyhradenej pamovej oblasti primrnej aplikanej domny riadenej aplikcie. Ak je metda raz preloen a prde poiadavka na jej optovn aktivciu, JIT kompiltor nebude MSIL kd prslunej metdy kompilova znova, ale pouije u preloen (natvnu) verziu metdy7.

Obr. 3.2: JIT kompilcia MSIL kdu Vhodou JIT kompilcie je schopnos JIT kompiltora optimalizova vsledn strojov kd vzhadom na intrukn spravu procesora okamite poas prekladu na poiadanie. Slabou strnkou JIT kompilcie je ist
7

Strojov kd preloench metd je tandardne vdy ukladan za elom jeho efektvneho budceho pouitia. Avak me sa sta, e virtulny exekun systm bude nten strojov kd u preloench metd zlikvidova v zujme uvonenia o mono najvieho pamovho priestoru. K tejto situcii dochdza pri kritickom vyuit systmovch prostriedkov, kedy virtulny exekun systm preferuje maximalizciu alokovatenho pamovho priestoru pred optimalizciou exekunho asu JIT kompilcie.

29

Kapitola 3: Technick rozbor riadenej exekcie jednovlknovej riadenej aplikcie postrann ria, ktor sa viae najm s inicializciou JIT kompiltora. Tto postrann ria me zaprini urit latenciu pri span riadenej aplikcie, o me v konenom dsledku nepriaznivo ovplyvni subjektvnu spokojnos pouvatea so tartom riadenej aplikcie. Pri vvoji kritickch aplikci, ktor nepripaj iadne tartovacie latencie, sa preto odpora MSIL kd riadenej aplikcie vopred pretransformova do strojovho kdu. Tento, tzv. poiaton natvny preklad, sa uskutouje obvykle v poslednom intalanom tdiu riadenej aplikcie. Vsledkom po uskutonen poiatonho natvneho prekladu, je natvne zostavenie pvodne riadenej aplikcie. Toto natvne zostavenie obsahuje natvny obraz (teda rdzi strojov kd) a je intalovan do medzipamte natvnych obrazov (NIC, Native Image Cache). Natvne zostavenia meme z riadench zostaven zhotovi programom Native Image Generator (skrtene NGen). Kontrukciu natvneho zostavenia znzoruje obr. 3.3.

Obr. 3.3: Tvorba natvnych obrazov riadench aplikci

30

Kapitola 3: Technick rozbor riadenej exekcie jednovlknovej riadenej aplikcie JIT kompilcia sa uskutouje dovtedy, km: existuj nepreloen metdy (v MSIL kde), pouvate, alebo in proces, neukon beh riadenej aplikcie. ivotn cyklus riadenej aplikcie sa kon v momente, ke je doruen poiadavka na ukonenie aplikcie. V tejto chvli sa najskr ukon spracovanie programovch intrukci na primrnom programovom vlkne. Nsledne virtulny exekun systm zlikviduje primrne programov vlkno, priom detrukcii podrob tie primrnu aplikan domnu. Proces pokrauje terminciou virtulneho exekunho systmu a dealokciou fyzickho procesu (tto innos uskutouje operan systm). Tak dochdza k uvoneniu vetkch systmovch prostriedkov, ktorch pridelenie si jednovlknov riaden aplikcia vyadovala. Kee zdroje s obnoven, mu by pouit pri alch aktivitch, ktor operan systm vykonva. Riaden exekcia jednovlknovej riadenej aplikcie je sekvenn. To znamen, e jednotliv intrukcie s na primrnom programovom vlkne spracvan sekvenne, teda v presnej linernej postupnosti (jedna intrukcia za druhou). Sekvenn spracovanie intrukci meme charakterizova synchrnnym exekunm modelom. Synchrnny exekun model neumouje paralelizciu innost. V zujme detailnejej technickej analzy smieme skma exekciu jednovlknovej riadenej aplikcie na jednojadrovom procesore a na viacjadrovom procesore. Zvery, ku ktorm dospejeme, bud analogicky plati aj pre exekciu jednovlknovej riadenej aplikcie na jednoprocesorovch a viacprocesorovch strojoch. 1. model: Exekcia jednovlknovej riadenej aplikcie na jednojadrovom procesore. Toto je sekvenn exekcia, ktor meme opsa sekvennm exekunm modelom. Jednojadrov procesor potaa doke v jednom asovom momente spracva tok intrukci prve jednho programovho vlkna. V tejto svislosti by sme radi poznamenali, e v jednom hodinovom cykle procesora mu by spracovan viacer mikrointrukcie sasne. Ak doke procesor vykona viacero mikrointrukci sasne v jednom pracovnom cykle, ide o tzv. superskalrny procesor. Intrukcie strojovho 31

Kapitola 3: Technick rozbor riadenej exekcie jednovlknovej riadenej aplikcie kdu, ktor s finlnym produktom JIT kompiltora, s alej segmentovan na mikrointrukcie, ktor s posielan priamo procesoru. Pre potreby efektvnej exekcie mikrointrukci me procesor zmeni poradie ich spracvania, samozrejme so zachovanm ich pvodnej funkcionality (tto technika sa nazva Out-of-Order Execution, teda spracovanie mikrointrukci v inom porad, ne v akom boli pvodne procesoru poskytnut). Hoci je procesor schopn do uritej miery optimalizova exekciu mikrointrukci jednovlknovej riadenej aplikcie, ide o rdzo sekvenn exekciu, ktor nepracuje s paralelizmom.

Obr. 3.4: Sekvenn exekcia jednovlknovej riadenej aplikcie na jednojadrovom procesore 2. model: Exekcia jednovlknovej riadenej aplikcie na viacjadrovom procesore. Ak rozrime vpotov kapacitu systmu dodanm viacerch exekunch jadier procesora, tak beh jednovlknovej riadenej aplikcie bude op sekvenn. Je to preto, e spracvanm toku intrukci primrneho programovho vlkna bude zaneprzdnen len jedno exekun jadro procesora. Ostatn exekun jadr nebud vyuit, pretoe neexistuj 32

Kapitola 3: Technick rozbor riadenej exekcie jednovlknovej riadenej aplikcie iadne alie programov vlkna, ktor by mohli by na zvynch exekunch jadrch procesora realizovan. Z uvedenho vyplva, e spustenie jednovlknovej riadenej aplikcie na viacjadrovom procesore neprina iaden implicitn nrast jej vkonnosti. 3. Hoci jedno exekun jadro bude pracova na maximum, celkov vyuitie vpotovej kapacity systmu nikdy nepresiahne hodnotu jadrovho procesora bude plati toto: , kde . Spustenie je poet exekunch jadier viacjadrovho procesora. V prpade 4jednovlknovej riadenej aplikcie na potai osadenom 4-jadrovm procesorom znamen len 25-percentn vyuitie vkonnostnho potencilu stroja.

Obr. 3.5: Sekvenn exekcia jednovlknovej riadenej aplikcie na viacjadrovom procesore

33

Kapitola 4: Technick rozbor riadenej exekcie viacvlknovej riadenej aplikcie

4 Technick rozbor riadenej exekcie viacvlknovej riadenej aplikcie


Ak disponuje riaden aplikcia aspo dvomi programovmi vlknami, oznaujeme ju ako viacvlknov. Jedno z vlkien i naalej zostv primrnym programovm vlknom, zatia o ostatn vlkna vystupuj ako pracovn vlkna. Ke vyvjame viacvlknov aplikciu, mali by sme vdy presne vymedzi pracovn modely jednotlivch vlkien.

Obr. 4.1: Viacvlknov riaden aplikcia Viacvlknov aplikcia umouje pseudoparaleln, alebo rdzo paraleln exekciu tokov programovch intrukci, v zvislosti od toho, na akej potaovej stanici je spusten. Podobne ako pri analze riadenej exekcie jednovlknovej riadenej aplikcie, tak aj pri skman spracovania viacvlknovej riadenej aplikcie stanovme dva zkladn exekun modely: 34

Kapitola 4: Technick rozbor riadenej exekcie viacvlknovej riadenej aplikcie 1. model: Exekcia viacvlknovej riadenej aplikcie na jednojadrovom procesore. Tento exekun model oznaujeme termnom pseudoparaleln exekcia. Vzhadom na to, e jednojadrov procesor m iba jedno exekun jadro, v jednom okamihu smie spracva programov intrukcie prve jednho programovho vlkna. Ak je riaden aplikcia viacvlknov, v jednej aplikanej domne bude koexistova mnoina programovch vlkien. Operan systmy triedy Windows (ale samozrejme aj in modern operan systmy) podporuj viacvlknov spracovanie riadench aj natvnych aplikci. Vaka preemptvnemu viacvlknovmu spracovaniu s viacvlknov aplikcie spracvan nasledujcim iteratvnym spsobom: Kadmu programovmu vlknu je pridelen tzv. asov kvantum. asov kvantum je najmenia jednotka alokcie vpotovej kapacity procesora. Ak vlkno zska asov kvantum, vetky vpotov zdroje jednojadrovho procesora sa bud sstredi na vykonanie programovch intrukci danho vlkna. Pritom plat, e ako prvmu bude asov kvantum poskytnut primrnemu programovmu vlknu (to je pochopiten, kee primrne vlkno je asociovan s metdou, ktor predstavuje vstupn bod viacvlknovej aplikcie). Vo chvli, ke asov kvantum primrneho programovho vlkna pominie, procesor v sinnosti s operanm systmom zabezpe uchovanie aktulneho stavu spracovania tohto programovho vlkna. Stav spracovania mus by vdy archivovan, pretoe predstavuje vznamn ukazovate pracovnho progresu vlkna, ktor bude vyuit pri nasledujcej interakcii s vlknom. Procesor sa v alom kroku presva na nasledujce pracovn programov vlkno a zana spracva jeho tok programovch intrukci. Vpotov kapacita procesora je dedikovan tomuto vlknu, km neuplynie jeho asov kvantum. Ak sa tak stane, ulo sa aktulny stav spracovania tohto vlkna a procesor sa presva na alie vlkno v porad. Poradie, v akom s jednotliv vlkna 35

Kapitola 4: Technick rozbor riadenej exekcie viacvlknovej riadenej aplikcie spracvan, je ovplyvnen ich prioritou. Kad vlkno smie disponova jednm z niekokch prioritnch stupov. Hoci z pohadu operanho systmu existuje znane irok kla prioritnch stupov programovch vlkien, vvojri pracujci v jazyku C# 3.0 maj na vber z piatich prioritnch stupov. Interakcia s programovmi vlknami poda ich priority znamen, e najskr bud realizovan vlkna s vymi prioritnmi stupami, a potom vlkna s niou prioritou8. Naznaen migrcia medzi vlknami sa odohrva a dovtedy, km procesor neobsli aj posledn programov vlkno. Tm sa dokon jedna itercia, v rmci ktorej boli realizovan programov intrukcie vetkch vlkien tvoriacich viacvlknov riaden aplikciu. Kee fyziklna dka asovho kvanta je krtka9, z vonkajieho pohadu sa zd, e programov vlkna pracuj sbene, a teda paralelne. Nie je to vak tak, lebo paraleln spracovanie by znamenalo vykonanie tokov intrukci viacerch vlkien naraz, ie v rovnakom ase. Iteratvne spracovanie viacvlknovej aplikcie na jednojadrovom procesore vak tejto poiadavke nezodpoved, a preto ho oznaujeme termnom pseudoparaleln. Len o je hotov jedna itercia pseudoparalelnho spracovania programovch vlkien viacvlknovej aplikcie, zana sa alia itercia. V nej procesor v sinnosti s operanm systmom znovu spracva intrukcie jednotlivch vlkien, avak samozrejme pokrauje tam, kde v predchdzajcej itercii skonil (bod pokraovania je jednoznane determinovan archivovanm stavom spracovania programovho vlkna). Itercie v naznaenom porad sa
Mohlo by sa zda, e vlkna s malou prioritou nebud obslen tak asto ako je potrebn, resp. e za uritch okolnost nebud obslen vbec. Nie je to tak. Operan systm v spoluprci s virtulnym exekunm systmom monitoruje priebeh spracovania programovch vlkien a pokia by sa stalo, e niektor vlkna s dlh as neinn, me im by automaticky zven priorita tak, aby dokzali zska asov kvantum. 9 Vekos asovho kvanta je variabiln, no rdovo sa pohybuje v milisekundovch intervaloch.
8

36

Kapitola 4: Technick rozbor riadenej exekcie viacvlknovej riadenej aplikcie opakuj a do konca ivotnho cyklu viacvlknovej riadenej aplikcie10.

Obr. 4.2: Pseudoparaleln exekcia viacvlknovej riadenej aplikcie na jednojadrovom procesore Proces zdieania vpotovch zdrojov jednojadrovho procesora pri riadenej exekcii viacvlknovej riadenej aplikcie pomocou prideovania asovch kvnt je zobrazen na obr. 4.3.

Samozrejme, me sa sta, e niektor pracovn programov vlkno zanikne. Za tchto okolnost alie itercie pracuj len s tmi vlknami, ktor s v pohotovostnom stave (ide o tzv. iv vlkna).

10

37

Kapitola 4: Technick rozbor riadenej exekcie viacvlknovej riadenej aplikcie

Obr. 4.3: Alokcia asovch kvnt pri pseudoparalelnej exekcii Komentr k obr. 4.3: Schma zobrazuje proces alokcie asovch kvnt jednotlivm vlknam viacvlknovej riadenej aplikcie pri ich exekcii na jednojadrovom procesore. V ase t1 zska asov kvantum k1 primrne programov vlkno v1. Poas plynutia asovho kvanta s vpotov kapacity jednojadrovho procesora k dispozcii vhradne primrnemu programovmu vlknu. Ke asov kvantum k1 v ase t2 vypr, procesor poskytuje asov kvantum k 2 prvmu pracovnmu vlknu (v2). Po spracovan vlkna v2 a uplynut asovho kvanta k2 je asov kvantum poskytnut aliemu pracovnmu programovmu vlknu v porad (v3). Prideovanie asovch kvnt sa opakuje a pokia nie s obslen vetky programov vlkna riadenej aplikcie. To sa v naom prpade deje a do momentu, kedy uplynie asov kvantum k4. Kee naa aplikcia je 4-vlknov, v ase t5 bude pridelen asov kvantum op prvmu, a teda primrnemu vlknu aplikcie. Analogicky, v ase t5+k1 zska asov kvantum znova prv pracovn vlkno (v2), v ase t5+k1+k2 druh pracovn vlkno (v3), at.

38

Kapitola 4: Technick rozbor riadenej exekcie viacvlknovej riadenej aplikcie V naom schematickom modeli definujeme asov kvantum takto: , kde a . Zavdzame teda abstrakciu, e asov kvant s presne rovnak. V praktickch podmienkach sa vak dka asovch kvnt me do istej miery variabilne odliova, ie presnejie by sme mohli poveda, e asov kvant poskytovan programovm vlknam s pribline rovnak. Z pohadu naej analzy si vak meme dovoli vplyv uvedench diferenci zanedba. 2. model: Exekcia viacvlknovej riadenej aplikcie na viacjadrovom procesore. Toto je variant rdzo paralelnej exekcie viacvlknovej riadenej aplikcie. Paraleln exekcia znamen, e jednotliv programov vlkna riadenej aplikcie bud presne namapovan na exekun jadr procesora. V zujme dosiahnutia paralelnej exekcie viacvlknovej aplikcie, je nutn prija tieto predpoklady: 1. Optimlny poet programovch vlkien. Idelne je, ak je poet programovch vlkien rovn potu exekunch jadier viacjadrovho procesora. Ak teda pracujeme na stroji s 2jadrovm procesorom, riaden aplikcia by mala obsahova 2 programov vlkna, ktor bud vykonvan paralelne. Analogicky, na 4-jadrovom procesore dospejeme k optimlnej kompozcii so 4 programovmi vlknami. Vo veobecnosti smieme vyhlsi, e poet programovch vlkien je linerne zvisl od potu exekunch jadier procesora. Je preto nutn vyvarova sa prli nzkemu potu programovch vlkien (z dvodu nevyuitia celkovej vkonnostnej kapacity potaovho systmu) ako aj prli vysokmu potu programovch vlkien (nie je mon ich paraleln exekcia z dvodu nedostatonho potu exekunch jadier procesora). 2. klovatenos programovch vlkien. Je dleit poukza na skutonos, e optimlny poet vlkien je na rzne vkonnch strojoch variabiln. V kadom prpade je potrebn prija premisu klovatenho potu programovch vlkien. klovatenos 39

Kapitola 4: Technick rozbor riadenej exekcie viacvlknovej riadenej aplikcie definujeme ako schopnos viacvlknovej riadenej aplikcie flexibilne sa prispsobi hocako vkonnej hardvrovej platforme. Aj ke je pochopiten, e na menej vkonnch strojoch bude viacvlknov riaden aplikcia podva ni vkon ako na vysokovkonnch pracovnch staniciach, vdy mus operova s optimlnym potom vlkien pre aktulnu hardvrov infratruktru. 3. Optimlna distribcia pracovnho zaaenia programovch vlken. loha, ktor viacvlknov riaden aplikcia riei, mus by algoritmizovan tak, aby bolo zabezpeen rovnomern rozloenie pracovnho zaaenia na vetky programov vlkna. V procese problmovej dekompozcie je preto nutn exaktne determinova innosti, ktor bud programov vlkna uskutoova, resp. bloky dtovch truktr, s ktormi bud vlkna operova. Ak je aplikcia zloen z programovch vlkien, kad z nich by malo riei celej lohy. Ak je pracovn zaaenie distribuovan rovnomerne, dochdza k elimincii stavov, v ktorch urit vlkno, resp. vlkna vykonaj svoju innos skr ako ostatn vlkna. V danom kontexte by sme zaznamenali stav, kedy by ist vlkna boli zaneprzdnen vykonvanm svojich innost, zatia o in vlkna by boli nevyuit. 4. Elimincia zvislost medzi viacermi programovmi vlknami. Kee sa chceme vyhn kolznym stavom, ktor vznikaj predovetkm pri konkurennom prstupe k zdieanm objektom i dtovm zdrojom, bude nutn projektova prcu programovch vlkien tak, aby medzi nimi nevznikali iadne nepriazniv interferencie. Praktick rieenia tchto problmov s veden dvomi smermi:

40

Kapitola 4: Technick rozbor riadenej exekcie viacvlknovej riadenej aplikcie 1. Vylenie zdieanch zdrojov. Z pvodne zdieanho zdroja meme urobi nezdiean zdroj, a to tm spsobom, e kadmu programovmu vlknu, ktor s prslunm zdrojom mus pracova, poskytneme samostatn kpiu tohto zdroja (tto technika za oznauje termnom privatizcia zdrojov). Tm sa zdiean zdroj stane skromnm zdrojom programovho vlkna. 2. Zabezpeenie synchronizovanho prstupu k zdieanm zdrojom. Operan systm, virtulny exekun systm, bzov kninica tried a jazykov pecifikcia C# 3.0 umouj vvojrom pouva mnoh synchronizan primitva, ktor nariauj jednoznan prstup k zdieanmu zdroju. Napriek tomu, e pouitm synchronizanch primitv dokeme preds potencilne nekonzistentnmu stavu zdroja pri neriadenom prstupe, vdy sa z pvodne paralelnej exekcie dostvame k sekvennej exekcii. Je to preto, e programov vlkno s garantovanm prstupom k zdieanmu zdroju m prednos pred ostatnmi vlknami (ktor akaj, km aktulne vlkno neumon aj im pracova so zdieanm zdrojom). Ak budeme predpoklada splnenie charakterizovanch predpokladov, meme kontatova, e paraleln exekcia viacvlknovej riadenej aplikcie na viacjadrovom procesore je najlepm exekunm modelom, najm o sa tka vyuitia celkovho vkonnostnho potencilu potaa s viacjadrovm procesorom. Paralelizcia znamen sben vykonvanie rznych loh viacermi programovmi vlknami, alebo sben uskutoovanie operci s rznymi blokmi dtovch truktr.

41

Kapitola 4: Technick rozbor riadenej exekcie viacvlknovej riadenej aplikcie

Obr. 4.4: Paraleln exekcia viacvlknovej riadenej aplikcie na viacjadrovom procesore pecilnu pozornos si vyaduje riaden exekcia viacvlknovej riadenej aplikcie, ktorej poet programovch vlkien presahuje poet exekunch jadier procesora. Navzdory tomu, e nejde o idelny stav, v praxi nie je vskyt aplikci s uvedenm vlknovm zloenm ojedinel. V tomto kontexte smieme zavies pecilny exekun model, v ktorom budeme skma vykonanie viacvlknovej aplikcie na viacjadrovom procesore, priom , kde je poet programovch vlkien je poet exekunch jadier procesora. aplikcie a pecilny exekun model: Exekcia viacvlknovej riadenej aplikcie na . V tomto exekunom modeli dochdza ku viacjadrovom procesore, priom kombincii paralelnej a pseudoparalelnej exekcie riadenej aplikcie. V alom vklade budeme vychdza z tchto prems: 1. Viacvlknov aplikcia obsahuje prny poet programovch vlkien. 2. Viacjadrov procesor obsahuje prny poet exekunch jadier.

42

Kapitola 4: Technick rozbor riadenej exekcie viacvlknovej riadenej aplikcie Virtulny exekun systm v koopercii s operanm systmom zabezpeia vytvorenie sprav vlkien ( ) a ich distribciu na exekun jadr procesora. V alej analze budeme vychdza z tchto predpokladov: 1. Poet sprav vlkien je zhodn s potom exekunch jadier procesora, teda SV = EX. 2. Absoltna poetnos ( ) programovch vlkien ( ) je v jednotlivch spravch vlkien identick, teda , kde je kontanta. Rozloenie sprav vlkien na exekun jadr procesora determinujeme funkciou, ktor zabezpeuje generovanie jednoznanho vzahu medzi spravami vlkien a exekunmi jadrami procesora:

Kee sprav vlkien je presne toko, koko je exekunch jadier procesora, meme kontatova, e riaden exekcia sprav vlkien je paraleln. Je to preto, e v jednom asovom okamihu s sbene spracvan viacer spravy vlkien. Na druhej strane, kad sprava vlkien zaha urit poet programovch vlkien. Ak na jedno exekun jadro pripad viacero programovch vlkien, ich exekcia neme by paraleln. Na rovni spracovania programovch vlkien preto identifikujeme pseudoparaleln exekciu, ktor je realizovaten prostrednctvom zdieania vpotovch kapact exekunho jadra procesora. Zdieanie exekunho jadra sa uskutouje pomocou mechanizmu asovch kvnt, ie asovch dvok, ktor s vlknam prideovan poda ich priority. Na obr. 4.5 je znzornen paraleln/pseudoparaleln exekcia viacvlknovej riadenej aplikcie, ktorej poet programovch vlkien prevyuje poet exekunch jadier procesora.

43

Kapitola 4: Technick rozbor riadenej exekcie viacvlknovej riadenej aplikcie

Obr. 4.5: Paraleln/pseudoparaleln exekcia viacvlknovej riadenej aplikcie na viacjadrovom procesore Na obr. 4.6 je zobrazen proces distribcie programovch vlkien viacvlknovej riadenej aplikcie do homognnych sprav vlkien a ich nslednej paralelnej exekcie na jednotlivch exekunch jadrch viacjadrovho procesora.

44

Kapitola 4: Technick rozbor riadenej exekcie viacvlknovej riadenej aplikcie

Obr. 4.6: Distribcia programovch vlkien do sprav a ich exekcia

45

Kapitola 5: Typolgia vlkien

5 Typolgia vlkien
V rmci komplexnej analzy riadenej exekcie jedno- a viacvlknovch riadench aplikci je potrebn doda, e s vlknami sa stretvame na nasledujcich troch rovniach: 1. Programov vlkna. 2. Vlkna operanho systmu. 3. Hardvrov vlkna procesora. Doposia sme explicitne pracovali len s 1. rovou vlkien, a teda vlknami programovmi. Programov vlkna s vlkna, s ktormi pracujeme pomocou syntakticko-smantickch kontrukci programovacieho jazyka C# 3.0, resp. pomocou prostriedkov bzovej kninice tried vvojovo-exekunej platformy Microsoft .NET Framework 3.5. Prca s programovmi vlknami sa vyznauje najvyou mierou abstrakcie, pretoe v tomto ponman s programov vlkna intanciami triedy Thread z mennho priestoru System.Threading. Bliie informcie o explicitnej kontrukcii a pouvan programovch vlkien podme v kapitole 12 Kontrukcia programovch vlkien v jazyku C# 3.0. V hierarchii vlkien je kad programov vlkno asociovan s prve jednm vlknom operanho systmu. Vlkno operanho systmu je natvnym (nie riadenm) prostriedkom, ktorho manament riadi jadro operanho systmu (a nie virtulny exekun systm). V prpade -vlknovch riadench aplikci bude vo vrstve operanho systmu existova natvnych vlkien. S natvnym vlknom je spojen pecilna entita, ktor zaznamenva tatistick daje o ivotnom cykle vlkna. Na strojovej rovni s vlkna operanho systmu mapovan na hardvrov vlkna. Hardvrov vlkno je strojov mechanizmus, ktor umouje simultnnu exekciu mikrointrukci strojovho kdu. Pritom plat, e kad exekun jadro procesora smie v rovnakom ase spracva jedno hardvrov vlkno. Kee medzi hardvrovmi vlknami a exekunmi jadrami procesora existuje relcia typu 1:1, 46

Kapitola 5: Typolgia vlkien pri -jadrovom procesore bude mc by paralelne realizovanch vlkien. Typolgiu vlkien znzoruje obr. 5.1. hardvrovch

Obr. 5.1: Typolgia vlkien Programov vlkna sa delia na nasledujce 2 skupiny: 1. Programov vlkna v popred11. 2. Programov vlkna v pozad12. Rozdiel medzi vlknami v popred a vlknami v pozad spova vo vplyve, ak maj na ivotn cyklus riadenej aplikcie. Riaden aplikcia be dovtedy, dokia existuje aspo jedno programov vlkno v popred, ktor je zaneprzdnen vykonvanm programovch prkazov. I jedno vlkno v popred doke udra riaden aplikciu pri ivote, o je vlastnos, ktor vlkna v pozad nemaj. Bez ohadu na to, koko existuje vlkien v pozad, ak neexistuje iadne aktvne vlkno v popred, exekcia
11 12

Programov vlkna v popred sa v originli nazvaj foreground threads. Programov vlkna v pozad sa v originli nazvaj background threads.

47

Kapitola 5: Typolgia vlkien riadenej aplikcie sa kon. Ak riaden aplikcia obsahuje 1 vlkno v popred a vlkien v pozad, tak innos vetkch vlkien v pozad sa skon vtedy, ke sa terminuje exekcia prkazov na vlkne v popred. Implicitne s vetky riaden aplikcie jednovlknov, priom primrne programov vlkno je vdy vlknom v popred.

48

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov

6 Technick rozbor procesorovch architektr potaovch systmov


V tejto kapitole podme technicky orientovan vklad pracovnch modelov rznych typov mikroprocesorovch architektr s rozlinm stupom podpory paralelnho spracovania vpotovch operci. Pritom sa budeme koncentrova predovetkm na nasledujce typy potaovch systmov: 1. 2. 3. 4. 5. Jednojadrov procesory architektry IA-3213 bez technolgie HT14. Jednojadrov procesory architektry IA-32 s technolgiou HT. Viacjadrov procesory architektry IA-32/Intel 64 bez technolgie HT. Viacjadrov procesory architektry IA-32/Intel 64 s technolgiou HT. Viacprocesorov stroje obsahujce mnoinu jednojadrovch procesorov architektry IA-32 bez technolgie HT. 6. Viacprocesorov stroje obsahujce mnoinu jednojadrovch procesorov architektry IA-32 s technolgiou HT. 7. Viacprocesorov stroje obsahujce mnoinu viacjadrovch procesorov architektry IA-32/Intel 64 bez technolgie HT. 8. Viacprocesorov stroje obsahujce mnoinu viacjadrovch procesorov architektry IA-32/Intel 64 s technolgiou HT.

6.1 Jednojadrov procesory architektry IA-32 bez technolgie HT


Do kategrie jednojadrovch procesorov 32-bitovej architektry IA-32 patria superskalrne procesory s jednm exekunm jadrom, ktor implementuj

13

IA-32 je skratka pre 32-bitov mikroprocesorov architektry spolonosti Intel (Intel Architecture 32). 14 HT je skratka pre technolgiu Hyper-Threading, ktor umouje efektvnejiu exekciu viacvlknovch aplikci.

49

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov paraleln spracovanie mikrointrukci v jednom hodinovom cykle15. Prvm procesorom tejto triedy bol Intel Pentium uveden v roku 1993. Jednojadrov procesor obsahuje tieto funkcionlne bloky: 1. Vyrovnvacie (cache) pamte rznych rovn. Hlavnou lohou vyrovnvacch pamt je minimalizova latenciu, ktor vznik pri transporte dt a programovch intrukci z operanej pamte do procesora. Jednotliv rovne vyrovnvacch pamt sa vo veobecnosti oznauj systmom L 1, L2, ..., Ln. Jednojadrov procesor obsahuje spravidla dve rovne rchlych vyrovnvacch pamt (L1 a L2). So vzrastajcim ordinlnym slovanm rovn vyrovnvacch pamt sa spjaj dva efekty: zvyovanie alokanej kapacity a zvyovanie prstupovej doby. Vyrovnvacia pam L1 je pri niektorch typoch jednojadrovch procesorov vhradne dtovho charakteru (me obsahova len dta, nie programov intrukcie). In typy jednojadrovch procesorov obsahuj segmentovan vyrovnvaciu pam L 1. Segmentcia rozdeuje pam L1 na dve asti, z ktorch jedna je uren na uchovanie dt a druh sli na archivciu programovch intrukci. Vyrovnvacia pam druhej rovne (L2) je unifikovan, take v nej mu by uloen dta spolone s programovmi intrukciami (spomenut unifikcia plat aj pre vyrovnvaciu pam tretej rovne L3 exkluzvne zalenen do serverovch jednojadrovch procesorov). V okamihu, ke procesor potrebuje uskutoni ist operciu s dtami, zist, i sa tieto dta nachdzaj v jednej z vyrovnvacch pamt. Ak no, dta s okamite dosiahnuten, a preto mu by ihne pouit pri realizcii vpotovch operci. Dleit je, e vyrovnvacie pamte s prehadvan po rovniach s tm, e ako prv je vdy analyzovan pam L1. Princp detekcie dt je logick, pretoe procesor najskr skenuje vyrovnvaciu pam s najmenou lokalitou. Ak s dta njden v pamti L1, s
15

Technika paralelnho spracovania mikrointrukci v jednom hodinovom cykle predstavuje nzkorovov paralelizmus (ILP, Instruction Level Parallelism). Kad procesor, ktor je schopn implementova takto nzkorovov paralelizmus, sa oznauje termnom superskalrny.

50

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov bezprostredne pouit16. Ak sa dta vo vyrovnvacej pamti 1. rovne nenachdzaj17, procesor analyzuje pam L2. V prpade, e dta s identifikovan v tejto rovni vyrovnvacej pamte, prenes sa do pamte L1 a vzpt s priamo pouit procesorom. Pri 2-rovovej skladbe vyrovnvacch pamt neexistuje iadna alia vyrovnvacia pam, take ak poadovan dta nebud situovan ani v pamti L2, je nutn vykona transport do operanej pamte a zska dta z nej. Vzhadom na to, e latencia je pri prci s operanou pamou vskutku signifikantn, z pohadu procesora je opercia zska dta z operanej pamte ponman ako vemi pomal (so spotrebou niekoko tisc a niekoko desatisc hodinovch cyklov procesora). 2. Exekun jadro procesora. Exekun jadro procesora tvoria viacer exekun prostriedky, ku ktorm patr: Aritmeticko-logick jednotka na spracovanie operci s celmi slami. Aritmeticko-logick jednotka na spracovanie operci s relnymi slami. Jednotka realizujca hardvrov vetvenie tokov mikrointrukci. 3. Loklny sprvca preruen: L-APIC (Local Advanced Programmable Interrupt Controller). Sprvca L-APIC prijma preruenia od internch prostriedkov jednojadrovho procesora a od externho sprvcu programovch preruen (I/O-APIC). Vetky prijat preruenia s transponovan exekunmu jadru procesora, priom riadia jeho innos. 4. Registre. Jednojadrov procesory architektry IA-32 v sebe integruj kolekciu registrov. Do registrov s ukladan kvant dt s vysokou frekvenciou pouvania. Prstup do registrov je vemi rchly, take ak s poadovan kvant dt njden u v registroch, plne sa eliminuje nutnos
16 17

Tomuto javu sa vrav dtov zsah, angl. cache hit. Tento jav je znmy ako dtov omyl, angl. cache miss.

51

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov skenova alie typy potaovch pamt. Kolekcia registrov je zloen z mnostva registrov rozlinch typov. Naprklad dtov registre s uren na archivciu celoselnch alebo relnych kvnt dt. Adresov registre zase slia na uchovanie pamovch adries. Procesory Intel IA-32 obsahuj tieto typy procesorovch registrov: veobecn registre (na uchovanie dt a adries), segmentov registre (s nositemi 16-bitovch segmentovch selektorov18), EFLAGS registre (registre uren na zisovanie stavu vykonvanho programu a obmedzen kontrolu procesora) a EIP register (tento register obsahuje 32-bitov smernk identifikujci mikrointrukciu, ktor m by vykonan v alom kroku). 5. Systmov rozhranie. Systmov rozhranie spja procesor so systmovou zbernicou, a teda so vetkmi ostatnmi hardvrovmi komponentmi potaovho systmu. Schematick kontrukciu jednojadrovho procesora architektry IA-32 ukazuje obr. 6.1.

Obr. 6.1: Jednojadrov procesor architektry IA-32


18

Segmentov selektor je smernk ukazujci na pamov segment.

52

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov Na obr. 6.1 vidme, e procesor integruje: aritmeticko-logick jednotku na spracovanie operci s celmi slami (ALU0), aritmeticko-logick jednotku na spracovanie operci s relnymi slami (ALU1), jednotku realizujcu hardvrov vetvenie tokov mikrointrukci (BX), 2-rovov vyrovnvaciu pam (L1-cache, L2-cache), loklneho sprvcu preruen, kolekciu registrov a systmov rozhranie.

6.2 Jednojadrov procesory architektry IA-32 s technolgiou HT


Technolgia Intel Hyper-Threading (HT) implementuje do jednojadrovch procesorov architektry Intel IA-32 mechanizmus simultnneho spracovania viacerch programovch vlkien. Simultnne spracovanie programovch vlkien je mon vaka duplikcii prostriedkov procesora, ktor reprezentuj jeho architektonick stav. K prostriedkom definujcim architektonick stav procesora patria predovetkm registre a L-APIC. Ak djde k duplikcii architektonickho stavu procesora, z pohadu operanho systmu a aplikanho softvru sa fyzicky jednojadrov procesor zane javi ako mnoina logickch procesorov. Pokia je jednojadrov procesor vybaven technolgiou HT, je ekvivalentn dvom logickm procesorom. Primrnou podstatou technolgie HT je zabezpeenie maximlneho vyuitia vpotovej kapacity jednojadrovho procesora simultnnym spracovanm mikrointrukci, ktor patria rozdielnym programovm vlknam vykonvanch na samostatnch logickch procesoroch. Pri analze procesorov s HT technolgiou je dleit podotkn, e oba logick procesory zdieaj jedno exekun jadro fyzickho procesora. Procesor s HT technolgiou teda nie je viacjadrovm procesorom v pravom slova zmysle, pretoe obsahuje iba jedno exekun jadro.

53

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov

Obr. 6.2: Jednojadrov procesor architektry IA-32 s HT technolgiou Na obr. 6.2 je zaznamenan organizcia jednojadrovho procesora s HT technolgiou. Je zrejm, e fyzick procesor obsahuje 2 logick procesory s identifiktormi L-CPU-0 a L-CPU-1. Oba logick procesory zdieaj exekun jadro fyzickho procesora, vyrovnvacie pamte a systmov rozhranie. Kee existuj 2 logick procesory, ktor speria o 1 exekun jadro, je nutn zavies mechanizmus, ktor bude garantova efektvnu implementciu simultnneho viacvlknovho spracovania. Tento mechanizmus je zaloen na injektovan mikrointrukci z rznych programovch vlkien, ktor s sbene spracvan na logickch procesoroch. Predpokladajme nasledujci pracovn model: 1. Pri spusten 2-vlknovej aplikcie s jednotliv vlkna rovnomerne rozloen na 2 logick procesory. 2. Exekcia je zahjen 1. vlknom, ktor je spracvan na 1. logickom procesore. Vzhadom na to, e 1. logick procesor v tejto chvli plne okupuje exekun jadro fyzickho procesora, 2. vlkno delegovan na 2. logick procesor nezaznamenva iaden exekun progres. 54

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov 3. V ivotnom cykle 1. vlkna sa objav poiadavka na asovo intenzvnu operciu, naprklad poiadavka na natanie spravy dt. V zvislosti od lokality dt me spracovanie tejto poiadavky trva desiatky, stovky, alebo aj tiscky hodinovch cyklov exekunho jadra fyzickho procesora. Aby poas tohto asovho intervalu nedolo k neelanmu plytvaniu vpotovou kapacitou exekunho jadra fyzickho procesora, technolgia HT pozastav 1. vlkno spracvan na 1. logickom procesore a zahji exekciu 2. vlkna na 2. logickom procesore. Tak je exekun jadro fyzickho procesora zaaen realizovanm mikrointrukci 2. programovho vlkna. 4. Kee asovo intenzvne opercie z pohadu prce exekunho jadra fyzickho procesora19 sa v ivotnch cykloch programovch vlkien vykonvanch na logickch procesoroch objavuj s pomerne vekou frekvenciou, technolgia HT doke efektvne prepna medzi programovmi vlknami, oho dsledkom je aktvne udriavanie exekunho jadra procesora v maximlne vyaenom stave. Na obr. 6.3 sa nachdza vizulna komparcia pracovnch modelov dvoch jednojadrovch procesorov: jeden procesor HT technolgiu nepodporuje, km druh no. Analza sa koncentruje na urit tdium ivotnho cyklu aplikcie, poas ktorho sledujeme pracovn efektvnos exekunho jadra procesora. Pre zjednoduenie uvaujeme o vemi malom tdiu ivotnosti aplikcie, ktor na hardvrovej rovni alokuje maximlne 10 cyklov exekunho jadra procesora. Ak sa poas tohto tdia vyskytn asovo intenzvne opercie s vznamnou latenciou, procesor bez implementovanej HT technolgie generuje mnoinu nevyuitch cyklov. Nevyuit cykly s cykly, v priebehu ktorch nie je procesor zamestnan iadnou innosou (asto vravme, e procesor sa nachdza v neinnom stave). Pri procesore bez HT technolgie tvoria nevyuit cykly v danom konkrtnom prpade 40 % vetkch analyzovanch cyklov.
19

K asovo intenzvnym opercim patr okrem natania i uloenia dt aj akanie na vsledok predchdzajcej opercie, akanie na optovn natanie dt do vyrovnvacch pamt pri dtovom omyle, alebo tie penalizcie, ktor vznikaj dsledkom chybnch predikci budcich exekunch vetiev mikrointrukci.

55

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov Na druhej strane, procesor so zalenenou podporou pre HT technolgiu doke svoje vpotov kapacity naplno obsadi. Ak je potrebn aka na spracovanie intrukci jednho vlkna, exekunmu jadru s ponknut intrukcie druhho vlkna. Tm dochdza k elimincii asovch intervalov, poas ktorch procesor generuje nevyuit pracovn cykly.

Obr. 6.3: Komparcia pracovnch modelov jednojadrovch procesorov bez a s HT technolgiou Prvm procesorom s podporou technolgie HT sa stal Intel Xeon, uren pre nasadenie v serverovch pracovnch staniciach. Prvm procesorom s podporou technolgie HT pre segment finlnych domcich a firemnch pouvateov bol Intel Pentium 4. Spolonos Intel uvdza, e zvenie vkonnosti softvrovch aplikci na jednojadrovch procesoroch s HT technolgiou sa v priemere pohybuje v rozsahu 10 a 30 percent, poda toho, do akej miery s aplikcie optimalizovan pre simultnne spracovanie viacerch tokov programovch intrukci.

56

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov

6.3 Viacjadrov procesory architektry IA-32/Intel 64 bez technolgie HT


Viacjadrov procesor je procesor, ktor v jednom fyzickom balen obsahuje . Kad z osadench exekunch jadier je schopn exekunch jadier, priom spracova jedno hardvrov vlkno mikrointrukci. Exekun jadro pozostva z funkcionlnych blokov, ktor zabezpeuj vykonanie mikrointrukci hardvrovho vlkna. K tmto blokom patria vpotov aritmeticko-logick jednotky, jednotky na vetvenie tokov mikrointrukci, procesorov registre, L-APIC a vyrovnvacia pam 1. rovne (L1-cache). Vyrovnvacia pam 2. rovne (L2cache) je bu zdiean vetkmi exekunmi jadrami procesora, alebo dedikovan, ie vhradne pridelen kadmu exekunmu jadru procesora. Spravidla vak plat pravidlo, e ak je nejak vyrovnvacia pam zdiean, tak ide o vyrovnvaciu pam poslednej rovne, tzv. LLC (Last Level Cache). Ak je pamou LLC vyrovnvacia pam 2. rovne (L2-cache), me by zdiean ona. Naopak, ak procesor obsahuje vyrovnvaciu pam 3. rovne (L3-cache), bude zdiean tto pam. Poet exekunch jadier viacjadrovch procesorov meme ohranii , pre . Prirodzene, maximlny poet exponencilnou funkciou exekunch jadier je obmedzen sasnmi hardvrovmi technolgiami. Nrast potu exekunch jadier me by symetrick (presne modelovan funkciou ) alebo asymetrick (iba ohranien funkciou ). Dsledkom tejto skutonosti je existencia 2-jadrovch, 3-jadrovch a 4-jadrovch procesorov na trhu hardvrovch komponentov. Najrozrenejie viacjadrov procesory spolonosti Intel bez technolgie HT s tieto: Intel Core 2 Duo, 2-jadrov procesor. Intel Core 2 Quad, 4-jadrov procesor. Pre plnos dodajme, e 3-jadrov procesory Phenom X3 produkuje spolonos Advanced Micro Devices (AMD).

57

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov Kontrukciu 2-jadrovho procesora Intel Core 2 Duo meme vidie na obr. 6.4.

Obr. 6.4: Intel Core 2 Duo, 2-jadrov procesor bez technolgie HT Viacjadrov procesor Intel Core 2 Duo obsahuje 2 exekun jadr, priom kad z nich zdruuje tieto sasti: registre, L-APIC, L1-cache a exekun stroj (EX0, resp. EX1). Vyrovnvacia pam L2-cache je zdiean obidvomi exekunmi jadrami. Podobne je zdiean aj systmov rozhranie. Kontrukciu 4-jadrovho procesora Intel Core 2 Quad ukazuje obr. 6.5.

58

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov

Obr. 6.5: Intel Core 2 Quad, 4-jadrov procesor bez technolgie HT Viacjadrov procesor Intel Core 2 Quad zaha 4 exekun jadr s rovnakm potom exekunch strojov (EX0, EX1, EX2 a EX3). Napriek tejto skutonosti nejde o natvny 4-jadrov procesor, ale o prepojenie dvoch 2-jadrovch procesorov. Kad dvojica exekunch jadier zdiea vyrovnvaciu pam 2. rovne, podobne ako aj systmov rozhranie.

6.3 Viacjadrov procesory architektry IA-32/Intel 64 s technolgiou HT


Ak viacjadrov procesor implementuje technolgiu HT, tak kad exekun jadro predstavuje dvojicu logickch procesorov. Prvm viacjadrovm procesorom s implementovanou technolgiou HT bol Intel Pentium Extreme Edition, uveden v roku 2005. Tento procesor obsahoval 2 exekun jadr s HT technolgiou, take softvrov aplikcie mohli v sinnosti s operanm systmom vyuva 4 logick procesory. Najmodernejm viacjadrovm procesorom s technolgiou HT je Intel Core i7. Tento procesor je natvny 4-jadrov procesor (integruje 4 exekun jadr v jednom fyzickom balen) a vaka zalenenej technolgii HT na smieme nahliada ako na spravu 8 logickch procesorov. Grafick model viacjadrovho procesora Intel Core i7 je znzornen na obr. 6.6. 59

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov

Obr. 6.6: Intel Core i7, 4-jadrov procesor s technolgiou HT Z obr. 6.6 je zrejm, e mikroprocesorov architektra Intel Core i7 sa znane odliuje od predchdzajcej architektry Intel Core 2 Duo a Intel Core 2 Quad. Procesor Intel Core i7 obsahuje 4 exekun jadr s rovnakm potom exekunch strojov (EX0, EX1, EX2 a EX3). Kee funkcionlne bloky definujce architektonick stav exekunho jadra boli v kadom jadre zduplikovan, jedno exekun jadro obsahuje 2 logick procesory, ktor zdieaj vpotov kapacity exekunho stroja. Kad exekun jadro m dedikovan 2 rovne vyrovnvacej pamte (L 1-cache a L2cache). Vetky exekun jadr vyuvaj zdiean L3-cache, podobne ako systmov rozhranie. Procesor Intel Core i7 sa sklad z 8 logickch procesorov. Vimnime si vzor, ktor je pouit pri identifikovan jednotlivch logickch procesorov (tab. 6.1).

60

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov

Exekun jadro 1. exekun jadro

Identifiktory logickch procesorov L-CPU-0 L-CPU-4 L-CPU-1 L-CPU-5 L-CPU-2 L-CPU-6 L-CPU-3 L-CPU-7

2. exekun jadro

3. exekun jadro

4. exekun jadro

Tab. 6.1: Vzor identifikcie logickch procesorov na exekunch jadrch procesora Intel Core i7 Tento identifikan vzor je pozoruhodn, pretoe reflektuje snahy operanho systmu o efektvnejie plnovanie loh pre logick procesory v prpade, ak je poet programovch vlkien softvrovej aplikcie men, alebo nanajv rovn potu exekunch jadier viacjadrovho procesora s podporou technolgie HT. Zkladn princp spova v tom, aby boli rzne lohy delegovan na neinn logick procesory, ktor leia na rznych exekunch jadrch viacjadrovho procesora. Predpokladajme, e na procesore Intel Core i7 s 8 logickmi procesormi je spracvan 4-vlknov aplikcia. Kee dvojice logickch procesorov musia speri o jedno exekun jadro, najefektvnejie je delegova 4 programov vlkna softvrovej aplikcie na 4 logick procesory, ktor sa nachdzaj na rznych exekunch jadrch procesora. Tto situciu zachytva obr. 6.7.

61

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov

Obr. 6.7: Optimlne vyuitie logickch procesorov Vzahy medzi programovmi vlknami aplikcie a logickmi procesormi meme charakterizova takto: 1. programov vlkno je spracvan na logickom procesore L-CPU-0. 2. programov vlkno je spracvan na logickom procesore L-CPU-1. 3. programov vlkno je spracvan na logickom procesore L-CPU-2. 4. programov vlkno je spracvan na logickom procesore L-CPU-3. Vzhadom na to, e v kadom exekunom jadre je aktvny prve jeden logick procesor, s vpotov kapacity prslunho exekunho jadra pridelen vhradne len tomuto logickmu procesoru. Nedochdza tak k iadnemu zdieaniu exekunho stroja jadra, o je za danch okolnost optimlne rieenie. Vkonnos 4-vlknovej softvrovej aplikcie by vak istotne poklesla, keby plnova loh operanho systmu vytvoril takto korelciu medzi programovmi vlknami a logickmi procesormi (obr. 6.8): 1. programov vlkno je spracvan na logickom procesore L-CPU-0. 2. programov vlkno je spracvan na logickom procesore L-CPU-4. 3. programov vlkno je spracvan na logickom procesore L-CPU-1. 4. programov vlkno je spracvan na logickom procesore L-CPU-5.

62

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov 1. a 2. programov vlkno zdieaj exekun stroj EX0 1. exekunho jadra procesora, zatia o 3. a 4. programov vlkno okupuj exekun stroj EX1 2. exekunho jadra procesora. Pretoe logick procesory L-CPU-0 a L-CPU-4 musia zdiea exekun stroj EX0, efektvnos ich prce nebude tak vysok, ako keby kad z logickch procesorov vyuval dedikovan exekun stroj. Samozrejme, to ist plat aj pre innos logickch procesorov L-CPU-1 a L-CPU-5.

Obr. 6.8: Suboptimlne vyuitie logickch procesorov

6.4 Viacprocesorov architektry IA-32/Intel 64


Ak pota uchovva viacero fyzickch procesorov, tak ide o paraleln systm s viacprocesorovou architektrou. V rmci naej technickej analzy sa sstredme na tieto typy viacprocesorovch systmov: 1. Viacprocesorov stroje obsahujce mnoinu jednojadrovch procesorov architektry IA-32 bez technolgie HT. Tento typ viacprocesorovch systmov bol v minulosti najrozrenej. Jeho produkcia nebola prli komplikovan, pretoe jednotliv jednojadrov procesory psobili ako samostatn vpotov jednotky so vzjomnm prepojenm. Na obr. 6.9 ukazujeme kontrukciu viacprocesorovho systmu, ktor je osaden trojicou samostatnch jednojadrovch procesorov architektry IA32 bez technolgie HT. 63

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov

Obr. 6.9: Viacprocesorov stroj obsahujci 3 jednojadrov procesory 2. Viacprocesorov stroje obsahujce mnoinu jednojadrovch procesorov architektry IA-32 s technolgiou HT. Ke do potaa naintalujeme diskrtnych jednojadrovch procesorov s technolgiou HT, logickch procesorov. Na obr. 6.10 je paraleln systm bude obsahova znzornen viacprocesorov systm s 3 fyzickmi jednojadrovmi procesormi s technolgiou HT. Celkovo teda tento viacprocesorov stroj obsahuje 6 logickch procesorov.

Obr. 6.10: Viacprocesorov stroj zloen z 3 jednojadrovch procesorov s technolgiou HT (dovedna 6 logickch procesorov) 3. Viacprocesorov stroje obsahujce mnoinu viacjadrovch procesorov architektry IA-32/Intel 64 bez technolgie HT. Za predpokladu, e viacjadrovch procesorov bez viacprocesorov systm integruje technolgie HT, priom kad viacjadrov procesor pozostva z 64

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov exekunch jadier, meme na takomto viacprocesorovom stroji paralelne spracva hardvrovch vlkien. Obr. 6.11 predstavuje schematick model viacprocesorovho systmu, ktor obsahuje 3 2-jadrov procesory bez technolgie HT. Na takomto potai me by sbene vykonvan estica hardvrovch vlkien.

Obr. 6.11: Viacprocesorov stroj zhotoven z 3 2-jadrovch procesorov bez technolgie HT (dovedna 6 exekunch jadier) 4. Viacprocesorov stroje obsahujce mnoinu viacjadrovch procesorov architektry IA-32/Intel 64 s technolgiou HT. V prpade, ak je viacjadrovmi procesormi, priom viacprocesorov systm vybaven exekunch jadier a podporuje kad viacjadrov procesor obsahuje logickmi technolgiu HT, tak celkov vpotov kapacita je dan procesormi. Povedan inak, takto viacprocesorov stroj je schopn spracova: hardvrovch vlkien, programovch vlkien. Obr. 6.12 ukazuje viacprocesorov systm, ktor sme zskali poskladanm 3 2-jadrovch procesorov s technolgiou HT. Tento viacprocesorov systm obsahuje celkom 6 fyzickch a 12 logickch procesorov.

65

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov

Obr. 6.12: Viacprocesorov stroj skontruovan z 3 2-jadrovch procesorov s technolgiou HT (dovedna 6 fyzickch a 12 logickch procesorov)

6.5 Softvr na programov identifikciu procesorov architektry Intel IA-32 a Intel 64


Spolonos Intel ponka softvrovm vvojrom a potaovm pouvateom programov vybavenie na zistenie zkladnch aj pokroilch informci o jednoa viacjadrovch procesoroch architektr IA-32 a Intel 64, ako aj o technolgich, ktor tieto procesory podporuj. Na webovej adrese http://www.intel.com/support/processors/tools/piu/ je k dispozcii na von prevzatie softvr Intel Processor Identification Utility. V ase psania tejto publikcie bola najaktulnejia verzia uren pre operan systmy Microsoft Windows oznaen selnm identifiktorom 4.0. Po spusten programu Intel Processor Identification Utility meme spoahlivo analyzova schopnosti procesora, ktor je naintalovan v naej potaovej stanici (obr. 6.13).

66

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov

Obr. 6.13: Softvr Intel Processor Identification Utility zisuje informcie o technickch parametroch jedno- a viacjadrovch procesorov architektr IA-32 a Intel 64 Na obr. 6.13 vidme, e program diagnostikoval prtomnos 4-jadrovho procesora Intel Core 2 Quad Q6600. Maximlna hodinov frekvencia kadho exekunho jadra tohto procesora je 2,4 GHz. Frekvencia, s akou prdia dta medzi procesorom a systmovou zbernicou, sa rovn 1066 MHz. Vyrovnvacia pam druhej rovne L2cache m celkov alokan kapacitu 8 MB (je rozdelen do dvoch 4-megabajtovch blokov). Vetky spomenut daje nm poskytne program na (implicitne vybratej) zloke Frequency Test okamite po svojom spusten.

67

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov Ak budeme chcie zska podrobnejie technick charakteristiky procesora, prepneme sa na alie zloky: CPU Technologies (obr. 6.14) a CPUID Data (obr. 6.15).

Obr. 6.14: Prehad podporovanch procesorovch technolgi Procesor Intel Core 2 Quad Q6600 podporuje virtualizan technolgiu Intel Virtualization Technology, podobne ako aj 64-bitov architektru Intel 64. Na druhej strane, procesor nepodporuje technolgiu Hyper-Threading (HT). Pracovn frekvencia jednotlivch exekunch jadier procesora Intel Core 2 Quad me by flexibilne menen prostrednctvom technolgie Enhanced Intel SpeedStep Technology, a to poda aktulneho pracovnho zaaenia procesora. To naprklad znamen, e pri nzkom zaaen sa pracovn frekvencia exekunch jadier 68

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov procesora smie zni z maxima (2,4 GHz) a na 1,6 GHz, o samozrejme pozitvne vplva na prkon a alie energetick charakteristiky procesora. Procesor podporuje aj technolgie SSE, SSE2 a SSE320.

Obr. 6.15: Technick informcie o procesore a vyrovnvacch pamtiach

SSE je skratka z viacslovnho spojenia Streaming SIMD Extensions. SIMD je zase akronym pre Single Instruction, Multiple Data, o je technolgia, ktor umouje paralelne aplikova jednu aritmetick operciu na viacer kvant dt. Technolgia SSE bola po prvkrt implementovan do procesorovej architektry IA-32 s uvedenm procesora Intel Pentium III. Jej prnos spova v nraste vkonnosti procesora pri spracvan vpotovo nronch operci, k akm patr prca s 2D a 3D potaovou grafikou, spracovanie obrazovch sborov a videosborov i rozpoznvanie rei.

20

69

Kapitola 6: Technick rozbor procesorovch architektr potaovch systmov Z obr. 6.15 je zrejm, e kad exekun jadro procesora Intel Core 2 Quad Q6600 obsahuje dedikovan L1-cache na schovu dt i programovch intrukci, obe s alokanou kapacitou 32 KB. Pam L2-cache je segmentovan do dvoch 4megabajtovch blokov, priom kad blok zdieaj 2 exekun jadr procesora. Okrem zmienench technolgi spolupracuje procesor Intel Core 2 Quad Q6600 ete s dvomi: Execute Disable Bit: technolgia umouje chrni pota pred vrusmi a kodlivmi aplikciami. Enhanced Halt State: technolgia, ktor zlepuje akustick aspekty procesora znenm poiadaviek na prkon.

70

Kapitola 7: Paraleln programovanie a paraleln objektovo orientovan programovanie (POOP)

7 Paraleln programovanie a paraleln objektovo orientovan programovanie (POOP)


Podstatou vvoja paralelnho potaovho softvru je analza, nvrh a implementcia paralelnch aplikci, ie aplikci, ktor uskutouj sben spracovanie programovch innost. Aj ke paraleln programovanie ako jedna z paradigiem programovania existuje vo sfre potaovch vied viac desaro, prve signifikantn progres hardvrovch technolgi spsobil, e sa princpy paralelnho programovania dostvaj op do popredia. Potaov vedy diferencuj viacero paradigiem programovania, ktor s zaloen na paralelnom programovan. Produktom paralelnho programovania s aplikcie pre finlnych pouvateov, ktor pracuj na diskrtnych potaovch staniciach. Distribuovan programovanie charakterizuje vetvu, ktor sa zaober analzou, nvrhom a implementciou distribuovanch aplikci, teda aplikci, ktor podporuj paralelizciu programovch innost na mnoine (spravidla geograficky rozptlench) potaov, tvoriacich potaov siete rznej topolgie. Paraleln a distribuovan programovanie spolone patria do tzv. sbenho, resp. konkurennho programovania. Iste, paralelizciu loh sme mohli realizova aj v programovacch jazykoch truktrovanho programovania, no v tejto prci sa sstredme na nov programovaciu paradigmu, ktor nazvame paraleln objektovo orientovan programovanie (POOP). Posun od objektovo orientovanho programovania k paralelnmu objektovo orientovanmu programovaniu (OOP POOP) je poda ns jedinou monou cestou, ako eli vzvam budcnosti. U dnes sa d s vekou spoahlivosou predpoveda posun od architektry multi-core (procesory s menej ako 8 exekunmi jadrami) k architektre many-core (procesory s 8 a viac exekunmi jadrami). Je preto evidentn, e ak budeme chcie, aby nae potaov aplikcie vyuili konkurenn vhodu v podobe mnoiacich sa exekunch jadier modernch procesorov, musme ich navrhn s drazom na paralelizciu programovch innost. Rovnako rozumn sa jav upotrebi vetky siln vlastnosti 71

Kapitola 8: Kvantifikcia nrastu vkonnosti pri POOP objektovo orientovanho programovania, ako najspenejieho programovacieho modelu poslednch rokov.

8 Kvantifikcia nrastu vkonnosti pri POOP


Komernch programtorov zaujma predovetkm nrast vkonnosti, ktor dosiahne pvodne sekvenn aplikcia po svojej paralelizcii. Empiricky by sme mohli inferova matematick vzah pre kvantifikciu nrastu vkonnosti takto:

kde: je koeficient nrastu vkonnosti aplikcie. je najlep exekun as sekvennej aplikcie. je najlep exekun as paralelnej aplikcie pri pouit programovch exekunch jadier viacjadrovho procesora (alebo vlkien a samostatnch procesorov). Nrast vkonu nm vrav, kokokrt rchlejie bude aplikcia spracovan vtedy, ke bude paralelizovan. Uvaujme naprklad konzolov aplikciu, ktor realizuje inicializciu tvorcovej matice typu 10000x10000 pseudonhodnmi celmi slami z vopred stanovenho intervalu. alej predpokladajme, e as spracovania sekvennej konzolovej aplikcie je 10 seknd, zatia o as spracovania paralelnej konzolovej aplikcie je 4 sekundy. Poda uvedenho vzahu plat:

Ako sme empiricky zistili, paraleln aplikcia je 2,5-krt vkonnejia ako ekvivalentn sekvenn aplikcia.

72

Kapitola 8: Kvantifikcia nrastu vkonnosti pri POOP V predchdzajcom prklade sekvenn aj paraleln aplikcia implementovala prve jeden algoritmus: algoritmus, ktor inicializoval maticu pseudonhodnmi celoselnmi hodnotami. Aj ke v ukke sme pouili aplikciu, ktorej vkonn as bola tvoren len jednm algoritmom, komern aplikcie obsahuj spravidla stovky a tisce rozmanitch algoritmov, ktor rieia rozlin lohy. Ak budeme chcie modelova nrast vkonnosti sekvennej aplikcie po jej paralelizcii v tomto ponman, budeme musie zavies inn klasifikciu algoritmov: Nech A je mnoina vetkch algoritmov aplikcie: .

Nech S je podmnoina mnoiny A, ktor obsahuje len sekvenn algoritmy . aplikcie: Nech P je podmnoina mnoiny A, ktor obsahuje len paraleln algoritmy . aplikcie: Z pohadu paralelizcie aplikcie je pre ns vznamn absoltna poetnos paralelnch algoritmov, ktor uchovva mnoina P. S to prve tieto algoritmy, ktor umouj paralelizciu programovch innost. Ak innosti implementovan algoritmami z mnoiny P bud vykonvan sbene, paraleln as aplikcie zaznamen citen nrast vkonnosti pri svojej exekcii na potai s viacjadrovm procesorom. Na druhej strane, algoritmy situovan v mnoine S s rdzo sekvenn, o znamen, e programov innosti implementovan tmito algoritmami nie je mon vykonva sbene. Algoritmy mnoiny S bud spracvan sekvenne, teda jeden za druhm, s nulovou monosou svojej paralelizcie. V zujme exaktnej analzy nrastu vkonnosti, ktor prina paralelizcia, je nutn stanovi relatvnu poetnos ( ) sekvennch a paralelnch algoritmov v potaovej aplikcii. Poda finlnej algoritmickej kompozcie aplikcie meme identifikova nasledujce kompozin modely: 1. kompozin model: Vetky algoritmy aplikcie s sekvenn, teda . Ke je aplikcia tvoren sekvennmi algoritmami, ktor nemono 73

Kapitola 8: Kvantifikcia nrastu vkonnosti pri POOP paralelizova, nememe oakva iaden nrast vkonnosti pri jej exekcii na strojoch s viacjadrovmi procesormi. Vizualizcia modelu:

Obr. 8.1: 1. kompozin model Monos zvenia vkonnosti pri s viacjadrovm procesorom: nulov. exekcii na potai

. 2. kompozin model: Vetky algoritmy aplikcie s paraleln, teda Aplikcia v tejto algoritmickej skladbe doke maximlne vyui vkonnostn potencil paralelne orientovanch potaovch systmov. Ak predpokladme optimlnu klovatenos aplikcie, ide o idelny stav, kedy sa paraleln aplikcia doke prispsobi rzne vkonnej hardvrovej platforme. Nrast vkonnosti vyjadruje linernu, sublinernu, alebo superlinernu zvislos medzi potom exekunch jadier viacjadrovho procesora a koeficientom nrastu vkonnosti. Naprklad, ak vkonnos aplikcie na 2-jadrovom procesore je dan koeficientom 1, tak na 6jadrovom procesore sa bude pri tendencii linerneho nrastu vkonnosti rovna hodnote 3. Vizualizcia modelu:

74

Kapitola 8: Kvantifikcia nrastu vkonnosti pri POOP

Obr. 8.2: 2. kompozin model Monos zvenia vkonnosti pri s viacjadrovm procesorom: maximlna. exekcii na potai

3. kompozin model: Aplikcia obsahuje vie zastpenie sekvennch . Napriek ako paralelnch algoritmov, teda tomu, e relatvna poetnos paralelnch algoritmov je menia ako relatvna poetnos sekvennch algoritmov, aplikcia zaznamen nrast vkonnosti pri svojej exekcii na viacjadrovch procesoroch. Je vak nutn podotkn, e klovaten nrast vkonnosti sa bude dotka len paralelnch algoritmov. Ak bude aplikcia obsahova 40 % paralelnch algoritmov, spustenie aplikcie na vkonnejej hardvrovej platforme urchli spracovanie len tejto mnoiny algoritmov. Vizualizcia modelu:

Obr. 8.3: 3. kompozin model 75

Kapitola 8: Kvantifikcia nrastu vkonnosti pri POOP Monos zvenia vkonnosti pri exekcii na potai s viacjadrovm procesorom: Dan . 4. kompozin model: Aplikcia obsahuje vie zastpenie paralelnch ako sekvennch algoritmov, teda . Tento kompozin model je paralelizcii naklonen viac ako ten predchdzajci. S narastajcim zastpenm paralelnch algoritmov sa zvyuje mnostvo algoritmov, ktor mono podrobi sbenmu spracovaniu. Aplikcia v uvedenom algoritmickom zloen bude disponova vym nrastom vkonnosti v porovnan s predchdzajcim typom aplikcie, pretoe zvenie vkonnosti je limitovan menou relatvnou poetnosou sekvennch algoritmov. Vizualizcia modelu:

Obr. 8.4: 4. kompozin model Monos zvenia vkonnosti s viacjadrovm procesorom: Dan pri . exekcii na potai

5. kompozin model: Zastpenie sekvennch a paralelnch algoritmov v aplikcii je rovnak, teda . Identick relatvna poetnos sekvennch a paralelnch algoritmov predstavuje 50 % potencil zvenia vkonnosti potaovej aplikcie pri jej exekcii na potai s viacjadrovm procesorom. 76

Kapitola 8: Kvantifikcia nrastu vkonnosti pri POOP Vizualizcia modelu:

Obr. 8.5: 5. kompozin model Monos zvenia vkonnosti s viacjadrovm procesorom: Dan pri . exekcii na potai

77

Kapitola 9: Amdahlov zkon

9 Amdahlov zkon
Americk potaov vedec Gene Amdahl stanovil v roku 1967 matematick vzah na urenie maximlneho teoretickho nrastu vkonnosti pvodne sekvennej aplikcie po jej paralelizcii. Tento vzah je v teoretickej informatike znmy ako Amdahlov zkon:

kde: je koeficient maximlneho monho nrastu vkonnosti aplikcie. je exekun as spracovania sekvennch algoritmov aplikcie. je exekun as spracovania paralelnch algoritmov aplikcie. je poet exekunch jadier procesora, resp. poet samostatnch procesorov. Prklad: Uvaujme sekvenn aplikciu, ktor implementuje 100 algoritmov. Jeden algoritmus vykonva v priemere 50 elementrnych operci ( Os), priom spracovanie 1 elementrnej opercie trv 1 milisekundu (ms). as vkonu jednho algoritmu bude 50 ms a celkov as na realizciu sekvennej aplikcie bude 5000 ms. Po analze algoritmickej truktry sekvennej aplikcie zistme, e 60 % algoritmov meme paralelizova. Zvynch 40 % algoritmov je rdzo sekvennch, a teda nepripaj iadnu monos paralelnho spracovania uskutoovanch programovch innost. Na zklade Amdahlovho zkona zisujeme tieto skutonosti: 1. Maximlny teoretick nrast jednojadrovom procesore: vkonnosti aplikcie spustenej na

78

Kapitola 9: Amdahlov zkon 2. Maximlny teoretick nrast vkonnosti aplikcie spustenej na 2-jadrovom procesore:

3. Maximlny teoretick nrast vkonnosti aplikcie spustenej na 4-jadrovom procesore:

Ako vidme, v prvom prpade nedosahuje aplikcia iaden nrast vkonu. To je vak pochopiten, pretoe aplikcia je spusten na jednojadrovom procesore, ktor neumouje paraleln exekciu programovch intrukci. Navzdory faktu, e 60 % algoritmov aplikcie je paralelnch, tieto bud spracvan pseudoparalelne. Zvynch 40 % sekvennch algoritmov bude realizovanch sekvenne. V alch dvoch prpadoch kvantifikujeme pomocou Amdahlovho zkona nrast vkonnosti aplikcie. Je zrejm, e so zvyujcou sa vpotovou kapacitou hardvrovej platformy rastie aj koeficient zvenia vkonnosti potaovej aplikcie. V svislosti s Amdahlovm zkonom si dovolme poukza na interesantn praktick implikcie: 1. Otzka preferencie: M v vznam zvyova vkon hardvrovej infratruktry, teda poet exekunch jadier procesora, alebo zvyova zastpenie paralelnch algoritmov v algoritmickej skladbe potaovej aplikcie? Vychdzajme z naich doterajch vah o imaginrnej potaovej aplikcii. Vypotali sme, e ak bude 60 % vetkch algoritmov spracvanch 79

Kapitola 9: Amdahlov zkon paralelne, tak na potai s 2-jadrovm procesorom meme v idelnom prpade pota s takmer 43% nrastom vkonnosti. Ak nrast vkonnosti vak na rovnakom potai zaznamenme, ak po prepracovan aplikcie zistme, e sme schopn zvi zastpenie paralelnch algoritmov z 60 % na 80 %? V tomto prpade bude sekvennch len 20 zo 100 algoritmov. Poda Amdahlovho zkona plat:

Vkonnos aplikcie v zloen

) bude vyia ako pvodne,

a to na rovnako vkonnej potaovej stanici. Preto smieme kontatova, e viu preferenciu m zvyovanie relatvnej poetnosti paralelnch algoritmov potaovej aplikcie. Prirodzene, ete v nrast vkonnosti aplikcie nameriame, ak ju v zloen spustme na vkonnejom stroji. Pre exekciu aplikcie na potai so 4-jadrovm procesorom plat:

Aplikcia s

-algoritmickou skladbou bude na 4-jadrovom procesore

spracvan 2,5-krt rchlejie. 2. Otzka maximalizcie efektivity: Ak maximlny itok meme zska paralelizciou potaovej aplikcie? Vychdzajc z Amdahlovho zkona meme vyhlsi, e exekun as potrebn na spracovanie paralelnch algoritmov aplikcie, bude klesa v zvislosti od vzrastajceho potu exekunch jadier procesora. Ak budeme paraleln verziu aplikcie porovnva s najvkonnejou sekvennou verziou tejto aplikcie, tak smieme Amdahlov zkon upravi takto: 80

Kapitola 9: Amdahlov zkon

. Tento len predstavuje najlep Do itatea zlomku sme umiestnili len exekun as, ak pri svojom spracovan zaznamenala sekvenn aplikcia. Venujme sa teraz menovateu zlomku. Ak sa bude poet exekunch jadier procesora ( ) zvova, tak hodnota vrazu Teoreticky, pre sa hodnota vrazu sa bude zmenova. bude limitne bli k nule, teda

. Z uvedenho plynie, e ponc uritm hraninm bodom nebude zmyslupln pokraova vo zvyovan potu exekunch jadier procesora, pretoe dodaton nrast vpotovej kapacity stroja nebude ma signifikantn vplyv na alie zvenie vkonnosti potaovej aplikcie. Eliminciou vrazu zkona: dostvame nasledujcu derivciu Amdahlovho

kde: je najlep exekun as sekvennej aplikcie. je exekun as potrebn na spracovanie sekvennch algoritmov v paralelizovanej verzii aplikcie. Praktickou implikciou tohto matematickho vzahu je skutonos, e maximlny mon nrast vkonnosti paralelizovanej potaovej aplikcie bude vdy limitovan exekunm asom, ktorho alokciu si vyiadaj sekvenn algoritmy. V prpade naej aplikcie v algoritmickom zloen plat:

81

Kapitola 9: Amdahlov zkon Paralelizciou aplikcie zskame maximlne 5-nsobn nrast jej vkonnosti. V tab. 9.1 ukazujeme, ako sa zvyuje vkonnos aplikcie pri zvyovan potu exekunch jadier procesora. s 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p TS TP n TP/n Os 80 50 1000 4000 1 4000 80 50 1000 4000 2 2000 80 50 1000 4000 3 1333,333 80 50 1000 4000 4 1000 80 50 1000 4000 5 800 80 50 1000 4000 10 400 80 50 1000 4000 20 200 80 50 1000 4000 40 100 80 50 1000 4000 80 50 80 50 1000 4000 160 25 80 50 1000 4000 320 12,5 80 50 1000 4000 640 6,25 80 50 1000 4000 1280 3,125 80 50 1000 4000 2560 1,5625 80 50 1000 4000 5120 0,78125 80 50 1000 4000 10240 0,390625 Tab. 9.1: Kvantifikcia relcie medzi vkonnosou aplikcie a potom exekunch jadier procesora Legenda k tab. 9.1: je relatvna poetnos sekvennch algoritmov aplikcie. je relatvna poetnos paralelnch algoritmov aplikcie. je poet elementrnych operci pripadajcich na 1 algoritmus. je celkov exekun as spracovania sekvennch algoritmov aplikcie. NV 1 1,666667 2,142857 2,5 2,777778 3,571429 4,166667 4,545455 4,761905 4,878049 4,938272 4,968944 4,984424 4,9922 4,996097 4,998048

82

Kapitola 10: Gustafsonov zkon je celkov exekun as spracovania paralelnch algoritmov aplikcie. je poet exekunch jadier procesora. je koeficient nrastu vkonnosti. Tab. 9.1 ukazuje, ako sa men nrast vkonnosti aplikcie s algoritmickou skladbou pri zvyovan potu exekunch jadier procesora. Ako vidme, vkonnos aplikcie sa dynamicky zvyuje a do okamihu, ke sa poet exekunch jadier dostane na hodnotu 80. Ak by sme teda aplikciu spustili na potai s 80-jadrovm procesorom, teoretick nrast vkonnosti by bol pribline 4,76. Po alej analze zisujeme, e pokusy o dodaton zvenie vpotovej kapacity potaa neprinaj poadovan efekt v nraste vkonu aplikcie. Ak toti zdvojnsobme poet exekunch jadier procesora (na hodnotu 160), celkov nrast vkonnosti bude 4,88, o znamen, e citen rozrenie vpotovch kapact stroja generuje len vemi mal prrastok (0,12) v nraste vkonnosti aplikcie. Ak budeme alej zvyova poet exekunch jadier procesora, relatvne sa bude nrast vkonnosti aplikcie stle zniova. Je zrejm, e teoretick hranica vkonnosti aplikcie bude limitovan koeficientom 5.

10 Gustafsonov zkon
V roku 1988 americk potaov vedec John Gustafson vyslovil modifikciu Amdahlovho zkona, ktor je v teoretickej informatike znma ako Gustafsonov zkon21. Gustafsonov zkon poukazuje na potencilnu neplatnos dvoch prems, z ktorch Amdahlov zkon vychdza: 1. premisa: Vekos rieenho problmu m fixn povahu. Amdahlov zkon predpoklad, e vekos rieenho problmu (resp. vekos intancie rieenho problmu) sa so vzrastajcou vpotovou kapacitou potaovej
21

Gustafsonov zkon sa niekedy nazva aj Gustafsonov-Barsisov zkon.

83

Kapitola 10: Gustafsonov zkon stanice nemen. Napriek tomu, e vekos rieenho problmu me zosta za istch podmienok invariantn voi zvyujcemu sa potu exekunch jadier procesora, resp. voi zvyujcemu sa potu samostatnch procesorov viacprocesorovho stroja, praktick experimenty dokazuj, e vo vine prpadov tto premisa neplat. Vo veobecnosti, ak budeme pracova s rdovo vkonnejm potaovm systmom, tak budeme chcie za rovnako dlh exekun as spracova problm s vou zloitosou. Vzhadom na tendenciu nrastu vekosti rieenho problmu priamo merne s nrastom vpotovej kapacity potaa mono vyhlsi, e nie vekos problmu, ale exekun as algoritmov potrebnch na vyrieenie tohto problmu, je fixnou kategriou. 2. premisa: Sekvenn algoritmus je najlepm rieenm problmu. Tto premisa vyplva zo skutonosti, e vkonnos paralelizovanej aplikcie je porovnvan s vkonnosou najlepej sekvennej aplikcie. Urit mnoinu problmov vak meme efektvnejie vyriei pomocou paralelnch a nie sekvennch algoritmov. Pritom poet krokov paralelnch algoritmov v celkovom vpotovom procese smie by ovea men v porovnan s kompozciou sekvennch algoritmov. Gustafsonov zkon vrav, e medzi vekosou rieenho problmu a vpotovou kapacitou stroja (meranou v naom ponman potom exekunch jadier procesora) existuje linerna zvislos. Ak znsobme poet exekunch jadier procesora, zskame stroj s vou vpotovou kapacitou. Vekos problmu bude ma tendenciu prispsobi sa dodatonmu vkonu hardvrovej platformy. Gustafsonov zkon meme formalizova nasledujcim spsobom:

kde:

84

Kapitola 10: Gustafsonov zkon je klovaten nrast vkonnosti potaovej aplikcie. je exekun as potrebn na spracovanie sekvennch algoritmov. je exekun as potrebn na spracovanie paralelnch algoritmov. je poet exekunch jadier viacjadrovho procesora, resp. poet procesorov viacprocesorovho stroja. Prklad: Predpokladajme algoritmick zloenie ( ) potaovej

aplikcie. Kad algoritmus nech realizuje 50 elementrnych operci ( Os), priom uskutonenie 1 Os trv 1ms. Ak bude klovaten nrast vkonu potaovej aplikcie?

Rovnako meme upotrebi aj upraven podobu Gustafsonovho zkona:

kde: je klovaten nrast vkonnosti potaovej aplikcie. je poet exekunch jadier viacjadrovho procesora, resp. poet procesorov viacprocesorovho stroja. je pomer exekunho asu sekvennch algoritmov a celkovho exekunho asu, teda:

Po prave zskavame:

85

Kapitola 10: Gustafsonov zkon Pre n prklad plat:

Vsledkom je 60% nrast vkonnosti potaovej aplikcie.

10.1 Komparcia Amdahlovho a Gustafsonovho zkona


Amdahlov zkon vrav, e vkonnos paralelizovanej aplikcie pri rieen problmu fixnej vekosti bude so zvyujcou sa vpotovou kapacitou potaovho systmu narasta a pokia nedosiahne urit hranin bod. Tento hranin bod stanovuje maximlny teoretick nrast vkonnosti, o znamen, e dodaton zvenie vkonu hardvrovej platformy u neprinesie iaden dodaton vkonnostn efekt. Gustafsonov zkon vrav, e klovatenos potaovej aplikcie je zvisl od zvenia vkonnostnej kapacity potaovho systmu. Kee vekos rieenho problmu nie je fixn kategria, poda Gustafsona je mon vdy zaznamena nrast vkonnosti aplikcie, a to za predpokladu, ak bude vekos rieenho problmu narasta spolone s vkonom potaovej stanice. Km poda Amdahlovch prems dochdza so zvyovanm vpotovej kapacity systmu k zniovaniu exekunho asu vkonu algoritmov potaovej aplikcie, Gustafson stanovuje, e klovaten aplikcia bude schopn za rovnako dlh exekun as spracova vie mnostvo prce. Ak vychdzame z Gustafsonovho zkona, meme kontatova nasledujce: Pokia je aplikcia klovaten, tak ke znsobme vekos problmu (mnostvo vykonanej prce) a rovnako linerne zvime vkonnos stroja (poet exekunch jadier procesora, resp. poet procesorov), zskame adekvtny nrast vkonnosti paralelizovanej potaovej aplikcie.

86

Kapitola 11: Linerny, sublinerny a superlinerny nrast vkonnosti pri POOP

11 Linerny, sublinerny a superlinerny nrast vkonnosti pri POOP


Pri analze paralelnch programov sme schopn diagnostikova tri zkladn typy nrastu ich vkonnosti: 1. Linerny nrast vkonnosti. Ak plat rovnica , kde je nrast vkonnosti programu po jeho paralelizcii a je poet exekunch jadier viacjadrovho procesora, tak vravme, e program preukazuje linerny nrast vkonnosti. Tento typ nrastu vkonnosti programu je vo vine prpadov idelnym stavom, teda stavom, kedy kad dodaton zvenie vpotovch kapact potaovej stanice spsob adekvtne zvenie vkonnosti programu. Ke ako mieru zvyovania vkonnosti programu pouijeme skracovanie jeho exekunho asu, tak pri linernej vkonnostnej profilcii sa exekun as programu skrti -krt vdy, ak sa -krt zvi poet exekunch jadier viacjadrovho procesora. 2. Sublinerny nrast vkonnosti. Hoci teoreticky je paraleln program schopn dosiahnu linerny nrast vkonnosti, vina paralelnch programov spracvanch v praktickch podmienkach vykazuje men ako linerny nrast svojej vkonnosti. Ak plat rovnica kde je nrast vkonnosti programu po jeho paralelizcii a je poet exekunch jadier viacjadrovho procesora, tak vravme, e vkonnos programu je sublinerna. Sublinerne sprvanie sa vkonnostnej funkcie spsobuj najm vkonnostn penalizcie, ktor svisia s vedajmi nkladmi generovanmi riadenm ivotnch cyklov programovch vlkien, ich synchronizciou a suboptimlnym vyuvanm dostupnch vyrovnvacch pamt. 3. Superlinerny nrast vkonnosti. V ojedinelch prpadoch meme pri skman paralelnch programov detegova vy ako linerny nrast vkonnosti. Za tchto okolnost plat, e , kde je nrast vkonnosti programu po jeho paralelizcii a je poet exekunch jadier viacjadrovho 87

Kapitola 11: Linerny, sublinerny a superlinerny nrast vkonnosti pri POOP procesora. To znamen, e -nsobn zvenie potu exekunch jadier viacjadrovho procesora spsob vy ako -nsobn nrast vkonnosti paralelnho programu. Tento extremlny stav svis predovetkm s optimlnym vyuvanm vyrovnvacch pamt, tzv. cache-efektom. Ak s dta, s ktormi algoritmy paralelnho programu manipuluj, kompletne natan do vyrovnvacch pamt, dochdza k elimincii vkonnostnch penalizci, ktor by inak vznikali v svislosti s pamovou latenciou zaprinenou lokalitou dt. Vizualizcia linerneho, sublinerneho a superlinerneho nrastu vkonnosti paralelnho programu je znzornen na obr. 11.1.

Obr. 11.1: Vizualizcia linerneho, sublinerneho a superlinerneho nrastu vkonnosti paralelnho programu Komentr k obr. 11.1: V schme sledujeme zvislos medzi potom exekunch jadier potaovej stanice a nrastom vkonnosti paralelnch programov oznaench identifiktormi A a F. Program A disponuje linernym nrastom vkonnosti, pretoe pri svojej aktivcii na 2-jadrovom procesore zaznamen 2nsobn nrast vkonnosti. Programy B, D a E s umiestnen v modrej oblasti, ktor predstavuje sublinerny nrast vkonnosti. Z uvedench programov je najmenej 88

Kapitola 12: Kontrukcia programovch vlkien v jazyku C# 3.0 vkonn program D, pretoe ak ho spustme na potai so 4-jadrovm procesorom, jeho vkonnos nie je ani dvojnsobn. Programy C a F s zakreslen v ruovej oblasti, ktor zdruuje paraleln programy so superlinernym nrastom vkonnosti. V skutonosti je program C spusten na 3-jadrovom procesore 4-krt vkonnej, ako keby sme ho spustili na potai s jednojadrovm procesorom. Program F zaznamenva na potai s 5 jadrami takmer 6-nsobn nrast svojej vkonnosti.

12 Kontrukcia programovch vlkien v jazyku C# 3.0


Vvojri pracujci s programovacm jazykom C# 3.0 maj viacero monost, ako pristupova k tvorbe paralelnch aplikci. V tejto kapitole rozoberieme explicitn paralelizmus, ktor spova v manulnom vytvran programovch vlkien a v priamom injektovan zdrojovho kdu, ktor bude na tchto vlknach spracvan.

12.1 Manipulcia s primrnym programovm vlknom


Na vyej rovni abstrakcie je programov vlkno v jazyku C# 3.0 reprezentovan intanciou triedy Thread z mennho priestoru System.Threading. Nasledujci fragment zdrojovho kdu jazyka C# 3.0 ukazuje, ako zskame zkladn informcie o primrnom programovom vlkne jednovlknovej riadenej aplikcie:
static void Main(string[] args) { // Zskanie odkazu na primrne programov vlkno. Thread primrneVlkno = Thread.CurrentThread; // Nastavenie identifiktora primrneho programovho vlkna. primrneVlkno.Name = "Primrne vlkno"; Console.WriteLine("Informcie o primrnom programovom vlkne:" + "\nIdentifiktor: " + primrneVlkno.Name + "\nIdentifikan slo: " + primrneVlkno.ManagedThreadId + "\nPriorita: " + primrneVlkno.Priority + "\nStav: " + primrneVlkno.ThreadState); }

89

Kapitola 12: Kontrukcia programovch vlkien v jazyku C# 3.0 Ak nie je stanoven inak, je kad novo zaloen riaden aplikcia jednovlknov. Kee primrne programov vlkno vytvra automaticky virtulny exekun systm, meme s nm okamite pracova. Odkaz na objekt (intanciu triedy Thread), ktor reprezentuje primrne programov vlkno, zskame volanm skalrnej statickej vlastnosti CurrentThread triedy Thread (tto vlastnos je uren len na tanie). Odkaz na primrne programov vlkno ukladme do typovo silnej odkazovej premennej s identifiktorom primrneVlkno. Hoci virtulny exekun systm disponuje kompetenciami na vytvorenie primrneho programovho vlkna, toto vlkno nie je implicitne pomenovan. To znamen, e primrne programov vlkno nem svoj identifiktor. Vo veobecnosti plat konvencia, aby vvojri jednotliv vlkna nleite pomenovali, pretoe ak bud vetky vlkna disponova svojimi identifiktormi, ich monitorovanie (a to najm pri laden aplikcie) bude ovea jednoduchie. Primrnemu programovmu vlknu naej riadenej aplikcie prisudzujeme identifiktor pomocou skalrnej intannej vlastnosti Name. Identifiktorom vlkna sa me sta akkovek korektne zapsan postupnos textovch znakov a cifier, ktor vyhovuje nomenklatrnym pravidlm pre pomenovanie programovch entt jazyka C# 3.0. Kad vlkno charakterizuje mnoina metadt, ku ktorm patr okrem identifiktora identifikan slo (jednoznan identifiktor vlkna medzi ostatnmi vlknami), priorita vlkna a aktulny stav vlkna. Po spusten uvedenho fragmentu zdrojovho kdu zistme, e nae primrne programov vlkno sa vol Primrne vlkno, jeho identifikan slo je 1, m normlnu prioritu a je prve spusten (stav Running).

90

Kapitola 12: Kontrukcia programovch vlkien v jazyku C# 3.0

Obr. 12.1: Zkladn daje o primrnom programovom vlkne Ak na riadok kdu, v ktorom dochdza k volaniu metdy WriteLine triedy Console umiestnime loklny bod preruenia (klvesom F9, resp. kliknutm do sivho vertiklneho pruhu) a aplikciu spustme, meme prostrednctvom dialgovho okna Threads monitorova zloenie jedno- alebo viacvlknovch riadench aplikci (obr. 12.2). V dialgovom okne Threads sa nachdza viacero stpcov, ktor charakterizuj jednotliv programov vlkna. Kee pri laden riadench aplikci vytvra ladiaci program (debugger) viacero pomocnch pracovnch vlkien, vidme v okne Threads v poet vlkien. Primrne programov vlkno je vak prve jedno, priom v stpci Category je identifikovan ako Main Thread. V stpci ID je uveden intern identifikan slo primrneho programovho vlkna (intern identifikan slo primrneho programovho vlkna je in ako identifikan slo tohto vlkna, ktor sa zobrazuje na vstupe).

91

Kapitola 12: Kontrukcia programovch vlkien v jazyku C# 3.0

Obr. 12.2: Dialgov okno Threads Kad programov vlkno je asociovan s istou metdou, zdrojov kd ktorej je na prslunom vlkne vykonvan. V prpade primrneho programovho vlkna meme tto asociciu bada v stpci Location. Vidme, e na primrnom programovom vlkne je spracvan kd hlavnej metdy Main (to je fixn, a teda nemenn stav). V predposlednom stpci Priority je zobrazen priorita programovho vlkna. Primrne programov vlkno m normlnu prioritu. Normlny stupe priority maj okrem primrneho programovho vlkna aj vetky programtorom vytvoren pracovn vlkna, ak nie je stanoven inak. Vlkno, ktorho zdrojov kd je prve podroben exekcii, je oznaen ltou pkou (druh stpec zava).

12.2 Manipulcia s pracovnm programovm vlknom


Vvojri mu vytvra svoje vlastn pracovn programov vlkna. To sa na rovni zdrojovho kdu jazyka C# 3.0 deje intanciovanm triedy Thread:
class Program { static void Main(string[] args) { // Vytvorenie novho pracovnho vlkna. Thread pracovnVlkno = new Thread(MetdaPracovnhoVlkna); // Pomenovanie pracovnho vlkna.

92

Kapitola 12: Kontrukcia programovch vlkien v jazyku C# 3.0


pracovnVlkno.Name = "Pracovn vlkno 1"; // Spustenie exekcie na pracovnom vlkne. pracovnVlkno.Start(); // akanie, pokm pracovn vlkno nedokon svoju innos. pracovnVlkno.Join(); } // Defincia metdy, ktor bude spracvan na pracovnom vlkne. private static void MetdaPracovnhoVlkna() { Console.WriteLine("Prebieha vpoet faktorilu..."); Stopwatch sw = new Stopwatch(); sw.Start(); long faktoril = 1; for (int i = 1; i <= 20; i++) { faktoril *= i; } sw.Stop(); Console.WriteLine("loha je splnen."); Console.WriteLine("20! je {0}.", faktoril); Console.WriteLine("Exekun as: {0} ms.", sw.Elapsed.TotalMilliseconds); } }

Komentr k zdrojovmu kdu: Kad pracovn vlkno mus by asociovan s metdou, ktor bude na tomto vlkne podroben exekcii. Pri pohade na intancian prkaz triedy Thread vidme, e kontruktoru odovzdvame cieov metdu. V skutonosti je tento proces komplikovanej, pretoe kontruktoru neodovzdvame cieov metdu, ale odkaz na intanciu delegta ThreadStart, ktor v sebe zapuzdruje odkaz na cieov metdu. Intancian prkaz v znen
Thread pracovnVlkno = new Thread(MetdaPracovnhoVlkna);

nedva explicitne najavo, e dochdza aj ku skontruovaniu delegta ThreadStart. V zujme lepej nzornosti preto smieme pvodn intancian prkaz upravi nasledujcim spsobom:

93

Kapitola 12: Kontrukcia programovch vlkien v jazyku C# 3.0


Thread pracovnVlkno = new Thread( new ThreadStart(MetdaPracovnhoVlkna));

Prirodzene, v takto zapsanom zdrojovom kde dokeme okamite rozozna intanciciu delegta, ktormu poskytujeme odkaz na cieov metdu so stanovenm identifiktorom. Po spracovan intancianho prkazu triedy Thread existuje nov pracovn vlkno. Toto pracovn vlkno je reprezentovan objektom, ktor sa nachdza v riadenej halde. Je dleit poznamena, e vytvorenie pracovnho vlkna neimplikuje jeho okamit spustenie. Spustenie pracovnho vlkna je opercia, ktor znamen asynchrnne vykonanie kdu cieovej metdy na pracovnom vlkne. Vytvoren pracovn vlkno spustme volanm metdy Start intancie triedy Thread. Aby sme pracovn vlkno ahko rozoznali od primrneho vlkna (a dodatonch vlkien, ktor zhotovuje ladiaci program), prisudzujeme mu pouvatesky prvetiv identifiktor. Cieov metda, ktor je spojen s pracovnm vlknom, je v naej praktickej ukke skromn statick metda, ktor je definovan v primrnej triede programu. Metda je bezparametrick a nevracia ani iadnu nvratov hodnotu. Tieto charakteristiky metdy vyplvajce z jej signatry s dan poiadavkami na zhodu medzi signatrou metdy a signatrou delegta, s intanciou ktorho je metda previazan. Ako vysvetlme o chvu, kontruktor triedy Thread je preaen a dovouje nm pracova aj s parametrickmi cieovmi metdami a parametrickmi delegtmi. V tele cieovej metdy dochdza k vpotu faktorilu sla 20. Vpoet faktorilu je realizovan cyklom, priom metda meria as, ktor je potrebn na spen dokonenie vpotovho procesu. Po spusten programu sa najskr zane vykonva zdrojov kd hlavnej metdy Main (to je pochopiten, pretoe hlavn metda je spracvan na primrnom programovom vlkne). Po zhotoven pracovnho vlkna, vytvoren intancie 94

Kapitola 12: Kontrukcia programovch vlkien v jazyku C# 3.0 delegta a nadviazan spojenia medzi intanciou delegta a cieovou statickou metdou dochdza k spusteniu pracovnho vlkna. Po spusten pracovnho vlkna je kd cieovej metdy injektovan do tohto vlkna a vzpt okamite exekvovan. Ak bude program spusten na potai s jednojadrovm procesorom, jeho exekcia bude pseudoparaleln (existuj 2 programov vlkna, ktorch exekcia bude realizovan zdieanm vpotovch prostriedkov procesora pomocou asovch kvnt). V prpade, e program spustme na 2-jadrovom procesore, operan systm zabezpe distribciu vlkien na obe jadr procesora. Tm zabezpe ich paraleln exekciu. Naa demontrcia je trivilna, lebo primrne vlkno nevykonva sbene iadnu in innos. Len o spustme pracovn vlkno, volme jeho metdu Join, ktor zabrni postupu primrneho vlkna a do momentu, kedy pracovn vlkno nedokon svoju innos. To sa stane vtedy, ke bude hotov spracovanie metdy, ktor je realizovan na pracovnom vlkne. Vstup programu je uveden na obr. 12.3.

Obr. 12.3: Vstup 2-vlknovho programu Ak budeme chcie vykonva na pracovnom vlkne zdrojov kd parametrickej cieovej metdy, budeme musie poui intanciu delegta ParameterizedThreadStart:
class Program { static void Main(string[] args) { Thread pracovnVlkno = new Thread( new ParameterizedThreadStart(MetdaPracovnhoVlkna)); pracovnVlkno.Name = "Pracovn vlkno 1";

95

Kapitola 12: Kontrukcia programovch vlkien v jazyku C# 3.0


pracovnVlkno.Start(25); pracovnVlkno.Join(); } private static void MetdaPracovnhoVlkna(object parameter) { Console.WriteLine("Prebieha vpoet faktorilu..."); Stopwatch sw = new Stopwatch(); sw.Start(); int n = Convert.ToInt32(parameter); long faktoril = 1; for (int i = 1; i <= n; i++) { faktoril *= i; } sw.Stop(); Console.WriteLine("loha je splnen."); Console.WriteLine("{0}! je {1}.", n, faktoril); Console.WriteLine("Exekun as: {0} ms.", sw.Elapsed.TotalMilliseconds); } }

Komentr k zdrojovmu kdu: Prv modifikcia sa dotka intancianho prkazu triedy Thread, v ktorom vytvrame intanciu parametrickho delegta ParameterizedThreadStart. Intancia parametrickho delegta bude spojen s rovnako parametrickou cieovou metdou. Vzhadom na to, e signatra parametrickho delegta definuje jeden formlny parameter typu object, budeme musie formlny parameter s identickm dtovm typom poui aj pri defincii cieovej metdy. Deklarcia parametrickho delegta ParameterizedThreadStart je takto:
public delegate void ParameterizedThreadStart(object obj);

Druh modifikcia je spojen s definciou cieovej metdy. Definovan formlny parameter sli na uchovanie lena, ktorho faktoril budeme chcie vypota. No kee je formlny parameter typu object, musme uskutoni explicitn typov konverziu na konkrtny dtov typ (v naom prpade je to 32-bitov celoseln typ int).

96

Kapitola 12: Kontrukcia programovch vlkien v jazyku C# 3.0 Tretia zmena ovplyvuje spsob, akm je span pracovn vlkno. Zahjenie spracovania zdrojovho kdu na pracovnom vlkne je odtartovan volanm metdy Start, ktor je rovnako parametrick. Metde Start ponkame celoseln hodnotu predstavujcu len, ktorho faktoril chceme vypota. Po komplexnej analze upravenho kdu smieme kontatova, e parametrick entity, s ktormi sa stretvame, s tri: 1. Parametrick delegt ParameterizedThreadStart. 2. Parametrick cieov metda. 3. Parametrick verzia preaenej metdy Start pracovnho vlkna. Slabou strnkou pouitia parametrickho delegta ParameterizedThreadStart a spriaznenej parametrickej metdy je genericita formlneho parametra. Dtovm typom tohto formlneho parametra je object, o znamen, e tento formlny parameter me by inicializovan akoukovek hodnotou hodnotovho alebo odkazovho dtovho typu. Ak budeme chcie striktne zachova typov bezpenos, meme uplatni in postup: 1. Deklarujeme nov triedu (s pracovnm identifiktorom X), ktor bude obsahova tieto entity: Dtov leny na uchovanie poadovanch dt, s ktormi budeme chcie pracova. Parametrick intann kontruktor. Mnoina formlnych parametrov bude navrhnut tak, aby dokzala prija vstupn dta. Cieov bezparametrick metdu (s pracovnm identifiktorom M), ktor bude neskr spracvan na pracovnom vlkne. Napriek tomu, e tto metda bude bezparametrick, bude mc pracova s dtami, pretoe tie bud uchovan v dtovch lenoch, ku ktorm bude ma metda prstup. 97

Kapitola 12: Kontrukcia programovch vlkien v jazyku C# 3.0 2. Zalome intanciu deklarovanej triedy X a nleite ju inicializujeme poadovanmi dtami. Dta poskytneme parametrickmu intannmu kontruktoru triedy. 3. Zhotovme intanciu triedy Thread. Kontruktoru tejto triedy odovzdme odkaz na intanciu bezparametrickho delegta ThreadStart, ktor bude zapuzdrova odkaz na intann cieov metdu (M). Ak opsan postup aplikujeme na prklade s vpotom faktorilu, dopracujeme sa k takmuto obrazu zdrojovho kdu:
// Deklarcia triedy, ktor zdruuje dtov len a cieov metdu. class Faktoril { private int n; public Faktoril(int n) { this.n = n; } public void VypotaFaktoril() { Console.WriteLine("Prebieha vpoet faktorilu..."); Stopwatch sw = new Stopwatch(); sw.Start(); long faktoril = 1; for (int i = 1; i <= n; i++) { faktoril *= i; } sw.Stop(); Console.WriteLine("loha je splnen."); Console.WriteLine("{0}! je {1}.", n, faktoril); Console.WriteLine("Exekun as: {0} ms.", sw.Elapsed.TotalMilliseconds); } } static void Main(string[] args) { Console.Write("Faktoril ktorho sla chcete vypota? "); int n = Convert.ToInt32(Console.ReadLine()); Faktoril faktoril = new Faktoril(n); Thread pracovnVlkno = new Thread(

98

Kapitola 12: Kontrukcia programovch vlkien v jazyku C# 3.0


new ThreadStart(faktoril.VypotaFaktoril)); pracovnVlkno.Name = "Pracovn vlkno 1"; pracovnVlkno.Start(); pracovnVlkno.Join(); Console.Read(); }

Komentr k zdrojovmu kdu: Trieda Faktoril definuje jeden dtov len (n), parametrick intann kontruktor a jednu intann metdu s identifiktorom VypotaFaktoril. Po zaloen objektu triedy Faktoril pecifikujeme len, ktorho faktoril chceme vypota. Z intancianho prkazu triedy Thread je zrejm, e intancia bezparametrickho delegta ThreadStart zska odkaz na intann bezparametrick cieov metdu VypotaFaktoril. Ak bude nam zmerom zska dta z metdy, ktor je spracvan na pracovnom vlkne, zapracujeme mechanizmus, ktorho podstatou bude vyvolanie metdy sptnho volania v okamihu, ke sa skon innos cieovej metdy. Metda sptnho volania bude aktivovan pomocou intancie delegta. Najskr uvdzame komplexn zdrojov kd, a potom k nemu zaujmeme stanovisko.
public delegate void DelegtSV(int n, long faktoril); class Faktoril { private int n; private DelegtSV delegt; public Faktoril(int n, DelegtSV delegt) { this.n = n; this.delegt = delegt; } public void VypotaFaktoril() { Console.WriteLine("Prebieha vpoet faktorilu..."); Stopwatch sw = new Stopwatch(); sw.Start(); long faktoril = 1; for (int i = 1; i <= n; i++) { faktoril *= i; } sw.Stop();

99

Kapitola 12: Kontrukcia programovch vlkien v jazyku C# 3.0


Console.WriteLine("loha je splnen."); Console.WriteLine("Exekun as: {0} ms.", sw.Elapsed.TotalMilliseconds); if (delegt != null) delegt(n, faktoril); } } class Program { static void Main(string[] args) { Thread primrneVlkno = Thread.CurrentThread; primrneVlkno.Name = "Primrne vlkno"; Console.Write("Faktoril ktorho sla chcete vypota? "); int n = Convert.ToInt32(Console.ReadLine()); Faktoril faktoril = new Faktoril(n, new DelegtSV(MetdaSV)); Thread pracovnVlkno = new Thread( new ThreadStart(faktoril.VypotaFaktoril)); pracovnVlkno.Name = "Pracovn vlkno 1"; pracovnVlkno.Start(); pracovnVlkno.Join(); Console.Read(); } public static void MetdaSV(int n, long faktoril) { Console.WriteLine("{0}! je {1}.", n, faktoril); } }

Komentr k zdrojovmu kdu: Mimo triedu Faktoril deklarujeme parametrickho verejne prstupnho delegta s identifiktorom DelegtSV (ide o tzv. delegta sptnho volania, ako indikuje skratka SV v identifiktore delegta). V tele triedy Faktoril definujeme skromn dtov poloku s nzvom delegt, ktorej typom je deklarovan delegt DelegtSV. Tto dtov poloka bude inicializovan odkazom na intanciu delegta DelegtSV. V signatre parametrickho intannho kontruktora triedy Faktoril sa nachdzaj defincie dvoch formlnych parametrov. Z nho pohadu je vznamn druh formlny parameter, ktor oakva odkaz na intanciu delegta sptnho volania. Napokon, v tele metdy VypotaFaktoril je aktivovan pomocou intancie delegta DelegtSV spriaznen metda sptnho volania.

100

Kapitola 12: Kontrukcia programovch vlkien v jazyku C# 3.0 V hlavnej metde Main je vznamn prkaz, ktor zaklad intanciu triedy Faktoril:
Faktoril faktoril = new Faktoril(n, new DelegtSV(MetdaSV));

Druhm argumentom, ktor je odovzdvan parametrickmu intannmu kontruktoru, je odkaz na intanciu delegta sptnho volania. Ako si meme vimn, prve vytvoren intancia delegta DelegtSV je asociovan s cieovou metdou. Tto metda m identifiktor MetdaSV a ide o verejne prstupn, statick a parametrick metdu, ktor je definovan v primrnej triede riadenej aplikcie. Exekcia programu bude nasledujca: 1. Vytvorme intanciu triedy Faktoril, ktor korektne inicializujeme. 2. Dtov poloku delegt vytvorenej intancie inicializujeme odkazom na intanciu delegta sptnho volania, ktor obsahuje odkaz na metdu sptnho volania. 3. Vytvorme intanciu triedy Thread a uskutonme spojenie medzi intanciou delegta ThreadStart a cieovou intannou metdou VypotaFaktoril. Tto metda bude po spusten pracovnho vlkna spracvan asynchrnne na tomto vlkne. 4. Ke sa innos cieovej metdy bude chli ku koncu, pomocou intancie delegta sptnho volania aktivujeme poadovan metdu sptnho volania. Metda sptnho volania me vykona akkovek innos (v naej ukke zobrazuje na vstupe vypotan hodnotu faktorilu zadanho sla). Programov vlkna 2-vlknovej riadenej aplikcie meme monitorova pomocou dialgovho okna Threads (obr. 12.4).

101

Kapitola 12: Kontrukcia programovch vlkien v jazyku C# 3.0

Obr. 12.4: Programov vlkna 2-vlknovej riadenej aplikcie

102

Kapitola 13: Fond pracovnch programovch vlkien

13 Fond pracovnch programovch vlkien


Bzov kninica vvojovo-exekunej platformy Microsoft .NET Framework 3.5 deklaruje v mennom priestore System.Threading triedu ThreadPool. Intancia tejto triedy psob ako riaden fond pracovnch programovch vlkien. Fond vlkien reprezentuje spravu pracovnch vlkien, ktor s automaticky koordinovan virtulnym sprvcom fondu pracovnch vlkien. To znamen, e vvojri nemusia explicitne vytvra a spa pracovn vlkna. Dokonca nie je ani nutn, aby programtori priamo riadili ivotn cykly pracovnch vlkien (tto kompetencia nle sprvcovi fondu pracovnch vlkien). Vaka vyej rovni abstrakcie, ktor zavdza fond vlkien, sa vvojri mu sstredi na pecifikciu loh, ktor maj by uskutonen (tak mono abstrahova od nutnosti explicitne realizova technick innosti spojen s vytvranm a spanm pracovnch vlkien). Sprvca fondu pracovnch vlkien zabezpe mapovanie poadovanch loh na optimlny poet pracovnch vlkien, ktor s zskan z fondu pracovnch vlkien. Sprvca fondu pracovnch vlkien doke pracovn vlkna recyklova. Spomenut schopnos sprvcu prina nasledujce vhody: 1. Zvenie miery optovnej pouitenosti pracovnch vlkien. Sprvca fondu pracovnch vlkien recykluje existujce pracovn vlkna. Konkurennou vhodou tohto prstupu je zruenie relcie typu 1:1 medzi pracovnmi vlknami a lohami, ktor s na tchto vlknach uskutoovan. Recyklcia pracovnch vlkien zavdza relciu typu 1:N, v rmci ktorej smie jedno pracovn vlkno poas svojho ivotnho cyklu vykonva viacero loh. 2. Znenie zaaenia systmu pri vytvran novch a likvidcii existujcich pracovnch vlkien. Algoritmy kontrukcie a detrukcie pracovnch vlkien predstavuj najviu za pre virtulny exekun systm a operan systm. Ak bude minimalizovan vskyt situci, ktor si 103

Kapitola 13: Fond pracovnch programovch vlkien vyntia spracovanie uvedench asovo a priestorovo intenzvnych operci, zvi sa vkonnos viacvlknovej riadenej aplikcie. Je dleit upozorni na skutonos, e vetky pracovn vlkna alokovan z fondu pracovnch vlkien, s vlknami v pozad (ich vlastnos IsBackground je nastaven na logick pravdu). Ak sa ukon innos aj poslednho aktvneho vlkna v popred, virtulny exekun systm v spoluprci so sprvcom fondu pracovnch vlkien zru vetky pracovn vlkna, ktor boli pridelen z fondu (vlkna fondu neudria riaden aplikciu naive). Kad pracovn vlkno z fondu m implicitne stanoven alokan kapacitu svojho zsobnka a normlnu prioritu. Jeden fyzick proces riadenej aplikcie smie obsahova prve jeden fond pracovnch vlkien. Poet loh, ktor bud zasielan fondu vlkien a vzpt delegovan na jednotliv pracovn vlkna je obmedzen iba vekosou intalovanej fyzickej operanej pamte. Fond pracovnch vlkien pracuje implicitne s najviac 250 pracovnmi vlknami na jeden procesor, resp. na jedno exekun jadro viacjadrovho procesora. Maximlny poet pracovnch vlkien meme upravi pouitm statickej metdy SetMaxThreads triedy ThreadPool. Minimlny poet pracovnch vlkien bude vdy v alebo nanajv rovn potu procesorov potaa, resp. potu exekunch jadier viacjadrovho procesora. Praktick pouitie fondu pracovnch vlkien predvedieme na riadenej aplikcii, ktor nm dovol sbene prebera sbory elektronickch knh zo siete Internet. Najskr uvdzame zdrojov kd programu, a potom k nemu pripojme komentr.
using using using using using using using using System; System.Collections.Generic; System.Diagnostics; System.IO; System.Linq; System.Net; System.Text; System.Threading;

namespace diz { // Deklarcia triedy manara, ktor bude uchovva informcie

104

Kapitola 13: Fond pracovnch programovch vlkien


// o zdrojovej a cieovej lokcii sboru elektronickej knihy. class Manar { private string zdrojovSbor, cieovSbor; public Manar(string zdrojovSbor, string cieovSbor) { this.zdrojovSbor = zdrojovSbor; this.cieovSbor = cieovSbor; } public string ZdrojovSbor { get { return zdrojovSbor; } set { zdrojovSbor = value; } } public string CieovSbor { get { return cieovSbor; } set { cieovSbor = value; } } } // Deklarcia primrnej triedy programu. class Program { // Intancicia automatickej udalosti ako synchronizanho // objektu. static AutoResetEvent udalos = new AutoResetEvent(false); // Defincia statickej dtovej poloky na uchovanie potu loh, // ktor bud realizovan pomocou pracovnch vlkien // zskanch z fondu vlkien. static int poetloh; static void Main(string[] args) { // Vytvorenie manarov loh. Kee plnujeme realizova // 3 lohy, vytvrame 3 manarov. Manar webovManar1 = new Manar("http://www.cl.cam.ac.uk/teaching/" + "2000/FoundsCS/Founds-FP.pdf", "c:\\Knihy\\Founds-FP.pdf"); Manar webovManar2 = new Manar("http://home.bway.net/kbeen/teaching/" + "intro/resources/introbook.pdf", "c:\\Knihy\\Introbook.pdf"); Manar webovManar3 = new Manar("http://www.haskell.org/tutorial/" + "haskell-98-tutorial.pdf", "c:\\Knihy\\Haskell-98.pdf");

105

Kapitola 13: Fond pracovnch programovch vlkien


// Zaslanie loh sprvcovi fondu pracovnch vlkien. ThreadPool.QueueUserWorkItem( new WaitCallback(PrevziaSborZWebu), webovManar1); ThreadPool.QueueUserWorkItem( new WaitCallback(PrevziaSborZWebu), webovManar2); ThreadPool.QueueUserWorkItem( new WaitCallback(PrevziaSborZWebu), webovManar3); udalos.WaitOne(); Console.WriteLine("\n************** Vetky lohy s hotov. " + "**************"); Console.Read(); } // Defincia metdy, ktor bude prebera sbory elektronickch // knh z Internetu. private static void PrevziaSborZWebu(object objekt) { Manar manar = (Manar)objekt; Stopwatch sw = new Stopwatch(); WebClient webovKlient = new WebClient(); Console.WriteLine("\n************** Vlkno {0} zahjilo " + "operciu **************"", Thread.CurrentThread.ManagedThreadId); Console.WriteLine("\nPrebieha prevzatie sboru {0}.", manar.ZdrojovSbor); sw.Start(); // Synchrnne prevzatie sboru elektronickej knihy. webovKlient.DownloadFile(manar.ZdrojovSbor, manar.CieovSbor); sw.Stop(); FileInfo atribtySboru = new FileInfo(manar.CieovSbor); Console.WriteLine("\n************** Vlkno {0} ukonilo " + "operciu **************\n", Thread.CurrentThread.ManagedThreadId); Console.WriteLine("Sbor {0} bol stiahnut a uloen." + "\nas: " + sw.Elapsed.Seconds + " s" + "\nVekos sboru: " + atribtySboru.Length / 1024 + " KB", manar.CieovSbor); // Vlknovo bezpen inkrementcia hodnoty statickej // dtovej poloky. Interlocked.Increment(ref poetloh); // Ak s hotov vetky lohy, menme stav synchronizanho // objektu. if(poetloh == 3) udalos.Set(); } } }

106

Kapitola 13: Fond pracovnch programovch vlkien Komentr k zdrojovmu kdu: Deklarovan trieda Manar je pomocnou triedou, ktorej intancie bud uchovva informcie o umiestnen zdrojovch a cieovch sborov elektronickch knh. V naej ukke budeme z webu sbene prebera 3 elektronick knihy, a preto v tele hlavnej metdy Main zakladme a korektne inicializujeme 3 intancie triedy Manar. Zaslanie poiadavky na prevzatie jednho sboru elektronickej knihy uskutoujeme volanm statickej metdy QueueUserWorkItem triedy ThreadPool z mennho priestoru System.Threading. Tto statick metda je preaen: my upotrebujeme jej parametrick definciu, ktorej signatra je naplnen dvomi formlnymi parametrami. Prv z nich oakva odkaz na intanciu delegta WaitCallback. Intancia delegta WaitCallback bude asociovan s cieovou parametrickou metdou, ktorej programov kd bude injektovan do pracovnho vlkna zskanho z fondu pracovnch vlkien. Druh formlny parameter statickej metdy QueueUserWorkItem je schopn prija odkaz na akkovek objekt (i u hodnotovho, alebo odkazovho dtovho typu). V prpade potreby meme metde odovzda odkaz na objekt s dtami. Z prkazu, ktor aktivuje charakterizovan preaen verziu statickej metdy QueueUserWorkItem vyplva, e cieovou metdou je (rovnako statick) metda PrevziaSborZWebu. Cieov metda bude mc pracova s dtovm objektom, ktor statickej metde QueueUserWorkItem ponkame ako druh argument. Kee formlny parameter cieovej metdy PrevziaSborZWebu je primitvneho odkazovho typu object, musme odkaz na dtov objekt podrobi explicitnej typovej konverzii. V momente, ke zskame od pouvatea informcie o tom, ak sbor si praje prevzia a kam ho mme umiestni, volme intann parametrick metdu DownloadFile intancie triedy WebClient z mennho priestoru System.Net. Pouitie metdy DownloadFile je vemi jednoduch a intuitvne: sta, ak urme pozciu zdrojovho sboru (v podobe 1. argumentu) a stanovme jeho lokalizciu po transporte (v podobe 2. argumentu). Aby sme mohli sledova pouitie pracovnch vlkien z fondu vlkien, zobrazujeme identifikan slo pracovnho vlkna. Toto slo jednoznane identifikuje pracovn 107

Kapitola 13: Fond pracovnch programovch vlkien vlkno zskan z fondu vlkien riadenej aplikcie. Rovnako meriame as, ktor je potrebn na prevzatie sboru elektronickej knihy. Nsledne, po uloen u prevzatho sboru, vypisujeme informan sprvu o jeho alokanej kapacite. Vzhadom na to, e chceme pouvatea informova o dokonen spracovania vetkch loh, pracujeme s automatickou udalosou, resp. s intanciou triedy AutoResetEvent, ako so synchronizano-signalizanm objektom. Tento objekt nm umon signalizova stav, ke bud dokonen vetky 3 lohy, ktor pomocou prostriedkov fondu pracovnch vlkien uskutoujeme. Len o sa tak stane, volme metdu Set automatickej udalosti, m jej prikeme vysla signl. Na tento signl ak hlavn metda Main, pretoe v jej tele volme metdu WaitOne objektu automatickej udalosti. V tele cieovej metdy PrevziaSborZWebu vykonvame vlknovo bezpen inkrementciu statickej dtovej poloky pomocou statickej metdy Increment triedy Interlocked z mennho priestoru System.Threading. Po spusten riadenej aplikcie zaregistrujeme uskutonenie tchto akci: 1. Sprvca fondu pracovnch vlkien prijme iadosti o vykonanie 3 loh (prevzatie 3 elektronickch knh). 2. Sprvca fondu pracovnch vlkien vyberie z mnostva disponibilnch pracovnch vlkien 3 vlkna a do kadho injektuje kd cieovej metdy. 3. Pracovn vlkna zan plni delegovan lohy. Na obr. 13.1 je znzornen koopercia medzi programovmi lohami a pracovnmi vlknami fondu pracovnch vlkien. Vstup riadenej aplikcie, vyuvajcej pracovn vlkna z fondu vlkien, je zobrazen na obr. 13.2.

108

Kapitola 13: Fond pracovnch programovch vlkien

Obr. 13.1: Asocicia medzi lohami a pracovnmi vlknami zskanmi z fondu pracovnch vlkien

109

Kapitola 13: Fond pracovnch programovch vlkien

Obr. 13.2: Vstup riadenej aplikcie, ktor pri svojej prci vyuva fond pracovnch vlkien

110

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva

14 Synchronizcia programovch vlkien a synchronizan primitva


Pri programovan viacvlknovch aplikci musme dba na synchronizciu pracovnch innost, ktor programov vlkna uskutouj vtedy, ke pracuj so zdieanmi prostriedkami. Ak by sme toti nesynchronizovali pracovn modely programovch vlkien, ich paraleln exekcia by mohla spsobi konkurenn prstupy k zdieanm prostriedkom s rizikom zanechania tchto prostriedkov v nekonzistentnom stave. Pre ely tejto publikcie budeme skma synchronizciu programovch vlkien, ktor pracuj so zdieanmi prostriedkami. Tmito prostriedkami s najm statick intancie hodnotovch a odkazovch dtovch typov, a to tak primitvnych, ako aj pouvatesky deklarovanch. Viacvlknov riaden aplikcia obsahuje vlkien, ktor okupuj adresov priestor aplikanej domny fyzickho procesu22. Kee jednotliv programov vlkna zdieaj adresov priestor aplikanej domny, mu pristupova k akmkovek prostriedkom, ktor sa v tomto priestore nachdzaj. Pre plnos dodajme, e kad programov vlkno obsahuje vlastn zsobnk, do ktorho s ukladan automatick objekty hodnotovch dtovch typov. Spomenut automatick objekty nie s predmetom synchronizcie, pretoe s loklne pre kad programov vlkno (a nie s teda zdiean viacermi vlknami sasne). Synchronizcia prstupu viacerch programovch vlkien k zdieanm prostriedkom sa uskutouje pomocou synchronizanch primitv. Synchronizan primitva s pecilne synchronizan objekty, ktor garantuj exkluzvny, tzv. vzjomne vluujci sa prstup k zdieanmu prostriedku poas istho asovho intervalu. asov interval, poas ktorho trv exkluzivita prstupu prve jednho programovho vlkna k zdieanmu prostriedku, je spravidla determinovan kritickou sekciou. Kritick sekcia predstavuje blok programovho kdu, ktor me
22

V naich alch vahch budeme predpoklada, e vetky programov vlkna riadenej aplikcie s situovan v jednej aplikanej domne fyzickho procesu tejto aplikcie. Abstrahujeme teda od situci, kedy by programov vlkna boli rozmiestnen naprie viacermi aplikanmi domnami fyzickho procesu riadenej aplikcie.

111

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva v danom okamihu vykonva prve jedno programov vlkno. Ak sa jedno programov vlkno aktulne nachdza v kritickej sekcii, alie vlkno neme do kritickej sekcie vstpi skr, ne ju opust prv vlkno. Z uvedenho vyplva, e synchronizcia eliminuje pravdepodobnos sbenho prstupu viacerch programovch vlkien k zdieanmu prostriedku v kritickej sekcii. Okrem toho vak synchronizcia svis aj s tranzitom medzi paralelnou a sekvennou exekciou programovho bloku, ktor tvor kritick sekciu. Hoci pred vstupom do kritickej sekcie mohla by aplikcia spracvan paralelne, v kritickej sekcii sa men jej exekun model na rdzo sekvenn (vykonanie kdu kritickej sekcie me vo vymedzenom asovom intervale realizova prve jedno programov vlkno). Z hadiska efektvnej exekcie programovch intrukci viacvlknovej riadenej aplikcie je iaduce, aby bol as alokovan na spracovanie kritickej sekcie o mono najkrat.

Obr. 14.1: Kritick sekcia 112

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva Komentr k obr. 14.1: Obrzok ukazuje synchronizovan prstup dvoch programovch vlkien (s identifiktormi A a B) k programovmu bloku, ktor je determinovan kritickou sekciou. Vlkno A vstupuje do kritickej sekcie v ase t1. V tomto ase zana vlkno A vykonva prkazy kritickej sekcie. Exekcia prkazov kritickej sekcie vlknom A sa kon v ase ti, kedy vlkno A opa kritick sekciu. Podotknime, e v ase danom intervalom <t1, ti> neme do kritickej sekcie vstpi iadne in vlkno, pretoe exkluzvnym prstupom k nej disponuje vlkno A. V ase tm (priom plat, e tm > ti) vchdza do kritickej sekcie vlkno B. Toto vlkno spracva prkazy kritickej sekcie poas trvania asovho intervalu <tm, tn>. V ase tn vlkno B opa kritick sekciu. Analogicky, pokia neuplynie asov interval <t m, tn>, iadne in programov vlkno nesmie vstpi do kritickej sekcie. Dvod je evidentn: km nevypr spomenut asov interval, exkluzvny prstup do kritickej sekcie m iba vlkno B. Synchronizcia prstupu k zdieanm prostriedkom je prospen, pretoe nm umouje vyhn sa vzniku vemi nebezpench chb, ku ktorm patria najm preteky vlkien a uviaznutia23.

14.1 Preteky vlkien


Pri pretekoch vlkien je vstup paralelnho programu nedeterministick, pretoe zvis od poradia operci vykonvanch viacermi programovmi vlknami nad nesynchronizovanmi zdieanmi prostriedkami. V zvislosti od toho, ktor programov vlkno a v akom ase vykon operciu so zdieanmi prostriedkom, smie program produkova rzne vstupy, a to pri identickej sprave vstupnch dt. Problmy, ktor sa objavuj pri pretekoch vlkien, budeme demontrova na nasledujcom prklade.

23

Preteky vlkien, resp. uviaznutia s v originli nazvan termnmi race conditions, resp. deadlock.

113

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva Prklad: Mme dve programov vlkna A a B, ktor bud manipulova s dtovm lenom x statickho objektu o. Dtov len x statickho objektu je explicitne inicializovan diskrtnou celoselnou kontantou 60 ete predtm, ako djde k spusteniu programovch vlkien A a B. Vlkno A modifikuje dtov len x tak, e k jeho aktulnej hodnote pripota hodnotu 10, a vzpt hodnotu stu ulo sp do dtovho lena (vlkno A teda spracva prkaz o.x+=10;). Vlkno B modifikuje dtov len x tak, e jeho aktulnu hodnotu del dvomi a podiel vzpt prirad do dtovho lena (vlkno B teda vykonva operciu o.x/=2;). Ak ako prv spustme vlkno A a ako druh spustme vlkno B, budeme zrejme chcie, aby najskr prebehla modifikcia dtovho lena statickho objektu vlknom A, a potom sa uskutonila modifikcia dtovho lena statickho objektu vlknom B. Tto situciu zachytva tab. 14.1. Poradie operci Vlkno A (o.x+=10;) Vlkno B (o.x/=2;) Dtov len statickho objektu (o.x)

1. Nata(o.x): 60 60 2. Modifikova(o.x): 70 60 3. Uloi(o.x): 70 70 4. Nata(o.x): 70 70 5. Modifikova(o.x): 35 70 6. Uloi(o.x): 35 35 Tab. 14.1: Preteky vlkien (situcia . 1 elaten stav, implicitn synchronizcia) V okamihu, ke s obe programov vlkna hotov s pravou stavu statickho objektu, m jeho dtov len hodnotu 35. Analyzovan situcia reprezentuje elaten stav, pretoe modifikcie dtovho lena statickho objektu realizovan programovmi vlknami sa neprekrvaj, ale s uskutoovan v sprvnom (meme poveda implicitne synchronizovanom) porad. Vzhadom na to, e prstupy programovch vlkien A a B k dtovmu lenu statickho objektu nie s zatia explicitne synchronizovan, mu sa vyskytn alie situcie, v ktorch bude finlna hodnota dtovho lena x zvisie od poradia, 114

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva v akom bud vlkna s tmto lenom manipulova. Za predpokladu, e paraleln exekcia bude zahjen vlknom A, dospejeme k vsledkom, ktor s uveden v tab. 14.2. Poradie operci 1. 2. 3. 4. Vlkno A (o.x+=10;) Nata(o.x): 60 Modifikova(o.x): 70 Uloi(o.x): 70 Vlkno B (o.x/=2;) Dtov len statickho objektu (o.x) 60 60 70 30

Nata(o.x): 60 Modifikova(o.x): 30 Uloi(o.x): 30 Tab. 14.2: Preteky vlkien (situcia . 2 nebezpen stav)

Prstup k statickmu objektu nie je explicitne synchronizovan, a preto sa vyskytuj preteky programovch vlkien, ktor zapriuj nekonzistentn finlny stav tohto objektu. Vlkno A v prvej opercii nata inicializan hodnotu dtovho lena statickho objektu, no km ju sta modifikova a aktualizova, vlkno B nata pvodn hodnotu dtovho lena statickho objektu, ktor je aktulne modifikovan vlknom A. Ako vidme, vlkno B nachdza dtov len statickho objektu uprostred modifikanho procesu, ktor je na tento len aplikovan vlknom A. Povedan inak, vlkno B zachytva dtov len statickho objektu v dtovo nesdrnom stave. Pri alej analze dospejeme k tomuto zveru: Hodnota (70), ktor vlkno A ulo do dtovho lena statickho objektu v 3. kroku, bude prepsan hodnotou (30), ktor ulo do tohto lena vlkno B v 4. kroku. Ak zmenme poradie spustenia vlkien, zistme, e preteky vlkien mu generova aliu problematick situciu (tab. 14.3).

115

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva Poradie operci 1. 2. 3. 4. Vlkno A (o.x+=10;) Vlkno B (o.x/=2;) Dtov len statickho objektu (o.x) 60 60 30 70

Nata(o.x): 60 Nata(o.x): 60 Modifikova(o.x): 30 Modifikova(o.x): 70 Uloi(o.x): 30 Uloi(o.x): 70 Tab. 14.3: Preteky vlkien (situcia . 3 nebezpen stav)

Za tchto okolnost diagnostikujeme, e v dtovom lene statickho objektu je po spracovan modifikci uloen hodnota 70. Opakuje sa podobn scenr, ako v predchdzajcom prpade, len s tm rozdielom, e v tomto kontexte to je programov vlkno A, ktor pracuje s nekonzistentnou hodnotou dtovho lena statickho objektu. Sprvanie paralelnho programu, v ktorom sa objavuj preteky vlkien, je nepredvdaten, pretoe hodnota konkrtneho vstupu je ovplyvnen viacermi skutonosami, naprklad internmi asovacmi mechanizmami plnovaa loh operanho systmu, modelom paralelnej exekcie i prioritami programovch vlkien pri pseudoparalelnej exekcii. Problmy, ktor prinaj preteky vlkien, sa pomerne ako identifikuj, pretoe v mnohch relcich me zdanlivo korektn paraleln program produkova sprvne vsledky. Zastpenie chybnch vstupov je variabiln a navye sa vyznauje minimlnou mierou monej predikcie, take softvrov vvojri nie s schopn vopred uri relatvnu poetnos vskytu chybovch stavov. Tento ukazovate vieme zisti iba pomocou empirickej analzy. Rieenie problmu pretekov programovch vlkien spova v synchronizovanom prstupe jednotlivch vlkien k zdieanmu prostriedku (v naom prpade k dtovmu lenu statickho objektu). Za tmto elom pouijeme jedno zo synchronizanch primitv a nariadime synchronizovan prstup k dtovmu lenu statickho objektu. Z mnoiny synchronizanch primitv si vyberieme monitor, o je synchronizan objekt, ktor zabezpe poadovanmu vlknu exkluzvny prstup 116

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva k statickmu objektu poas determinovanho asovho intervalu exekcie kritickej sekcie. Cel opercia bude prebieha takto: 1. Vlkno A pouije monitor na zskanie zmku k statickmu objektu. Zmok garantuje vhradn prstup vlkna A k statickmu objektu poas trvania kritickej sekcie. Kritick sekcia je blok kdu, v ktorom bude vlkno A uskutoova modifikciu hodnoty dtovho lena statickho objektu. Km vlkno A dr pomocou monitora zmok na statickom objekte, nie je mon, aby in vlkno sbene pristupovalo k tomuto objektu. Ostatn vlkna musia aka, dokia vlkno A neuvon zmok nad statickm objektom. 2. Vlkno A uprav hodnotu dtovho lena statickho objektu poda poadovanho vzoru, priom trida operci natanie/modifikcia/uloenie bude realizovan bez rizika preruenia inm programovm vlknom. 3. Po modifikcii stavu statickho objektu vlkno A pomocou monitora uvon zmok k tomuto objektu. Po uvonen zmku a opusten kritickej sekcie vlknom A smie k statickmu objektu zska prstup (op pomocou monitora) vlkno B a vykona s tmto objektom zaman opercie vo svojej kritickej sekcii. Schematick model synchronizovanho prstupu k dtovmu lenu statickho objektu programovmi vlknami A a B ukazuje tab. 14.4.

117

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva Poradie operci 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Vlkno A (o.x+=10;) Zska zmok pomocou monitora. Nata(o.x): 60 Modifikova(o.x): 70 Uloi(o.x): 70 Uvoni zmok pomocou monitora. Vlkno B (o.x/=2;) Dtov len statickho objektu (o.x) 60 akanie na zskanie zmku. 60 60 70 70 Zska zmok pomocou monitora. Nata(o.x): 70 Modifikova(o.x): 35 Uloi(o.x): 35 Uvoni zmok pomocou monitora. Tab. 14.4: Preteky vlkien (situcia . 1 elaten stav, explicitn synchronizcia pomocou monitora) Na obr. 14.2 ukazujeme, ako vyzer synchronizovan prstup dvoch programovch vlkien k statickmu objektu prostrednctvom monitorov. 70 70 70 35 35

118

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva

Obr. 14.2: Synchronizovan prstup viacerch vlkien k statickmu objektu pomocou monitorov

14.2 Praktick prklad detekcie a korekcie pretekov vlkien v jazyku C# 3.0


Program, ktor sme vytvorili v jazyku C# 3.0, vytvra dve pracovn programov vlkna. Obe pracovn vlkna operuj so statickm jednorozmernm poom celch sel. 1. pracovn vlkno vykonva inkrementciu hodnt vetkch prvkov statickho poa, zatia o 2. pracovn vlkno sa koncentruje na dekrementciu hodnt vetkch prvkov statickho poa. Statick pole je v rmci svojej defincie inicializovan aritmetickou postupnosou celch sel z intervalu <1, 5> s diferenciou 1. Kee inkrementcia a dekrementcia s vzjomne opan aritmetick opercie, oakvame, e po skonen innosti oboch pracovnch vlkien

119

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva bude dtov obsah statickho poa zhodn s jeho pvodnm zloenm, ktor sme pou prisdili v ase defininej inicializcie.
using using using using using System; System.Collections.Generic; System.Linq; System.Text; System.Threading;

namespace diz { class Program { // Definin inicializcia statickho jednorozmernho poa. static int[] pole = {1, 2, 3, 4, 5}; static void Main(string[] args) { // Vytvorenie 2-prvkovho poa pracovnch vlkien. Thread[] poleVlkien = { new Thread(new ThreadStart(Inkrementova)), new Thread(new ThreadStart(Dekrementova)) }; Console.WriteLine("Opercia bola zahjen."); // Spustenie pracovnch vlkien. poleVlkien[0].Start(); poleVlkien[1].Start(); // akanie na dokonenie innost pracovnch vlkien. poleVlkien[0].Join(); poleVlkien[1].Join(); Console.WriteLine("Opercia je hotov."); // Kontrola korektnosti modifikcie poa. int set = 0; for (int i = 0; i < 5; i++) { Console.WriteLine("{0}. prvok poa: {1}.", i + 1, pole[i]); set += pole[i]; } if (set != 15) Console.WriteLine("Chybn modifikcia poa."); else Console.WriteLine("Sprvna modifikcia poa.");

120

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva


Console.Read(); } // Defincia metdy 1. pracovnho vlkna. static void Inkrementova() { for (int i = 0; i < 5; i++) { pole[i]++; Console.WriteLine("[PV1-Inkrementcia]: " + "{0}. prvok poa: {1}.", i + 1, pole[i]); Thread.Sleep(500); } } // Defincia metdy 2. pracovnho vlkna. static void Dekrementova() { for (int i = 0; i < 5; i++) { pole[i]--; Console.WriteLine("[PV2-Dekrementcia]: " + "{0}. prvok poa: {1}.", i + 1, pole[i]); Thread.Sleep(500); } } } }

Komentr k zdrojovmu kdu: Princp fungovania 2-vlknovho programu je zrejm. Len o vytvorme statick pole, zostrojujeme dvojicu pracovnch vlkien, ktor uskutouj vzjomn ruiace sa aritmetick modifikcie hodnt prvkov poa. Ke ktorkovek z pracovnch vlkien vykon predpsan transformciu, odole do vstupnho dtovho prdu sprvu o aktulnej hodnote editovanho prvku statickho poa. Medzi modifikciami jednotlivch prvkov statickho poa vlkna akaj 0,5 sekundy (na tento asov interval uvdzame vlkna do reimu spnku). Vo chvli, ke s pracovn vlkna hotov s inkrementano-dekrementanmi operciami, zahajuje primrne vlkno kontrolu sprvnosti modifikcie statickho poa. Ako sme u uviedli, po spracovan modifikci by mal by obsah poa tak ist ako v ase jeho vytvorenia. Set prvkov statickho poa by sa teda mal rovna 121

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva hodnote 15. Ak primrne vlkno zist pri kontrole in stov hodnotu, zobrazuje sprvu o chybnej modifikcii statickho poa. Analyzovan program je chybn, pretoe neimplementuje iaden mechanizmus synchronizcie prstupu pracovnch vlkien k statickmu pou. Problm spova v tom, e pracovn vlkna speria o to, ktor z nich ako prv pristpi k uritmu prvku statickho poa za elom aplikovania aritmetickej opercie. Vzhadom na absentujcu synchronizciu sa me sta, e jedno z pracovnch vlkien zska prstup k prvku statickho poa, ktor je vak v danej chvli modifikovan inm vlknom. Modifikcia v naom ponman predstavuje inkrementciu alebo dekrementciu hodnoty prvku statickho poa. Hoci pre softvrovho vvojra v jazyku C# 3.0 je inkrementcia, resp. dekrementcia atomickou operciou24, v skutonosti to tak nie je. Tak inkrementcia, ako aj dekrementcia je tridou nasledujcich operci: 1. Zskanie hodnoty prvku statickho poa z operanej pamte a jej uchovanie v registri exekunho jadra viacjadrovho procesora. 2. Modifikcia hodnoty prvku statickho poa a jej uloenie do registra exekunho jadra viacjadrovho procesora. 3. Uloenie modifikovanej hodnoty prvku statickho poa exekunho jadra viacjadrovho procesora do operanej pamte. z registra

Pri pretekoch vlkien dochdza k zvanej chybe vo vpotovch procesoch vtedy, ke jedno z pracovnch vlkien zane pracova s prvkom statickho poa predtm, ako in pracovn vlkno dokon cel tridu operci s tmto prvkom poa. Pretoe pracovn vlkno zskava nekorektn hodnotu prvku statickho poa, vsledok jeho prce bude rovnako nesprvny. Ak nastane v dsledku pretekov vlkien chybn modifikcia prvkov statickho poa, konen set hodnt tchto prvkov nebude

24

Atomick opercia je nedeliten opercia, ktor je vdy vykonan ako celok bez rizika preruenia.

122

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva reflektova sprvnu hodnotu 15. Obr. 14.3 ukazuje dva vstupy 2-vlknovho programu, priom jeden z nich je sprvny a druh chybn.

Obr. 14.3: 2-vlknov program, v ktorom preteky vlkien spsobuj chybn vstup (vpravo) Najvm rizikom pretekov vlkien je nedeterministick povaha programu, ktor me v zvislosti od naasovania pracovnch vlkien vysti do sprvneho, ale aj chybnho spracovania programu. Poas empirickej analzy sme dospeli k vsledkom, ktor s zoskupen v tab. 14.5. Kolekcie spustenia programu Relcia 1. 2. 3. 4. 5. 1. kolekcia Relcia 1. 2. 3. 4. 5. 2. kolekcia Relcia 1. 2. 3. 4. 5. 123 3. kolekcia Relcia 1. 2. 3. 4. 5. 4. kolekcia

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva

Kolekcie spustenia programu Relcia 6. 7. 8. 9. 10. R(Fx) 10 % 1. kolekcia Relcia 6. 7. 8. 9. 10. 20 % 2. kolekcia Relcia 6. 7. 8. 9. 10. 0% 3. kolekcia Relcia 6. 7. 8. 9. 10. 30 % 4. kolekcia

Tab. 14.5: Empirick analza detekcie nekorektnch vstupov 2-vlknovho programu s nedeterminizmom, ktor spsobuj preteky vlkien Uskutonili sme 4 kolekcie testov paralelnho programu s neoetrenou chybou, ktor spsobuj preteky vlkien. V kadej kolekcii sme sledovali 10 relci, poas ktorch sme paraleln program spustili a zaznamenali jeho vstup. Ak bol vstup v poriadku, oznaili sme spustenie programu v danej relcii symbolom . Naopak, ak vstup nebol korektn, relcii programu sme prisdili symbol . V kadej kolekcii testov sme vypotali relatvnu poetnos vskytu chybovch stavov, reprezentovan ukazovateom R(Fx). Zo vetkch 4 kolekci testov, iba jedin (3. v porad) vykazovala nulov poetnos vzniku chybovch stavov. V ostatnch kolekcich testov sa chyby objavovali s rznou variabilitou, od 10 % do 30 %. Problmy, ktor vznikaj ako priamy dsledok pretekov vlkien, meme riei pomocou monitora, pecilneho synchronizanho objektu. Najskr uvedieme opraven zdrojov kd, a potom k nemu pripojme komentr. Modifikovan partie s zvraznen sivou podkladovou farbou.

124

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva


using using using using using System; System.Collections.Generic; System.Linq; System.Text; System.Threading;

namespace diz { class Program { // Definin inicializcia statickho jednorozmernho poa. static int[] pole = { 1, 2, 3, 4, 5 }; static void Main(string[] args) { // Vytvorenie 2-prvkovho poa pracovnch vlkien. Thread[] poleVlkien = { new Thread(new ThreadStart(Inkrementova)), new Thread(new ThreadStart(Dekrementova)) }; Console.WriteLine("Opercia bola zahjen."); // Spustenie pracovnch vlkien. poleVlkien[0].Start(); poleVlkien[1].Start(); // akanie na dokonenie innost pracovnch vlkien. poleVlkien[0].Join(); poleVlkien[1].Join(); Console.WriteLine("Opercia je hotov."); // Kontrola korektnosti modifikcie poa. int set = 0; for (int i = 0; i < 5; i++) { Console.WriteLine("{0}. prvok poa: {1}.", i + 1, pole[i]); set += pole[i]; } if (set != 15) Console.WriteLine("Chybn modifikcia poa."); else Console.WriteLine("Sprvna modifikcia poa."); Console.Read(); } // Defincia metdy 1. pracovnho vlkna. static void Inkrementova()

125

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva


{ for (int i = 0; i < 5; i++) { // Pomocou monitora umiestnime zmok na statick pole // a vstpime do kritickej sekcie. Monitor.Enter(pole); try { // Vlknovo bezpen inkrementcia hodnoty prvku // statickho poa. pole[i]++; } // Pomocou monitora uvonme zmok nad statickm poom // a opustme kritick sekciu. finally { Monitor.Exit(pole); } Console.WriteLine("[PV1-Inkrementcia]: " + "{0}. prvok poa: {1}.", i + 1, pole[i]); Thread.Sleep(500); } } // Defincia metdy 2. pracovnho vlkna. static void Dekrementova() { for (int i = 0; i < 5; i++) { // Pomocou monitora umiestnime zmok na statick pole // a vstpime do kritickej sekcie. Monitor.Enter(pole); try { // Vlknovo bezpen dekrementcia hodnoty prvku // statickho poa. pole[i]--; } // Pomocou monitora uvonme zmok nad statickm poom // a opustme kritick sekciu. finally { Monitor.Exit(pole); } Console.WriteLine("[PV2-Dekrementcia]: " + "{0}. prvok poa: {1}.", i + 1, pole[i]); Thread.Sleep(500); } }

126

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva


} }

Komentr k zdrojovmu kdu: Na syntaktickej rovni je monitor oby synchronizan primitvum reprezentovan intanciou triedy Monitor z mennho priestoru System.Threading. Hoci monitor mus existova, nezskame ho intanciciou triedy Monitor, ale volanm statickej metdy Enter tejto triedy25. Metda Enter je parametrick a prijma odkaz na objekt, na ktor chceme umiestni pomocou monitora zmok. Volanie statickej metdy Enter ohraniuje blok, ktor psob ako kritick sekcia. Ak jedno pracovn vlkno umiestni na objekt zmok, in pracovn vlkno neme s tmto objektom pracova skr, ne prv pracovn vlkno zmok z objektu neuvon. Objekt opatren zmkom sa nachdza v kritickej sekcii tak dlho, pokia nie je aktivovan parametrick statick metda Monitor.Exit. Ke tto metdu zavolme a poskytneme jej odkaz na dosia uzamknut objekt, monitor zabezpe odomknutie objektu a zanechanie kritickej sekcie. V naom paralelnom programe musme monitormi oetri tel cyklov for situovanch v metdach pracovnch vlkien. Najskr volanm metdy Monitor.Enter zskame monitor, ktor uzamkne statick pole. Pokraujeme vstpenm do truktrovanho bloku try, v ktorom uskutoujeme vlknovo bezpen aritmetick operciu s poadovanm prvkom statickho poa. Napokon spracujeme blok finally, v ktorom volme metdu Monitor.Exit, m uvoujeme zmok z objektu a vystupujeme z kritickej sekcie. Je dleit, aby sme raz uzamknut objekt vo vhodnej chvli sprvne odomkli. Z tohto dvodu vkladme volanie metdy Monitor.Exit do bloku finally, m mme zaruen, e k uvoneniu zmku djde aj vtedy, ak by programov prkazy v bloku try spsobili generovanie chybovej vnimky. Po zapracovan monitorov mme zruku, e paraleln program bude vdy produkova sprvne vstupy, pretoe prstup pracovnch vlkien k statickmu pou je synchronizovan.
25

Triedu System.Threading.Monitor nie je mon podrobi intancianmu procesu, pretoe je statick.

127

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva Z technickho hadiska si dovoujeme pripoji nasledujce kontatovanie: Trieda Monitor z mennho priestoru System.Threading umouje implicitne mapova monitory iba na intancie odkazovch dtovch typov. Snaha aplikova monitor na intanciu (premenn) hodnotovho dtovho typu je sprevdzan aktivciou mechanizmu zjednotenia typov. Vsledkom prce mechanizmu zjednotenia typov je alokovanie objektovej skrinky na riadenej halde a vloenie hodnoty premennej hodnotovho typu do tejto skrinky. o nie je na prv pohad zrejm, je fakt, e mechanizmus zjednotenia typov je celkovo spusten dvakrt: prvkrt pri volan statickej metdy Monitor.Enter a druhkrt pri volan statickej metdy Monitor.Exit. Tento pracovn model je nebezpen, pretoe v skutonosti neposkytuje iadnu synchronizciu objektu (premennej hodnotovho typu), ktor sme pvodne chceli synchronizova. Pre plnos vkladu poznamenajme, e rovnak funkcionalitu, ak nm ponkaj statick metdy Monitor.Enter a Monitor.Exit, meme dosiahnu aj pouitm zabudovanho prkazu lock jazyka C# 3.0. Defincie metd pracovnch vlkien by sa pouitm tohto prkazu zmenili nasledujcim spsobom (aplikovan zmeny s vyznaen sivou podkladovou farbou):
// Defincia metdy 1. pracovnho vlkna. static void Inkrementova() { for (int i = 0; i < 5; i++) { // Explicitn pouitie prkazu lock garantuje // exkluzvny prstup k zdieanmu objektu. lock(pole) { pole[i]++; } Console.WriteLine("[PV1-Inkrementcia]: " + "{0}. prvok poa: {1}.", i + 1, pole[i]); Thread.Sleep(500); } } // Defincia metdy 2. pracovnho vlkna. static void Dekrementova() { for (int i = 0; i < 5; i++)

128

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva


{ // Explicitn pouitie prkazu lock garantuje // exkluzvny prstup k zdieanmu objektu. lock(pole) { pole[i]--; } Console.WriteLine("[PV2-Dekrementcia]: " + "{0}. prvok poa: {1}.", i + 1, pole[i]); Thread.Sleep(500); } }

Prkaz lock zavdza vyiu rove abstrakcie synchronizanej opercie. Je vak dleit uvedomi si, e synchronizcia je realizovan monitorom, ktor sli na uzamknutie objektu poas trvania kritickej sekcie. Vhodou prkazu lock voi explicitnmu volaniu metd Monitor.Enter a Monitor.Exit je automatick uvonenie zmku nad synchronizovanm objektom v prhodnom momente (to sa deje pri spracovan uzatvracej zloenej ztvorky, ktor ohraniuje oblas platnosti kritickej sekcie). Nasledujci fragment zdrojovho kdu jazyka C# 3.0 predvdza vlknovo bezpen vykonvanie transakci s bankovm tom:
using using using using using System; System.Collections.Generic; System.Linq; System.Text; System.Threading;

namespace diz { // Deklarcia triedy Bankovet. class Bankovet { // Defincie dtovch lenov triedy. private int stav, minimlnyZostatok; // Defincia parametrickho kontruktura. public Bankovet(int poiatonVklad, int minimlnyZostatok) { stav = 0; stav += poiatonVklad; this.minimlnyZostatok = minimlnyZostatok;

129

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva


} // Defincia metdy pre vloenie peaz na et. public void Vloi(int suma) { stav += suma; Console.WriteLine("Po vloen sumy {0} USD je na " + "te {1} USD.", suma, stav); } // Defincia metdy pre uhradenie peaz z tu. public void Uhradi(int suma) { if(stav - suma < minimlnyZostatok) { Console.WriteLine("Transakcia nebola uskutonen " + "z dvodu prekroenia minimlneho zostatku " + "na te."); } else { stav -= suma; Console.WriteLine("Po hrade {0} USD " + "je na te {1} USD.", suma, stav); } } } class Program { // Zaloenie bankovho tu. static Bankovet mjet = new Bankovet(1000, 100); static void Main(string[] args) { Thread vlknoA, vlknoB; // Vytvorenie dvoch pracovnch vlkien. vlknoA = new Thread(new ThreadStart(RealizovaVklady)); vlknoB = new Thread(new ThreadStart(Realizovahrady)); // Spustenie pracovnch vlkien. vlknoA.Start(); vlknoB.Start(); // akanie na nvrat pracovnch vlkien. vlknoA.Join(); vlknoB.Join(); Console.Read(); } // Metda 1. pracovnho vlkna uskutouje kolekciu vkladov // peaz na bankov et. static void RealizovaVklady() {

130

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva


for (int i = 1; i <= 5; i++) { // Vykonanie vlknovo bezpenej opercie // s bankovm tom. lock (mjet) { mjet.Vloi(200); } Thread.Sleep(200); } } // Metda 2. pracovnho vlkna uskutouje kolekciu hrad // peaz z bankovho tu. static void Realizovahrady() { for (int i = 1; i <= 5; i++) { // Vykonanie vlknovo bezpenej opercie // s bankovm tom. lock (mjet) { mjet.Uhradi(400); } Thread.Sleep(200); } } } }

Komentr k zdrojovmu kdu: Mme jeden bankov et, s ktorm vykonvame pomocou dvoch pracovnch vlkien transakcie. Transakcie sa delia do dvoch kolekci: v jednej vkladme na et peniaze a v druhej zase pean sumy posielame na in ty. Aby kad z pracovnch vlkien vykonalo zaman operciu s bankovm tom bezpenm spsobom, uzamkneme ho pomocou prkazu lock. Zmok uvoujeme v okamihu, ke je transakcia uskutonen.

14.3 Uviaznutie vlkien


Ete zvanejie praktick implikcie ako preteky vlkien maj uviaznutia. Uviaznutm oznaujeme stav, kedy viacer programov vlkna disponuj 131

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva exkluzvnymi prstupmi k rznym zdieanm prostriedkom, priom urit vlkna sa snaia zska prstup k alm zdieanm prostriedkom, ku ktorm vak u exkluzvne pristupuj in vlkna. Jedna mnoina vlkien teda ak, km nezska prstup k sprave zdieanch prostriedkov, ktor vlastn druh mnoina vlkien, zatia o druh mnoina vlkien ak, km nezska prstup k sprave zdieanch prostriedkov, ktor vlastn prv mnoina vlkien. Uveme prklad: Vlkno A disponuje exkluzvnym prstupom k zdieanmu prostriedku O1. Vlkno B disponuje exkluzvnym prstupom k zdieanmu prostriedku O2. Ak bude chcie vlkno A zska prstup k zdieanmu prostriedku O2 a vlkno B bude chcie zska prstup k zdieanmu prostriedku O1, tak sa obe vlkna dostvaj do stavu uviaznutia. Je to spsoben z nasledujcich dvodov: Vlkno A mus aka, km nezska prstup k zdieanmu prostriedku O2. Vlkno A teda zotrvva v neinnom stave dovtedy, pokia vlkno B neuvon prstup k zdieanmu prostriedku O2. Bohuia, nevieme predpoveda kedy a i vbec vlkno B uvon prstup k zdieanmu prostriedku O2. Vlkno B mus aka, km nezska prstup k zdieanmu prostriedku O1. Vlkno B teda zotrvva v neinnom stave dovtedy, pokia vlkno A neuvon prstup k zdieanmu prostriedku O1. Naneastie, nevieme predpoveda kedy a i vbec vlkno A uvon prstup k zdieanmu prostriedku O1.

132

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva

Obr. 14.4: Uviaznutie dvoch programovch vlkien Uviaznutie zapriuje, e obe vlkna s zablokovan. To znamen, e viacvlknov aplikcia neme uskutoni iadny progres v realizcii svojich vpotovch procesov. Postup zaznamenme a vtedy, ke vlkno A uvon prstup k zdieanmu prostriedku O1 a vlkno B uvon prstup k zdieanmu prostriedku O2. Uviaznutie vlkien simulujeme v nasledujcom zdrojovom kde jazyka C# 3.0:
using using using using using System; System.Collections.Generic; System.Linq; System.Text; System.Threading;

namespace diz { // Deklarcia pomocnej triedy s jednm verejne prstupnm // dtovm lenom. class O { public int x; public O(int i) { x = i;

133

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva


} } class Program { // Zaloenie dvoch statickch objektov. static O o1 = new O(60); static O o2 = new O(40); static void Main(string[] args) { // Vytvorenie dvoch pracovnch vlkien. Thread vlknoA = new Thread(new ThreadStart(m1)); Thread vlknoB = new Thread(new ThreadStart(m2)); // Pomenovanie pracovnch vlkien. vlknoA.Name = "VlknoA"; vlknoB.Name = "VlknoB"; // Spustenie pracovnch vlkien. vlknoA.Start(); vlknoB.Start(); // akanie na nvrat pracovnch vlkien. vlknoA.Join(); vlknoB.Join(); // Zobrazenie finlnych stavov statickch objektov. Console.WriteLine("o1.x = {0}", o1.x); Console.WriteLine("o2.x = {0}", o2.x); Console.Read(); } // Metda pracovnho vlkna A. static void m1() { // Uzamknutie statickho objektu o1. Monitor.Enter(o1); Console.WriteLine("Vlkno A uzamklo objekt o1."); Thread.Sleep(500); try { // Zmena hodnoty dtovho lena statickho objektu o1. o1.x = 100; // Uzamknutie statickho objektu o2. Monitor.Enter(o2); Console.WriteLine("Vlkno A uzamklo objekt o2."); try { // Zmena hodnoty dtovho lena // statickho objektu o2. o2.x = 200; } finally {

134

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva


// Odomknutie statickho objektu o2. Monitor.Exit(o2); Console.WriteLine("Vlkno A odomklo objekt o2."); } } finally { // Odomknutie statickho objektu o1. Monitor.Exit(o1); Console.WriteLine("Vlkno A odomklo objekt o1."); } } // Metda pracovnho vlkna B. static void m2() { // Uzamknutie statickho objektu o2. Monitor.Enter(o2); Console.WriteLine("Vlkno B uzamklo objekt o2."); Thread.Sleep(500);u try { // Zmena hodnoty dtovho lena statickho objektu o2. o2.x = 300; // Uzamknutie statickho objektu o1. Monitor.Enter(o1); Console.WriteLine("Vlkno B uzamklo objekt o1."); try { // Zmena hodnoty dtovho lena // statickho objektu o1. o1.x = 400; } finally { // Odomknutie statickho objektu o1. Monitor.Exit(o1); Console.WriteLine("Vlkno B odomklo objekt o1."); } } finally { // Odomknutie statickho objektu o2. Monitor.Exit(o2); Console.WriteLine("Vlkno B odomklo objekt o2."); } } } }

135

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva Komentr k zdrojovmu kdu: Pri analze uvedenho paralelnho programu majme prosm na pamti, e ide o o mono najjednoduchiu riaden simulciu uviaznutia pracovnch programovch vlkien. K uviaznutiu samozrejme djde, pretoe s splnen podmienky, ktor vznik tejto programovej chyby podmieuj. Pracovnmu vlknu A sa preto nikdy nepodar zska zmok nad statickm objektom o2. Analogicky, pracovn vlkno B nebude nikdy schopn uzamkn statick objekt o1. Informan sprvy, ktor sprevdzaj zmeny stavov statickch objektov teda pouvate tohto paralelnho programu ani raz neuvid. Z pohadu pouvatea sa bude program javi ako neinn, o je pochopitene dsledok sperenia pracovnch vlkien, ktor nem vaza. Uviaznutie vlkien meme vyriei niekokmi spsobmi, z ktorch uvedieme nasledujce dva: 1. Privatizcia objektov. Podstatou techniky privatizcie objektov je poskytn kadmu pracovnmu vlknu vlastn kpiu pvodne zdieanho objektu. Ke bude kad pracovn vlkno vykonva opercie s vlastnm objektom, neme djs k chybe spsobenej nesynchronizovanm konkurennm prstupom. 2. Determincia identickho poradia zskavania exkluzvnych prstupov k objektom. Ak stanovme presn poradie, v akom bud pracovn vlkna pristupova k zdieanm objektom, vyhneme sa riziku ich uviaznutia. Naprklad, v naom prklade by bolo vhodn, aby najskr manipulcie so statickmi objektmi vykonalo pracovn vlkno A a a potom pracovn vlkno B. V zujme minimalizcie asu, poas ktorho vlkno B zotrvva v neinnom stave, meme toto vlkno zaai realizciou inch operci. Vlkno B sa dostane k statickm objektom vo chvli, ke vlkno A tieto objekty odomkne, a tak sprstupn.

136

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva

14.4 Atomick opercie


Pri programovan viacvlknovch aplikci v jazyku C# 3.0 mu vvojri vyui rad synchronizanch objektov, ku ktorm patria atomick opercie, monitory, mutexy a synchronizan udalosti. Atomick operciu definujeme ako mnoinu parcilnych operci , ktor je vdy spracovan ako diskrtna jednotka, bez rizika preruenia svojej exekcie.

Pritom plat, e parcilne opercie

s spracovan vetky v rmci jednej spene realizovan, bola spene aplikovan. Ak sa ) nebude mc by

exekunej relcie. Ak s vetky parcilne opercie atomick opercia reprezentovan mnoinou vak stane, e jedna parcilna opercia (

vykonan, zmeny uskutonen predchdzajcimi parcilnymi operciami bud anulovan. V tomto prpade vravme, e atomick opercia nebola spene aplikovan. Pri programovan paralelnch aplikci v jazyku C# 3.0 vyuijeme atomick opercie predovetkm na vlknovo bezpen modifikciu hodnt premennch hodnotovch a odkazovch dtovch typov. To je dleit, pretoe naprklad inkrementcia hodnoty premennej nie je implicitne atomickou operciou. V skutonosti sa tto opercia sklad z troch krokov: 1. Natanie hodnoty premennej z operanej pamte do registra exekunho jadra viacjadrovho procesora. 2. Inkrementcia natanej hodnoty. 3. Uloenie inkrementovanej hodnoty nachdzajcej sa v operanej pamti. 137 z registra sp do premennej

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva Vlkno A, ktor bude vykonva tto tridu operci, me by kedykovek preruen s tm, e spsob poruenie dtovej integrity cieovej premennej P. Ak vlkno A spene vykon prv dva kroky tridy, priom djde k jeho prerueniu, inkrementan opercia nebude vykonan v celku. Predstavme si, e vlkno B zmen poas trvania svojho asovho kvanta hodnotu premennej P. Ke znova prde na rad vlkno A, bude sa snai dokoni zahjen inkrementciu pvodnej hodnoty premennej P. Vlkno A teda ulo do premennej P inkrementovan hodnotu, m prepe hodnotu, ktor do tejto premennej uloilo vlkno B. Stav premennej P nie je platn, pretoe s premennou boli uskutonen dve nesynchronizovan zpisov opercie. Zkladn atomick opercie s premennmi nm v programovacom jazyku C# 3.0 dovouje uskutoova statick trieda Interlocked situovan v mennom priestore System.Threading. Trieda Interlocked definuje tieto vznamn statick metdy: 1. Metda Increment realizuje bezpen atomick inkrementciu 32- alebo 64-bitovej hodnoty cieovej premennej integrlneho hodnotovho dtovho typu. 2. Metda Decrement realizuje bezpen atomick dekrementciu 32- alebo 64-bitovej hodnoty cieovej premennej integrlneho hodnotovho dtovho typu. 3. Metda Exchange realizuje bezpen atomick operciu priradenia hodnoty do 32- alebo 64-bitovej cieovej premennej integrlneho hodnotovho, relneho hodnotovho, alebo odkazovho dtovho typu. Defincie parametrickch statickch metd Increment a Decrement triedy Interlocked maj takto generick podobu:

138

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva


public static class Interlocked { public static T Increment(ref T premenn) { // Telo metdy je vynechan. } public static T Decrement(ref T premenn) { // Telo metdy je vynechan. } }

kde: T je integrlny celoseln dtov typ int alebo long. ref je kov slovo urujce, e argument bude formlnemu parametru metdy odovzdan odkazom. premenn je identifiktor premennej, ktorej hodnota je inkrementovan alebo dekrementovan prslunou statickou metdou. Praktick aplikcia atomickch operci je prostrednctvom spomenutch metd triedy Interlocked vskutku intuitvna:
class Buffer { private int potadloReferenci; public Buffer() { this.potadloReferenci = 0; } public void ZskaReferenciu() { // Inkrementan atomick opercia. Interlocked.Increment(ref this.potadloReferenci); } public void UvoniReferenciu() {

139

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva


// Dekrementan atomick opercia. Interlocked.Decrement(ref this.potadloReferenci); } public int ZistiPoetReferenci() { return this.potadloReferenci; } }

Komentr k zdrojovmu kdu: Typickm prkladom pouitia atomickch inkrementano-dekrementanch operci je potanie referenci, ktor s naviazan na objekt istej triedy. V naej ukke deklarujeme triedu Buffer, v tele ktorej definujeme metdy na zskanie a uvonenie referenci. Objekt triedy obsahuje intern potadlo referenci, ktor reflektuje aktulny poet naviazanch referenci. Pri aktivcii intannej metdy ZskaReferenciu volme statick metdu Increment triedy Interlocked, m bezpenm spsobom zvyujeme hodnotu internho potadla referenci. Analogicky, pri volan intannej metdy UvoniReferenciu zahajujeme prostrednctvom statickej metdy Interlocked.Decrement vlknovo bezpen znenie hodnoty internho potadla. Ak inkrementciu a dekrementciu implementujeme ako atomick opercie, mme zruku ich kompletnho spracovania. To je vek konkurenn vhoda najm v situcii, ke viacero programovch vlkien sasne manipuluje s jednm objektom triedy Buffer. Ak by sme za tchto okolnost nezapracovali atomick opercie, niektor z vlkien by mohli zachyti objekt v nekonzistentnom stave (teda v stave, ktor by nezodpovedal skutonmu potu referenci determinovanmu internm potadlom). Predostret deklarciu triedy Buffer by sme mohli pre potreby praktickho nasadenia alej rozri. Naprklad tak, e by sme natavali kvant dt a po urit hranicu (determinovan potom referenci), a potom by sme cel obsah buffera uloili do fyzickho sboru na pevnom disku i na inom zznamovom mdiu (tto akcia sa asto oznauje ako vyprzdnenie buffera). Vyprzdnenie buffera by

140

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva implikovalo uvonenie vetkch naviazanch referenci s optovnm nastavenm internho potadla na nulov hodnotu. Ak to je mon, sname sa uprednostova atomick opercie pred inmi synchronizanmi primitvami, predovetkm pred monitormi a mutexmi.

14.5 Mutexy
Mutex26 je synchronizan objekt, ktor sa pouva podobne ako monitor, avak jeho pole psobnosti je omnoho irie. Zatia o monitor nie je systmovm synchronizanm objektom, mutex takmto objektom je. Riaden implementcia monitora, ktor ponka bzov kninica vvojovo-exekunej platformy Microsoft .NET Framework 3.5, psob ako nadstavba nad vrstvou systmovch synchronizanch objektov. Ako sme u uviedli, monitor je efektvnym rieenm pri synchronizcii prstupu viacerch programovch vlkien k zdieanmu prostriedku, ktor existuje v jednej aplikanej domne, resp. v jednom fyzickom procese riadenej aplikcie. V tomto scenri nasadenia preukazuje monitor optimlne vkonnostn charakteristiky. Na druhej strane, niekedy je nutn synchronizova prstup k zdieanmu prostriedku z viacerch aplikanch domn, resp. z viacerch fyzickch procesov riadench aplikci sasne. Kee monitor nedoke prekraova hranice aplikanch domn a fyzickch procesov, je nutn za tmto elom poui mutex. Mutex je hlavnm synchronizanm objektom, ktor nachdza svoje uplatnenie pri uskutoovan interprocesovch synchronizci. Porovnanie nasadenia monitora a mutexu vizualizuje obr. 14.5.

26

Nzov mutex vznikol skrtenm viacslovnho termnu mutually exclusive, teda navzjom sa vyluujci. To je prznan, pretoe mutex chrni zdiean prostriedok v rmci kritickej sekcie, take k tomuto prostriedku smie poas trvania kritickej sekcie pristupova prve jedno programov vlkno.

141

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva

Obr. 14.5: Porovnanie vyuitia monitora a mutexu ako dvoch synchronizanch objektov Komentr k obr. 14.5: Najskr vysvetlme synchronizciu pomocou monitora. V avej asti obrzka vidme aplikan domnu s identifiktorom AD1. Tto aplikan domna obsahuje 2 programov vlkna s identifiktormi v1 a v2. Obe pracovn vlkna pristupuj k zdieanmu prostriedku s identifiktorom P. Synchronizcia pomocou monitora umouje korektn funknos riadenej aplikcie a eliminuje vznik kolznych stavov medzi pracovnmi vlknami. Teraz budeme pokraova ozrejmenm mutexu. V pravej asti obrzka je znzornen riaden aplikcia s 2 aplikanmi domnami (AD1 a AD2). Kad z aplikanch domn obsahuje dvojicu pracovnch vlkien (v1 a v2). Kee obe aplikan domny patria do jednho fyzickho procesu riadenej aplikcie, mu pristupova k zdieanmu prostriedku P. Synchronizan akcie zabezpe v tomto kontexte mutex, ako synchronizan objekt, ktor smie by pouit naprie rznymi aplikanmi domnami.

142

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva Mutexy delme do nasledujcich skupn: 1. Loklne mutexy. Loklne mutexy mu by pouit na synchronizciu prstupu viacerch programovch vlkien k zdieanmu prostriedku, priom tieto vlkna sdlia bu v totonej aplikanej domne fyzickho procesu riadenej aplikcie, alebo v rznych aplikanch domnach fyzickho procesu riadenej aplikcie. Loklne mutexy s oznaovan tie ako nepomenovan, resp. anonymn mutexy. Loklne mutexy podporuj intraprocesov synchronizciu. 2. Globlne mutexy. Globlne mutexy slia na synchronizciu prstupu viacerch programovch vlkien k zdieanmu prostriedku, priom tieto vlkna sdlia v rznych aplikanch domnach rznych fyzickch procesov riadench aplikci. Z uvedenho vyplva, e globlne mutexy s objektmi, ktor podporuj interprocesov synchronizciu. Kee globlne mutexy vytvoren v rznych fyzickch procesoch riadench aplikci musia ma rovnak identifiktory, s tieto mutexy asto nazvan pomenovan mutexy, resp. systmov mutexy. Rozdiely v pouit loklnych a globlnych mutexov uvdzame na obr. 14.6 14.7.

143

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva

Obr. 14.6: Synchronizcia pomocou loklneho mutexu

Obr. 14.7: Synchronizcia pomocou globlneho mutexu 144

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva Loklny mutex meme vyui naprklad pri nvrhu bezpenho zsobnka27:
class BezpenZsobnk { private Stack zsobnk; private Mutex mutex; public BezpenZsobnk() { zsobnk = new Stack(); mutex = new Mutex(); } public void Vloi(object objekt) { // Zskanie mutexu k zsobnku. mutex.WaitOne(); try { // Vloenie objektu do chrnenho zsobnka. zsobnk.Push(objekt); } finally { // Uvonenie mutexu zo zsobnka. mutex.ReleaseMutex(); } } public object Vybra() { object objekt; // Zskanie mutexu k zsobnku. mutex.WaitOne(); try { if (zsobnk.Count > 0) { // Vyatie objektu z chrnenho zsobnka. objekt = zsobnk.Pop(); } else { throw new Exception("Zsobnk je przdny."); } }
27

Fragment zdrojovho kdu predpoklad, e s zaveden menn priestory System.Collections a System.Threading.

145

Kapitola 14: Synchronizcia programovch vlkien a synchronizan primitva


finally { // Uvonenie mutexu zo zsobnka. mutex.ReleaseMutex(); } return objekt; } }

Komentr k zdrojovmu kdu: Trieda BezpenZsobnk, ktor sme vytvorili, predstavuje vlknovo bezpen oblku vstavanej zsobnkovej a negenerickej triedy Stack z mennho priestoru System.Collections. Zsobnk definuje dve zkladn metdy: Vloi na uloenie novho objektu do zsobnka a Vybra na vyatie posledne vloenho objektu zo zsobnka (zsobnk pracuje poda organizanho modelu LIFO). Bezpen zsobnk je schopn synchronizovanm spsobom pridva a vybera objekty, a to vaka zaleneniu mutexu ako hlavnho synchronizanho objektu. Defincia metdy Vloi ukazuje, ako s mutexom pracujeme. Aby sme zskali mutex, volme intann metdu WaitOne v svislosti s objektom triedy Mutex. V naom prpade vyuvame bezparametrick verziu metdy WaitOne, m vyjadrujeme ochotu aka variabilne dlh asov interval, km nezskame mutex. Podotknime, e metda WaitOne je preaen, priom alie defincie nm umouj explicitne nastavi maximlnu asov peridu, ktor si meme dovoli alokova v zujme zskania mutexu. V tomto kontexte zskame loklny mutex, ktor smieme poui na synchronizciu manipulanej opercie so zsobnkom. Len o je objekt bezpene uloen do zsobnka, uvoujeme pridelen mutex volanm metdy ReleaseMutex. Vimnime si, e dealokcia mutexu je umiestnen v bloku finally. Tm eliminujeme riziko neuvonenia raz pridelenho mutexu (mutex, ktor nie je vo vhodnej chvli uvonen, sa stva opustenm mutexom). Analogicky postupujeme aj pri pouit mutexu v svislosti s vybratm objektu zo zsobnka. Samozrejme, objekt meme zo zsobnka zska len vtedy, pokia nie je zsobnk przdny. Ak prde poiadavka na vyatie objektu z przdneho zsobnka, generujeme chybov vnimku. 146

Kapitola 15: Varianty paralelizmu

15 Varianty paralelizmu
Potaov vedy definuj niekoko variantov paralelizmu, ktor s zvyajne asociovan s konkrtnymi paralelnmi vpotovmi modelmi. Poda rovne zapojenia udskho faktora do procesu paralelizcie potaovej aplikcie vymedzujeme implicitn a explicitn paralelizmus. Implicitn paralelizmus znamen automatick paralelizciu programu bez intervencie vvojra. V rmci tohto modelu je program vytvran na sekvennej bze, priom detekciu potencilne paralelizovatench segmentov a ich nsledn implicitn paralelizciu vykon automaticky preklada. Pri implementcii implicitnho paralelizmu nie s potrebn iadne direktvy, znaky i pecilne funkcie, ktor by programtor musel v zujme paralelizcie vklada priamo do zdrojovho kdu. Celkov zodpovednos za paralelizciu programu zostva na prekladai, ktor sa bude pomocou sofistikovanch technk analzy zdrojovho kdu snai realizova transformciu exekcie vymedzenej mnoiny programovch prkazov zo sekvennej na paraleln. Explicitn paralelizmus vyaduje kooperciu loveka, v rmci ktorej vvojr najskr identifikuje tie partie zdrojovho kdu potaovej aplikcie, ktor bud spracvan sbene a nsledne nape zdrojov kd, ktor bude poadovan paralelizciu uskutoova. Explicitn paralelizmus smie by realizovan v rznych rovniach abstrakcie. Pritom plat, e vyia rove abstrakcie explicitnho paralelizmu prina tieto efekty: 1. Zniuje mieru zainteresovanosti vvojra v procese paralelizcie softvru. 2. Zvyuje mieru koncentrcie vvojra na rieenie lohy. 3. Eliminuje nutnos disponova pecifickmi technickmi znalosami o nzkorovovej paralelnej implementcii rieenej lohy. 4. Zvyuje pracovn produktivitu vvojra. 5. Skracuje as potrebn na vvoj klovatenej potaovej aplikcie, ktor doke flexibilne vyui vetku vpotov kapacitu potaovho systmu. 147

Kapitola 15: Varianty paralelizmu Niia abstraktn rove explicitnho paralelizmu sa vyznauje tvorbou zdrojovho kdu, ktor preber kompetencie za realizciu tchto innost: 1. 2. 3. 4. Explicitn tvorba programovch vlkien. Selekcia a delegovanie loh, ktor bud programov vlkna vykonva. Elimincia vskytu kolznych stavov s vyuitm synchronizanch primitv. Celkov manament programovch vlkien, ktor spova v optimlnom riaden ich ivotnch cyklov.

Ak sa rozhodneme implementova niiu abstraktn rove explicitnho paralelizmu, budeme musie zvldnu vetky spomenut aktivity. Tm sce zskavame pln kontrolu nad sprvou programovch vlkien, no vystavujeme sa potencilnemu riziku vzniku vemi nebezpench chb nedeterministickho charakteru. Tie maj tendenciu objavova sa najm pri zloitch programoch s rozsiahlou zkladou zdrojovho kdu a pri programoch, ktor s napojen na extern kninin moduly s nejasnou, resp. nedokumentovanou funkcionalitou. Kee vetky nzkorovov innosti svisiace s riadenm ivotnch cyklov programovch vlkien musme explicitne naprogramova, so zvyujcou nronosou programtorskej prce sa zniuje jej produktivita. Stredn rove abstrakcie explicitnho paralelizmu je spojen s vyuitm pecilnych direktv, kovch slov, modifiktorov a funkci na podporu paralelizcie. Pri implementcii explicitnho paralelizmu so strednou rovou abstrakcie sta, ke programtor prepracuje bloky zdrojovho kdu aplikcie, ktor m zujem paralelizova. Stredn rove abstrakcie explicitnho paralelizmu me by realizovan rznymi spsobmi: 1. Pomocou programovch kontrukci, ktor s priamo vstavan do jazykovej pecifikcie pouitho programovacieho jazyka. Tieto programovacie jazyky boli u navrhnut s mylienkou priamej podpory paralelizcie programovch innost.

148

Kapitola 15: Varianty paralelizmu 2. Pomocou aditvnych programovch kontrukci, ktor roziruj pvodn jazykov pecifikciu pouitho programovacieho jazyka. Hoci sa pri vytvran programovch jazykov tejto kategrie nepotalo s priamou podporou paralelizcie, ich tvorcovia tto podporu zalenili do syntaktickosmantickch rozren, ktor boli zalenen aj do prekladaov tchto jazykov. 3. Pomocou externch knininch modulov, ktor poskytuj aplikan programov rozhranie na podporu paralelizcie procesov (tzv. paraleln rozhrania API). Extern kninin moduly poskytuj prostriedky na vytvranie programovch vlkien a riadenie ich ivotnch cyklov. Vysok rove abstrakcie explicitnho paralelizmu asociujeme s pouitm platforiem na podporu paralelizcie programovch innost. Paraleln platformy maj formu vysoko abstraktnch aplikanch programovch rozhran. Tieto rozhrania API nm umouj pracova nie s programovmi vlknami, ale s abstraktnmi programovmi kontrukciami, prostrednctvom ktorch smieme modelova lohy, ktor maj by vykonvan paralelne (a rovnako aj vzahy medzi tmito lohami). Paraleln platformy dovouj vvojrom nahliada na aplikciu ako na mnoinu loh, ktor mu by realizovan sbene a nie ako na mnoinu programovch vlkien, ktorch ivotn cykly je potrebn explicitne riadi. Poda dekompozinch technk rozliujeme nasledujce varianty paralelizmu: 1. Dtov paralelizmus. Dtov paralelizmus znamen sben vykonvanie rovnakej innosti na rznych intancich dtovej truktry, alebo sben vykonvanie rovnakej innosti na rznych dtovch blokoch identickej intancie dtovej truktry. Naprklad dtov paralelizmus meme vyui pri inicializovan tvorcovej matice pseudonhodnmi celmi slami. Ak predpokladme, e je poet programovch vlkien, tak v rmci dekompozcie problmu navrhneme vlknov kompozciu aplikcie tak, aby kad vlkno vykonalo objemu celkovej prce. Teda kad vlkno bude zodpovedn za inicializciu tvorcovej matice. Pre 4-vlknov aplikciu 149

Kapitola 15: Varianty paralelizmu to znamen, e kad vlkno vykon , ie 25 % celkovej prce. Ak bude spracvan tvorcov matica typu 10000x10000, tak potrebujeme dovedna inicializova 100 milinov prvkov. Pomocou dekompozinej techniky rozdelme cel maticu na 4 bloky (segmenty), a nariadime, aby kad z vlkien inicializovalo jeden z tchto blokov. Povedan inak, kad programov vlkno 4-vlknovej aplikcie uskuton inicializciu 25 milinov prvkov. Tak sme schopn dosiahnu optimlnu distribciu pracovnho zaaenia naprie jednotlivmi vlknami. Vzhadom na to, e kad vlkno bude operova na diskrtnom dtovom bloku, nemusme synchronizova ich pracovn modely. Schematick znzornenie postupu prc pri vyuit dtovho paralelizmu prina obr. 15.1.

Obr. 15.1: Dtov paralelizmus 2. lohov paralelizmus. O lohovom paralelizme hovorme vtedy, ak program vykonva sbene viacer lohy. Tieto paralelne realizovan lohy 150

Kapitola 15: Varianty paralelizmu s aplikovan na rzne intancie dtovch truktr, resp. na rzne intancie identickej dtovej truktry. (Ak by mali by paraleln lohy vykonvan na identickej intancii dtovej truktry, tak by sme museli synchronizova ich pracovn modely.) Uvaujme grafick editor s viacdokumentovm rozhranm (Multiple Document Interface, MDI). Z mnoiny funkci grafickho editora si vyberieme dve funkcie (f1 a f2), ktor bud mc by vykonvan paralelne. Funkciou f1 bude grafick transformcia (prvej) bitovej mapy. Funkciou f2 bude tla (druhej) bitovej mapy, priom tto opercia sa bude odohrva poas spracovania funkcie f1, teda poas realizcie grafickej transformcie. Obe lohy reprezentovan funkciami bud vykonvan paralelne, pretoe v jednom okamihu bude editor vykonva grafick transformciu jednej bitovej mapy a sasne tlai in bitov mapu. Ak by funkcie f1 a f2 neboli vykonvan paralelne, pouvate by nemohol vyda pokyn na tla bitovej mapy skr, ne by sa dokonila grafick transformcia predchdzajcej bitovej mapy. Tto skutonos by vak bola chpan ako obmedzenie a v konenom dsledku by spsobila znenie subjektvnej vkonnosti grafickho editora v oiach pouvatea.

Obr. 15.2: lohov paralelizmus 151

Kapitola 15: Varianty paralelizmu 3. Paralelizmus dtovch tokov. Km pri dtovom paralelizme sme realizovali toton innos nad rznymi blokmi intancie dtovej truktry a pri lohovom paralelizme sme riadili spracovanie rznych loh na rznych intancich dtovej truktry, tak pri paralelizme dtovch tokov sa zameriavame na analzu toku dt (zapuzdrench v intancich dtovej truktry) naprie viacermi lohami. Zkladn princpy paralelizmu dtovch tokov meme charakterizova na modeli producent/konzument. V zujme alch mylienkovch pochodov prijmime dohovor, e kad zo spomenutch aktrov bude reprezentovan jednm programovm vlknom. Pre model producent/konzument plat, e dta plyn od prvho aktra (producenta) k druhmu aktrovi (konzumentovi). Pritom medzi oboma aktrmi existuje jasne determinovan zvislos, ktor implikuje skutonos, e vstup prvho aktra (producenta) sa stva vstupom druhho aktra (konzumenta). To znamen, e vlkno konzumenta me zahji vykonanie poadovanej opercie na dtach a vtedy, ke mu tieto dta poskytne vlkno producenta. Paralelizmus dtovch tokov sa uskutouje naprklad pri spracovan zdrojovho kdu programu, ktor bol napsan v istom programovacom jazyku. Najskr mus by vykonan predspracovanie zdrojovho kdu predprocesorom a a potom sa me k slovu dosta kompiltor. Po preklade zdrojovho kdu prichdza na rad spojovac program (linker), ktor zabezpe generovanie strojovho, resp. pseudostrojovho kdu. Tento kd bude nakoniec zaliaty do priamo spustitenho sboru programu. Model producent/konzument, ktor pracuje s dvomi aktrmi, meme poda potreby modifikova tak, aby bol schopn pracova s ubovonm potom aktrov. Ozname poet aktrov , priom a . Potom plat, e pre kad je kad aktr producentom a kad aktr je konzumentom. Pre sa konzument stva producentom vo vzahu k nasledujcemu aktrovi (obr. 15.3).

152

Kapitola 15: Varianty paralelizmu Pracovn model paralelizmu dtovch tokov meme prirovna k sriovej vrobe na vrobnom pse. Podobne, ako je vrobn proces segmentovan na tdi, v ktorch sa modifikuje aktulny stav vrobku, tak sa sprvaj aktri v reazci tvorenom z producentov a konzumentov. Len o jeden aktr vykon s dtami poadovan operciu, dta s transportovan aliemu aktrovi, ktor pokrauje v ich spracovan. Tento kolobeh sa opakuje dovtedy, km dta neprejd celm reazcom aktrov a nebud modifikovan do svojej finlnej podoby.

Obr. 15.3: Paralelizmus dtovch tokov: model producent/konzument Poda rovne implementcie paralelizmu deklaratvnym a imperatvnym paralelizmom. meme diferencova medzi

153

Kapitola 15: Varianty paralelizmu Deklaratvny paralelizmus sa vyznauje vysokou mierou abstrakcie, pretoe dovouje vvojrom sstredi sa na splnenie stanovenho ciea. Pomocou deklaratvneho paralelizmu teda vyjadrujeme n zmer, o chceme uskutoni, no u ns nezaujma, ako to chceme uskutoni. Vaka funkcionlnym programovacm kontrukcim doke deklaratvny paralelizmus zavies vyiu mieru abstrakcie, s ktorou nsledne programtori pracuj. Imperatvny paralelizmus sa naopak koncentruje na deterministick vykonanie exaktne navrhnutej postupnosti krokov, ktor je nutn realizova. V porovnan s deklaratvnym paralelizmom zavdza imperatvny paralelizmus niiu mieru abstrakcie. Ak vvojri pracuj s imperatvnym paralelizmom, musia riei vetky implementan detaily paralelizmu na strednej, prpadne aj nzkej rovni. Zatia o deklaratvny paralelizmus nm dovouje sstredi sa na innos, ktor chceme vykona, imperatvny paralelizmus sa skr zameriava na to, ako bude tto innos uskutonen. Deklaratvny a imperatvny prstup k paralelizcii potaovch programov existuj v potaovch vedch niekoko desaro. Oba prstupy formuj samostatn programovacie paradigmy, ktor meme uplatni pri paralelizcii potaovch aplikci. V praktickch podmienkach vak vvojri spravidla dvaj prednos imperatvnemu paralelizmu, o je poda ns spsoben predovetkm imperatvnou povahou programovacch jazykov s najvou penetrciou na trhu. Napriek tomu si myslme, e pouitie deklaratvnych prostriedkov pri tvorbe paralelnch aplikci je vemi vhodn, pretoe nielene eliminuje vznik mnohch kolznych stavov, ale umouje vvojrom pracova s vysoko abstraktnmi programovacmi kontrukciami. Konkurennou vhodou deklaratvneho programovania je bezpochyby monos koncentrova sa na finlne rieenie problmu a nie na presn reazec innost, ktor k tomuto rieeniu ved. Z poslednho vvoja udalost v oblasti tvorby paralelnch aplikci dokeme identifikova jav preberania mnohch kontrukci deklaratvneho programovania a ich nslednej implementcie do imperatvnych programovacch jazykov. Tmto spsobom vznikaj hybridn programovacie jazyky, ktor maj imperatvne a aj 154

Kapitola 15: Varianty paralelizmu deklaratvne rty. Prelnanie programovacch paradigiem tak vysuje do synergickho efektu, citene skracujceho as potrebn na analzu, nvrh a implementciu paralelnch potaovch aplikci.

155

Kapitola 16: Praktick cvienie: Paralelizcia sekvennej riadenej aplikcie

16 Praktick cvienie: Paralelizcia sekvennej riadenej aplikcie


Komernch softvrovch vvojrov obvykle vemi interesuj praktick rieenia, ktor ukazuj, ako doke paraleln programovanie zvi vkonnos doposia rdzo sekvennch aplikci. Preto sa v tejto kapitole sstredme na proces paralelizcie sekvennej riadenej aplikcie. Tto aplikcia be v konzolovom okne a vykonva inverziu (grafick transformciu) kolekcie bitovch mp. Naa aplikcia bola pvodne vytvoren ako sekvenn, o znamen, e spracovanie inverznch opercie prebiehalo synchrnne: najskr bola uskutonen inverzia prvej bitovej mapy, potom druhej, tretej, at., a pokia neboli invertovan vetky poadovan bitov mapy. Inverziu ako grafick transformciu sme implementovali v samostatnej triede Bitmapa, ktor je deklarovan v zdrojovom sbore Bitmapa.cs. Syntaktick obraz tohto zdrojovho sboru je takto:
using System; using System.Collections.Generic; // Import potrebnho mennho priestoru. using System.Drawing; using System.Linq; using System.Text; namespace diz { // Deklarcia triedy, ktor zapuzdruje funkcionalitu na realizciu // inverzie bitovch mp. class Bitmapa { private Bitmap bitovMapa; private string sbor; // Parametrick kontruktor triedy. public Bitmapa(string sbor) { bitovMapa = new Bitmap(sbor); this.sbor = sbor; } // Metda vykonavajca grafick transformciu bitovej mapy. public void Invertova()

156

Kapitola 16: Praktick cvienie: Paralelizcia sekvennej riadenej aplikcie


{ int x, y; Color farba; for (x = 0; x < bitovMapa.Width; x++) { for(y = 0; y < bitovMapa.Height; y++) { farba = bitovMapa.GetPixel(x, y); bitovMapa.SetPixel(x, y, Color.FromArgb(255 - farba.R, 255 - farba.G, 255 - farba.B)); } } // Uloenie invertovanej bitovej mapy do samostatnho sboru. bitovMapa.Save(sbor.Insert(sbor.Length - 4, "I")); } } }

Komentr k zdrojovmu kdu: Intancia deklarovanej triedy Bitmapa bude obsahova obrazov body natanej bitovej mapy. Cestu k poadovanej bitovej mape zska parametrick intann kontruktor, ktor zabezpeuje alokciu intancie triedy Bitmap z mennho priestoru System.Drawing. Kee naa aplikcia je konzolov, je potrebn vloi nielen odkaz na spomenut menn priestor, ale tie do projektu zaleni odkaz na zostavenie System.Drawing.dll. Programov kd verejnej intannej metdy Invertova sa sstreuje na inverziu bitovej mapy. Pripomeme, e inverzia je jednou z grafickch transformci, ktor vypotava opan (inverzn) farebn informciu kadho obrazovho bodu, z ktorch je bitov mapa zloen. Inverziou obrazovho bodu P1 s farebnm vektorom [R1, G1, B1] zskame obrazov bod P2 s farebnm vektorom [255 R1, 255 G1, 255 B1]. Ke metda Invertova dokon inverziu, ulo upraven bitov mapu do novho rastrovho sboru (nzov tohto sboru vznikne z nzvu pvodnho sboru, ku ktormu metda prid psmeno I). Deklarovan triedu pouijeme pri praktickom nasaden (uvdzame obsah zdrojovho sboru Program.cs):
// Zdrojov kd sekvennej aplikcie. using System; using System.Collections.Generic;

157

Kapitola 16: Praktick cvienie: Paralelizcia sekvennej riadenej aplikcie


using using using using System.Diagnostics; System.Drawing; System.Linq; System.Text;

namespace diz { class Program { static void Main(string[] args) { // Vytvorenie poa objektov triedy Bitmapa. Bitmapa[] bitmapy = new Bitmapa[] { new Bitmapa(@"c:\Obrzky\obr_01.jpg"), new Bitmapa(@"c:\Obrzky\obr_02.jpg"), new Bitmapa(@"c:\Obrzky\obr_03.jpg"), new Bitmapa(@"c:\Obrzky\obr_04.jpg"), new Bitmapa(@"c:\Obrzky\obr_05.jpg"), new Bitmapa(@"c:\Obrzky\obr_06.jpg"), new Bitmapa(@"c:\Obrzky\obr_07.jpg"), new Bitmapa(@"c:\Obrzky\obr_08.jpg")}; Console.WriteLine("Prebiehaj sekvenn inverzie " + "bitovch mp..."); Stopwatch sw = new Stopwatch(); sw.Start(); // Sekvenn inverzia vetkch bitovch mp. for (int i = 0; i < bitmapy.Length; i++) { bitmapy[i].Invertova(); } sw.Stop(); Console.WriteLine("Sekvenn inverzie bitovch mp " + "s hotov [celkov as: {0} ms].", sw1.Elapsed.TotalMilliseconds); Console.Read(); } } }

Komentr k zdrojovmu kdu: Kd predpoklad, e na pevnom disku C existuje prieinok Obrzky, v ktorom sa nachdza 8 bitovch mp. Program vytvor 8 intanci triedy Bitmapa, priom kad intancia nata jednu bitov mapu z prieinka. Spracovanie programu pokrauje synchrnnym vykonanm grafickch transformci vetkch bitovch mp. Aplikcia meria as, ktor je potrebn na dokonenie inverzie bitovch mp. 158

Kapitola 16: Praktick cvienie: Paralelizcia sekvennej riadenej aplikcie Sekvenn aplikciu sme podrobili vkonnostnm testom, a to tak v ladiacom, ako aj v ostrom reime prekladu. Pri testovan sme pouili pota so 4-jadrovm procesorom Intel Core 2 Quad Q6600. Nameran vsledky s zoskupen v tab. 16.1 16.2. Kolekcia ladiacich testov (Debug) 1. vpoet 2. vpoet 3. vpoet Priemern exekun as Sekvenn verzia programu (exekun as v ms) 14803 14778 14838 14807

Tab. 16.1: Vkonnostn testy sekvennej aplikcie (ladiace zostavenie) Kolekcia ostrch testov (Release) 1. vpoet 2. vpoet 3. vpoet Priemern exekun as Sekvenn verzia programu (exekun as v ms) 14795 14793 14815 14801

Tab. 16.2: Vkonnostn testy sekvennej aplikcie (ostr zostavenie) Nam cieom vak nie je sekvenn aplikcia, ale jej paraleln ekvivalent. Po dkladnej analze bzovho zdrojovho kdu sme kontatovali, e najjednoduchie bude paralelizova kd hlavnej metdy Main. alej uvdzame zdrojov kd viacvlknovej aplikcie, ktor sme zostrojili modifikovanm pvodnej jednovlknovej aplikcie:

159

Kapitola 16: Praktick cvienie: Paralelizcia sekvennej riadenej aplikcie


// Zdrojov kd paralelnej aplikcie (uloen v sbore Program.cs). using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; // Vloenie potrebnho mennho priestoru pre potreby paralelizcie. using System.Threading; namespace diz { class Program { static void Main(string[] args) { Bitmapa[] bitmapy = new Bitmapa[] { new Bitmapa(@"c:\Obrzky\obr_01.jpg"), new Bitmapa(@"c:\Obrzky\obr_02.jpg"), new Bitmapa(@"c:\Obrzky\obr_03.jpg"), new Bitmapa(@"c:\Obrzky\obr_04.jpg"), new Bitmapa(@"c:\Obrzky\obr_05.jpg"), new Bitmapa(@"c:\Obrzky\obr_06.jpg"), new Bitmapa(@"c:\Obrzky\obr_07.jpg"), new Bitmapa(@"c:\Obrzky\obr_08.jpg")}; // Vytvorenie poa pracovnch vlkien. Thread[] pracovnVlkna = new Thread[] { new Thread(new ThreadStart(bitmapy[0].Invertova)), new Thread(new ThreadStart(bitmapy[1].Invertova)), new Thread(new ThreadStart(bitmapy[2].Invertova)), new Thread(new ThreadStart(bitmapy[3].Invertova)), new Thread(new ThreadStart(bitmapy[4].Invertova)), new Thread(new ThreadStart(bitmapy[5].Invertova)), new Thread(new ThreadStart(bitmapy[6].Invertova)), new Thread(new ThreadStart(bitmapy[7].Invertova)), }; Stopwatch sw1 = new Stopwatch(); Console.WriteLine("Prebiehaj paraleln inverzie " + "bitovch mp..."); sw1.Start(); // Paraleln inverzia vetkch bitovch mp. for (int i = 0; i < 8; i++) { pracovnVlkna[i].Start(); } for (int i = 0; i < 8; i++) { pracovnVlkna[i].Join(); }

160

Kapitola 16: Praktick cvienie: Paralelizcia sekvennej riadenej aplikcie


sw1.Stop(); Console.WriteLine("Paraleln inverzie bitovch mp " + "s hotov [celkov as: {0} ms].", sw1.Elapsed.TotalMilliseconds); Console.Read(); } } }

Komentr k zdrojovmu kdu: Paralelizcia sekvennej aplikcie je vskutku intuitvna. Podstatou je explicitn tvorba poa pracovnch vlkien, priom dbme na to, aby sa poet pracovnch vlkien zhodoval s potom bitovch mp, ktor chceme podrobi grafickej transformcii. Kad pracovn vlkno nechme transformova prve jednu bitov mapu, m dosiahneme priazniv rozdelenie pracovnho zaaenia. Paraleln aplikcia vyuva statick prstup, kedy v ase prekladu zdrojovho kdu programu prijmame rozhodnutie o celkovom pote vytvorench pracovnch vlkien. Ak by sme chceli zvi citlivos aplikcie, mohli by sme uprednostni dynamick prstup, ktor by nm dovolil zvi mieru granularity pri tvorbe pracovnch vlkien aplikcie. Testy paralelnej aplikcie na potai so 4-jadrovm procesorom Intel Core 2 Quad Q6600 preukzali, e konverzia sekvennej aplikcie na paraleln je spojen so signifikantnm nrastom vkonnosti (tab. 16.3 16.4).

161

Kapitola 16: Praktick cvienie: Paralelizcia sekvennej riadenej aplikcie

Kolekcia ladiacich testov (Debug) 1. vpoet 2. vpoet 3. vpoet Priemern exekun as

Paraleln verzia programu (exekun as v ms) 4092 4045 4007 4048

Tab. 16.3: Vkonnostn testy paralelnej aplikcie (ladiace zostavenie) Kolekcia ostrch testov (Release) 1. vpoet 2. vpoet 3. vpoet Priemern exekun as Paraleln verzia programu (exekun as v ms) 3959 4002 4173 4045

Tab. 16.4: Vkonnostn testy paralelnej aplikcie (ostr zostavenie) Porovnanie vkonnosti sekvennej a paralelnej aplikcie je uveden v tab. 16.5. Sekvenn aplikcia Paraleln aplikcia Nrast vkonu po paralelizcii

Priemern exekun as 14807 4048 3,66 (ladiace zostavenie) Priemern exekun as 14801 4045 3,66 (ostr zostavenie) Tab. 16.5: Porovnanie vkonnosti sekvennej a paralelnej aplikcie

162

Kapitola 16: Praktick cvienie: Paralelizcia sekvennej riadenej aplikcie Ako je zrejm z dosiahnutch vsledkov, pri ladiacich testoch je paraleln aplikcia 3,6-krt rchlejia ako sekvenn aplikcia. Testy ostrch zostaven oboch typov aplikci dokazuj, e paraleln aplikcia je rchlejia 3,6-krt. Tieto vsledky s istotne poteujce, najm ke uvime, e paraleln aplikcia manipuluje s vm mnostvom pracovnch vlkien ako je poet exekunch jadier pouitho viacjadrovho procesora.

Obr. 16.1: Porovnanie vkonnosti sekvennej a paralelnej aplikcie Kee sekvenn aplikcia obsahuje len jedno (primrne) programov vlkno, vyuva len jedno exekun jadro 4-jadrovho procesora. Vyuitie vpotovch kapact potaovho systmu je tvrtinov. Naopak, paraleln aplikcia pracuje so zvzkom pracovnch vlkien, ktor bud v primeranom pomere distribuovan na vetky dostupn exekun jadr 4-jadrovho procesora. Paraleln aplikcia vyuije hardvrov silu potaovej stanice na 100 % (obr. 16.2).

163

Kapitola 16: Praktick cvienie: Paralelizcia sekvennej riadenej aplikcie

Obr. 16.2: Porovnanie vyuitia vpotovch kapact systmu sekvennou (vavo) a paralelnou aplikciou

164

Kapitola 17: Paraleln platforma Microsoft Parallel Extensions

17 Paraleln platforma Microsoft Parallel Extensions


Paraleln platforma Microsoft Parallel Extensions28 je nadstavbou vvojovoexekunej platformy Microsoft .NET Framework 3.529. Platforma Parallel Extensions zavdza syntakticko-smantick kontrukcie na vyjadrenie deklaratvneho a imperatvneho vysoko abstraktnho explicitnho dtovho a lohovho paralelizmu. Platforma Parallel Extensions je unifikovan pre pouitie v ktoromkovek .NET-kompatibilnom programovacom jazyku. Unifikcia viedla k tomu, e rozhranie platformy Parallel Extensions (rozirujce rozhranie existujcej bzovej kninice tried) je priamo dosiahnuten z jazykov C# 3.0, Visual Basic 2008, C++/CLI a alch, a to bez nutnosti modifikcie ich jazykovch pecifikci, resp. kompiltorov. Interakn vzby medzi paralelnou riadenou aplikciou, paralelnou platformou Parallel Extensions, vvojovo-exekunou platformou Microsoft .NET Framework 3.5 a operanm systmom triedy Microsoft Windows, s znzornen na obr. 17.1. K vznamnm vlastnostiam paralelnej platformy Parallel Extensions patr: 1. Zmena programovacej paradigmy. Na riaden aplikciu nememe nahliada ako na konen a neprzdnu mnoinu programovch prkazov, ktor bud vykonvan sekvenne. Miesto toho prechdzame k ponmaniu paralelnej riadenej aplikcie ako vykonatenej jednotky, ktor pozostva z mnoiny sbene realizovanch loh.

28

V mnohch zdrojoch technickch informci sa paraleln platforma Parallel Extensions oznauje svojm kdovm nzvom Parallel FX. 29 Tento jav plat pre vvojovo-exekun platformu Microsoft .NET Framework 3.5 a integrovan vvojov prostredie Microsoft Visual Studio 2008. Ponc vvojovo-exekunou platformou Microsoft .NET Framework 4.0 a integrovanm vvojovm prostredm Visual Studio 2010 bude paraleln platforma Parallel Extensions plne zakomponovan do platformy Microsoft .NET Framework 4.0 a nebude psobi ako jej nadstavba.

165

Kapitola 17: Paraleln platforma Microsoft Parallel Extensions

Obr. 17.1: Interakn vzby riadenej aplikcie a paralelnej platformy Microsoft Parallel Extensions 2. Vysok rove abstrakcie. Vaka zaleneniu novho aplikanho programovho rozhrania smieme pracova s vysoko abstraktnmi programovmi kontrukciami a entitami, ktor podporuj paralelizciu procesov. K abstraktnm programovm kontrukcim patria naprklad cykly s podporou paralelizcie mnon iterci, paralelne vykonaten lohy, pecilne vysokorovov synchronizan primitva, alebo koordinan dtov truktry. 3. Elimincia povinnosti explicitnej tvorby pracovnch programovch vlkien. Vvoj paralelnej aplikcie sa zaobde bez manulnej kontrukcie pracovnch programovch vlkien, ako aj bez segmentcie a delegovania loh, ktor bud na tchto vlknach realizovan. Paraleln platforma Parallel Extensions obsahuje virtulny stroj pre paraleln spracovanie (VSPS), ktor spolupracuje s virtulnym plnovaom loh (VP) a virtulnym manarom zdrojov (VMZ).

166

Kapitola 17: Paraleln platforma Microsoft Parallel Extensions VSPS zabezpeuje automatick vytvranie pracovnch programovch vlkien, priom: Db na optimlny poet pracovnch vlkien. Zabezpeuje optimlnu distribciu pracovnho zaaenia medzi jednotlivmi pracovnmi vlknami. Garantuje automatick riadenie ivotnch cyklov pracovnch vlkien. VSPS interne spravuje fond programovch vlkien a poda potreby recykluje vlkna, m maximalizuje mieru ich optovnho vyuitia a naopak, minimalizuje alokciu systmovch prostriedkov. VSPS pracuje v rmci virtulneho exekunho systmu vvojovo-exekunej platformy Microsoft .NET Framework 3.5 (obr. 17.2). 4. Efektvnos, robustnos a klovatenos paralelnch aplikci. VSPS nachdza kontextovo zvisl, no pritom maximlne efektvnu vzbu medzi potom programovch vlkien viacvlknovej riadenej aplikcie a celkovou vpotovou kapacitou potaovho systmu (ie potom exekunch jadier pri potai s viacjadrovm procesorom, resp. potom procesorov pri viacprocesorovom stroji). V zujme o mono najefektvnejej exekcie riadenej paralelnej aplikcie vyuva VSPS v spoluprci s VP mnoh sofistikovan techniky, naprklad transport loh naprie jednotlivmi pracovnmi vlknami30. Transport loh sa vyuva preto, aby boli vetky alokovan pracovn programov vlkna vyuit. Cieom je eliminova as neinnosti pracovnch vlkien. Techniku transportu loh medzi vlknami budeme demontrova na nasledujcom prklade.

V originli sa technika, ktor my nazvame transport loh, vol work stealing, doslova odcudzenie prce.

30

167

Kapitola 17: Paraleln platforma Microsoft Parallel Extensions

Obr. 17.2: Vzah medzi virtulnym strojom pre paraleln spracovanie (VSPS) a virtulnym exekunm systmom (VES) Prklad: Predpokladajme, e VSPS poda pecifikcie 4-prvkovej mnoiny paralelne realizovanch loh (manaovanch pomocou VP) skontruuje 2 pracovn programov vlkna. VSPS rozhodne, e na 1. pracovn vlkno (PV1) umiestni 4 lohy, km 2. pracovn vlkno (PV2) zaa spracovanm 2 loh (obr. 17.3).

168

Kapitola 17: Paraleln platforma Microsoft Parallel Extensions

Obr. 17.3: Transport loh medzi vlknami (1. tdium) Predpokladajme, e zloitos loh, ktor vykonva 2. pracovn vlkno je niia ako zloitos loh, ktor realizuje 1. pracovn vlkno. Za tchto podmienok bude v uritom ase (tn) obraz pracovnch vlkien takto: 1. pracovn vlkno vykonalo 1 zo 4 delegovanch loh a 2. pracovn vlkno vykonalo vetky lohy, ktor malo uskutoni (obr. 17.4).

Obr. 17.4: Transport loh medzi vlknami (2. tdium) 169

Kapitola 17: Paraleln platforma Microsoft Parallel Extensions Ke je 2. pracovn vlkno hotov so svojimi lohami, ostva neinn, pretoe neexistuj iadne alie lohy, ktorch realizciu by malo 2. pracovn vlkno v kompetencii. Aby VSPS zabrnil zotrvaniu 2. pracovnho vlkna v neaktvnom stave, uskuton transport 2 loh z 1. pracovn vlkna na 2. pracovn vlkno. Po transporte bude 1. pracovn vlkno zaneprzdnen spracovanm 1 lohy, zatia o druh vlkno bude uskutoova 2 zveren lohy (obr. 17.5).

Obr. 17.5 Transport loh medzi vlknami (3. tdium) Technika transportu loh medzi viacermi pracovnmi vlknami m tieto siln strnky: 1. Zabezpeuje pribline rovnomern distribciu pracovnho zaaenia medzi pracovnmi vlknami. 2. Minimalizuje stavy neinnosti pracovnch vlkien. 3. Pri transporte loh sa venuje zvltna pozornos lokalizcii dtovch objektov, priom kvli efektvnej prci s pamou s uprednostovan lohy, ktorch dtov objekty s v niektorej z rchlych vyrovnvacch pamt (L1-cache, L2-cache alebo L3-cache). 170

Kapitola 17: Paraleln platforma Microsoft Parallel Extensions Paraleln platforma Parallel Extensions ponka vvojrom viacero variantov vysokorovovho explicitnho paralelizmu: 1. Deklaratvny dtov paralelizmus. Deklaratvny dtov paralelizmus je uplatovan pri spracvan dopytov, ktor s paralelne odosielan viacerm entitm (objektom, inicializovanm poliam a kolekcim). Komponent paralelnej platformy Parallel Extensions, ktor zabezpeuje deklaratvny prstup k prci s dtami, sa vol Parallel Language Integrated Query (rovnako sa pouvaj aj skrten nzvy Parallel LINQ a PLINQ). 2. Imperatvny dtov paralelizmus. Imperatvny dtov paralelizmus je aplikovan pri paralelizcii iteratvnych prkazov s automatickou distribciou paralelne vykonvanch iteranch mnon. Programov kontrukcie na podporu imperatvneho dtovho paralelizmu s zdruen v kninici Task Parallel Library (TPL). 3. Imperatvny lohov paralelizmus. Imperatvny lohov paralelizmus sa vyuva pri nvrhu a implementcii loh, resp. programovch innost, ktor maj by vykonvan sbene. Programov kontrukcie na podporu imperatvneho lohovho paralelizmu s zdruen v kninici TPL. 4. Paralelizmus dtovch tokov. Ak je vstup jednej programovej opercie vstupom pre in programov operciu, meme implementova reazec aktrov, ktor bud na bze modelu producent/konzument uskutoova paralelizmus dtovch tokov. Programov kontrukcie na podporu paralelizmu dtovch tokov sa nachdzaj v kninici TPL.

17.1 Microsoft Parallel Extensions: Praktick cvienie


Pri praktickom testovan paralelnej platformy Microsoft Parallel Extensions sme sa venovali paralelizcii pvodne sekvennej aplikcie, ktor vyhadva vetky prvosla z intervalu <2, 107>. 171

Kapitola 17: Paraleln platforma Microsoft Parallel Extensions Zdrojov kd sekvennej aplikcie vyhadvajcej prvosla vyzeral takto:
using using using using using System; System.Collections.Generic; System.Linq; System.Text; System.Diagnostics;

namespace diz { class Program { static void Main(string[] args) { int hornHranica = 10000000, poetPrvosel = 0; Stopwatch sw = new Stopwatch(); Console.WriteLine("Vyhadvam sekvenne prvosla..."); sw.Start(); // Sekvenn vyhadvanie prvosel. for (int i = 2; i <= hornHranica; i++) { if (Test(i)) poetPrvosel++; } Console.WriteLine("Vyhadvanie sa skonilo."); sw.Stop(); Console.WriteLine("V intervale <2, {0}> je {1} prvosel.", hornHranica, poetPrvosel); Console.WriteLine("Exekun as (ms): {0}.", sw.ElapsedMilliseconds); Console.Read(); } // Metda, ktor uskutouje test prvoselnosti. static bool Test(int slo) { int odmocninaZsla = (int)Math.Sqrt(slo); for (int i = 2; i <= odmocninaZsla; i++) { if (slo % i == 0) return false; } return true; } } }

172

Kapitola 17: Paraleln platforma Microsoft Parallel Extensions Komentr k zdrojovmu kdu: Sekvenn aplikcia zisuje poet prvosel na zklade testu prvoselnosti, ktor realizuje nasledujci matematick algoritmus: 1. Nech je prirodzen vstupn slo. deliten ktormkovek prirodzenm slom

2. Skontrolujeme, i je slo z intervalu . 3. Ak je

deliten ubovonm

, potom

je zloen slo, inak je

prvoslo.

Algoritmus diagnostikuje, i je testovan slo prvoslo, alebo zloen slo. Ak metdu, ktor implementuje spomenut algoritmus, aktivujeme na vetkch slach z poadovanho selnho intervalu, zskame celkov poet prvosel, ktor sa v danom intervale nachdzaj. Sekvenn aplikcia vyhadva prvosla pomocou cyklu for, priom v kadej itercii cyklu vol metdu Test. Tto parametrick metda prevezme odovzdan slo a prever, i ide o prvoslo, alebo zloen slo. V prpade, ak je analyzovan slo prvoslom, metda Test vracia logick pravdu, inak je nvratovou hodnotou metdy logick nepravda. Vkonnos sekvennej aplikcie sme testovali v troch samostatnch relcich na potai so 4-jadrovm procesorom Intel Core 2 Quad. Nameran vsledky, ktor sekvenn aplikcia dosahovala v ladiacich aj ostrch zostaveniach, uvdzame v tab. 17.1 17.2.

173

Kapitola 17: Paraleln platforma Microsoft Parallel Extensions

Kolekcia ladiacich testov (Debug) 1. relcia 2. relcia 3. relcia Priemern exekun as

Sekvenn verzia programu (exekun as v ms) 16848 16720 16748 16772

Tab. 17.1: Vkonnostn testy sekvennej aplikcie (ladiace zostavenie) Kolekcia ostrch testov (Release) 1. relcia 2. relcia 3. relcia Priemern exekun as Sekvenn verzia programu (exekun as v ms) 16332 16328 16400 16354

Tab. 17.2: Vkonnostn testy sekvennej aplikcie (ostr zostavenie) Testy dokzali, e sekvenn aplikcia potrebuje na njdenie radu prvosel viac ako 16 seknd exekunho asu. Sekvenn aplikciu sme preto upravili tak, aby vyuvala monosti paralelnej platformy Microsoft Parallel Extensions. Po modifikcii sme zskali paraleln aplikciu, ktorej zdrojov kd vyzer takto:
using using using using using using System; System.Collections.Generic; System.Linq; System.Text; System.Diagnostics; System.Threading;

174

Kapitola 17: Paraleln platforma Microsoft Parallel Extensions


namespace diz { class Program { static void Main(string[] args) { int hornHranica = 10000000, pocetPrvosel = 0; Stopwatch sw = new Stopwatch(); Console.WriteLine("Vyhadvam paralelne prvosla..."); sw.Start(); // Paraleln vyhadvanie prvosel. Parallel.For(2, hornHranica + 1, i => { if (Test(i)) Interlocked.Increment(ref pocetPrvosel); }); Console.WriteLine("Vyhadvanie sa skonilo."); sw.Stop(); Console.WriteLine("V intervale <2, {0}> je {1} prvosel.", hornHranica, pocetPrvosel); Console.WriteLine("Exekun as (ms): {0}.", sw.ElapsedMilliseconds); Console.Read(); } static bool Test(int slo) { int odmocninaZsla = (int)Math.Sqrt(slo); for (int i = 2; i <= odmocninaZsla; i++) { if (slo % i == 0) return false; } return true; } } }

Komentr k zdrojovmu kdu: Paralelizcia aplikcie si vyadovala zmeni sekvenn cyklus for za paraleln cyklus for. Z technickho hadiska to znamen, e cyklus for sme nahradili volanm statickej metdy For triedy Parallel z mennho priestoru System.Threading31. Statickej metde For odovzdvame hranice selnho intervalu a -vraz, ktor aktivuje metdu vykonvajcu test
31

Pripomname, e aby zdrojov kd spoahlivo fungoval, mus aplikan projekt obsahova odkaz na zostavenie System.Threading.dll paralelnej platformy Microsoft Parallel Extensions.

175

Kapitola 17: Paraleln platforma Microsoft Parallel Extensions prvoselnosti. Hoci v budcich verzich paralelnej platformy Microsoft Parallel Extensions u bude situcia zrejme in, inkrementciu premennej poetPrvosel musme explicitne naprogramova ako atomick operciu32. Ako si paraleln aplikcia viedla v praktickch testoch na potai so 4-jadrovm procesorom Intel Core 2 Quad, dokumentuj tab. 17.3 17.4. Kolekcia ladiacich testov (Debug) 1. relcia 2. relcia 3. relcia Priemern exekun as Paraleln verzia programu (exekun as v ms) 4532 4778 4701 4671

Tab. 17.3: Vkonnostn testy paralelnej aplikcie (ladiace zostavenie) Kolekcia ostrch testov (Release) 1. relcia 2. relcia 3. relcia Priemern exekun as Paraleln verzia programu (exekun as v ms) 4476 4654 4549 4560

Tab. 17.4: Vkonnostn testy paralelnej aplikcie (ostr zostavenie)

32

Paraleln cyklus for sa v CTP verzii paralelnej platformy Microsoft Parallel Extensions z jna 2008 nesprva korektne pri prstupe k zdieanm prostriedkom (v naom prpade je tmto prostriedkom loklna premenn, na ktor vak nie je aplikovan redukcia). Aby sme predili nedeterministickmu vstupu, atomicky inkrementujeme loklnu premenn poetPrvosel.

176

Kapitola 17: Paraleln platforma Microsoft Parallel Extensions Komparciu vkonnosti sekvennej a paralelnej aplikcie prina tab. 17.5. Sekvenn aplikcia Paraleln aplikcia Nrast vkonu po paralelizcii

Priemern exekun as 16772 4671 3,59 (ladiace zostavenie) Priemern exekun as 16354 4560 3,59 (ostr zostavenie) Tab. 17.5: Porovnanie vkonnosti sekvennej a paralelnej aplikcie Paralelizcia sekvennej aplikcie zvila jej vkonnos pribline 3,6-krt. Vstup paralelnej aplikcie meme oakva za asi 4,5 sekundy, zatia o na odpove sekvennej aplikcie sme boli nten aka viac ako 16 seknd. Po vykonan testov meme kontatova, e aplikcia zaznamenva po svojej paralelizcii sublinerny nrast vkonnosti.

Obr. 17.6: Porovnanie vkonnosti sekvennej a paralelnej aplikcie 177

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov

18 OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov


OpenMP33 je multiplatformov aplikan programov rozhranie (API), poskytujce vvojrom nstroje na implementciu explicitnho paralelizmu so strednou rovou abstrakcie. Rozhranie OpenMP zavdza spravu direktv pre kompiltor, ktormi mu programtori priamo ohranii tie programov bloky softvrovch aplikci, ktor maj by realizovan paralelne. Okrem toho zaha rozhranie OpenMP vlastn kninicu, sstavu premennch prostredia a exekun prostredie na podporu realizcie paralelnch vpotov. Vzah medzi softvrovou aplikciou, rozhranm OpenMP, spriaznenm exekunm prostredm a operanm systmom je uveden na obr. 18.1. Rozhranie OpenMP je uren predovetkm pre natvne programovacie jazyky, ku ktorm patr C, C++ a Fortran. tandard rozhrania OpenMP bol po prvkrt formulovan v roku 1997 (ako verzia 1.0) pre jazyk Fortran, priom o rok neskr bol spracovan aj tandard pre jazyky C a C++. V roku 2000 vznikla verzia 2.0 rozhrania OpenMP pre jazyk Fortran nasledovan edciou pre jazyky C/C++ v roku 2002. V roku 2005 bola uveden verzia 2.5 u pre vetky tri hlavn programovacie jazyky. Najnovie vydanie tandardu rozhrania OpenMP sa uskutonilo v roku 2008 a tto verzia rozhrania nesie oznaenie OpenMP 3.0.

33

Nzov rozhrania OpenMP je skratkou viacslovnho spojenia Open Multi-Processing.

178

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov

Obr. 18.1: Korelcia medzi softvrovou aplikciou, rozhranm OpenMP a operanm systmom Rekogncia direktv, s ktormi rozhranie OpenMP spolupracuje, bola zalenen do mnohch populrnych kompiltorov jazykov C, C++ a Fortran. Hoci sa v tejto publikcii venujeme vvojovmu prostrediu Microsoft Visual Studio 2008, je nutn podotkn, e prekladae s podporou rozhrania OpenMP produkuj aj alie softvrov spolonosti, naprklad Intel, Sun i Borland/CodeGear/Embarcadero. Prca s rozhranm OpenMP vyzer z pohadu tvorcu potaovej aplikcie takto: 1. Najskr sa pouitm sofistikovanch diagnostickch a monitorovacch nstrojov uskuton dkladn analza ivotnho cyklu aplikcie. Tto etapa je vemi dleit najm pri vvoji stredne vekch a vekch softvrovch aplikci. Automatizciu diagnosticko-monitorovacch innost spoahlivo vykonaj nstroje dynamickej analzy, ako naprklad Intel VTune Performance Analyzer i AMD CodeAnalyst.

179

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov 2. Potom sa ohraniia asti aplikcie s vysokou frekvenciou aktvneho vyuitia. Tieto asti s predmetom optimalizanho procesu, v ktorom je nutn identifikova bloky zdrojovho kdu, ktorch efektvnos spracovania me by zven prostrednctvom paralelizcie. 3. Kad blok, ktor chceme spracva paralelne, ozname pecilnymi direktvami rozhrania OpenMP. Naprklad, na paralelizciu iteratvnych prkazov for smieme aplikova direktvu #pragma omp parallel for, volitene aj s komplementrnymi klauzulami a prznakmi. Blok determinovan direktvou #pragma je zo strany rozhrania OpenMP povaovan za tzv. truktrovan blok s paralelnou kontrukciou (v praxi sa asto takto blok oznauje skrtene termnom paraleln kontrukcia alebo paraleln sekcia). Kompiltor automaticky generuje intrukcie, ktor uskutouj nasledujce akcie: Vytvraj optimlny poet pracovnch programovch vlkien. Pracovn vlkna s zskavan z fondu pracovnch vlkien. Fond pracovnch vlkien m natvny charakter a jeho manament m na starosti exekun prostredie rozhrania OpenMP. Samoinne deleguj lohy na prslun pracovn programov vlkna, priom prihliadaj na optimlnu distribciu pracovnho zaaenia medzi tmito vlknami. Ak chceme naprklad paralelne vykonva mnoinu prkazov umiestnench v tele cyklu, exekun prostredie rozhrania OpenMP samoinne rozhodne o tom, koko zvzkov paralelne vykonvanch iterci cyklu bude vytvorench a ako bud tieto zvzky mapovan na alokovan pracovn vlkna. Uveme praktick prklad: Nech je dan cyklus s 2000 iterciami a nech je splnen podmienka, e jednotliv itercie cyklu s od seba nezvisl34. V zvislosti od vpotovej
Podmienka nezvislosti iterci cyklu je tzv. nutnou podmienkou, ktor mus by splnen vdy, ak chceme implementova techniku bezpenho paralelnho spracovania mnoiny prkazov umiestnench v tele cyklu.
34

180

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov kapacity potaovho systmu, na ktorom je naa aplikcia spusten, sa exekun prostredie rozhrania OpenMP me rozhodn pre tvorbu n paralelne vykonvanch zvzkov iterci cyklu. V zujme konkrtnosti predpokladajme, e aplikcia be na potai so 4-jadrovm procesorom. Potom OpenMP skontruuje 4 zvzky iterci, ktor bud sbene vykonvan na 4 pracovnch vlknach pridelench z fondu. Pre dosiahnutie optimlneho pracovnho zaaenia je nutn, aby kad zvzok obsahoval 500 iterci cyklu. Riadia ivotn cykly pracovnch programovch vlkien. Rozhranie OpenMP vyuva sluby svojho exekunho prostredia, ktor zaobstarva kompletn sprvu ivotnch cyklov pracovnch vlkien. Podstatu exekunho prostredia rozhrania OpenMP a jeho lohu v procese riadenia ivotnch cyklov aplikci podrobnejie rozoberme v kapitole 18.1 Exekun prostredie rozhrania OpenMP a exekcia paralelnch aplikci. 4. Na tomto mieste povaujeme za dleit uvies, e v mnohch prpadoch prca vvojra spova iba v identifikcii paralelne vykonvanch blokov zdrojovho kdu. Ak je kompiltor kompatibiln so tandardom OpenMP, pri preklade deteguje vetky paraleln kontrukcie a automaticky generuje zodpovedajce nzkorovov programov intrukcie s podporou realizcie paralelnch vpotov. V prpade, ak kompiltor nepodporuje tandard OpenMP, ni sa nedeje, pretoe direktvy s ignorovan. Za tchto okolnost vak bude vslednm produktom rdzo sekvenn aplikcia.

181

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov

18.1 Exekun prostredie rozhrania OpenMP a exekcia paralelnch aplikci


Exekun prostredie rozhrania OpenMP je zodpovedn za korektn exekciu paralelnch kontrukci potaovej aplikcie. Proces riadenia ivotnch cyklov sekvenno-paralelnch aplikci sa sklad z nasledujcich etp: 1. Aplikcia zana svoj ivot ako jednovlknov. Programov prkazy s na primrnom vlkne vykonvan sekvenne a do okamihu, kedy bude detegovan prv paraleln kontrukcia. V tejto chvli vysiela OpenMP smerom na exekun prostredie poiadavku na pridelenie uritho mnostva pracovnch vlkien z natvneho fondu vlkien. 2. Po alokcii pracovnch vlkien sa men stav pvodne jednovlknovej aplikcie na aplikciu viacvlknov. V alom tdiu bude do kadho pracovnho vlkna injektovanch toko intrukci, aby bola garantovan optimlna distribcia pracovnho zaaenia medzi vlknami. 3. Exekun prostredie rozhrania OpenMP v koopercii s operanm systmom vytvor vzbu medzi pracovnmi vlknami aplikcie, vlknami jadra operanho systmu a hardvrovmi vlknami exekunch jadier viacjadrovho procesora. Implicitne sa exekun prostredie rozhrania OpenMP sna vytvra toko pracovnch vlkien, aby medzi nimi a exekunmi jadrami procesora existovala relcia typu 1:1. Exekcia viacvlknovej aplikcie je v tomto momente paraleln. 4. Paraleln exekcia pokrauje a dovtedy, pokia nie s vykonan vetky lohy, ktor boli delegovan na pracovn vlkna. Exekun prostredie rozhrania OpenMP vie, kde sa nachdza koniec paralelnej kontrukcie. Ak niektor z pracovnch vlkien dosiahne tento koniec skr ako in, toto vlkno ak, km koniec paralelnej kontrukcie nedosiahnu vetky ostatn pracovn vlkna. Koniec paralelnej kontrukcie kreuje implicitn bariru, na ktorej sa paraleln exekcia paralelnej kontrukcie kon. Ke s vetky 182

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov pracovn vlkna hotov so svojou prcou, priom dosiahli bariru, exekcia naej aplikcie sa men z paralelnej sp na sekvenn (resp. z viacvlknovej na jednovlknov). 5. Dka trvania sekvennej exekcie aplikcie je determinovan vzdialenosou alej paralelnej kontrukcie, pri detekcii ktorej zaije aplikcia al tranzit do stavu paralelnej exekcie. Pracovn vlkna zskavan z natvneho fondu vlkien s recyklovan. Tieto vlkna s vytvran len raz (pri spracvan prvej paralelnej sekcie) a v alch etapch ivotnho cyklu aplikcie s optovne vyuvan. 6. Ak djde k ukoneniu ivota aplikcie, automaticky s zlikvidovan vetky pracovn vlkna a exekun prostredie rozhrania OpenMP je uvonen z operanej pamte.

Obr. 18.2: Exekcia paralelnej kontrukcie natvnej aplikcie s podporou exekunho prostredia rozhrania OpenMP 183

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov Komentr k obr. 18.2: Softvrov aplikcia zahajuje svoj ivot v ase t0. A do asu t1 psob aplikcia ako jednovlknov s jednm primrnym vlknom (v0) a jej exekun model je sekvenn. V ase t1 aplikcia zana spracva prv paraleln kontrukciu. Spracovanie paralelnej kontrukcie men exekun model aplikcie zo sekvennho na paraleln. Exekun prostredie rozhrania OpenMP vytvra v ase t1 4-prvkov mnoinu pracovnch vlkien (v1, v2, v3 a v4). Tieto pracovn vlkna vykonvaj sbene innosti, ktor im boli delegovan. Paraleln exekcia aplikcie sa kon v ase t2, teda v bode implicitnej bariry paralelnej sekcie. Vo chvli, ke vetky z pracovnch vlkien dosiahnu bariru paralelnej sekcie, exekun model aplikcie sa men z paralelnho na sekvenn. Sekvenn spracovanie aplikcie pokrauje a do asu t3. Absoltna poetnos vskytu paralelnch kontrukci v zdrojovom kde aplikcie v priamej miere ovplyvuje poet prechodov medzi jej sekvennm a paralelnm exekunm modelom. Naprklad, na obr. 18.3 je schematicky zobrazen ivotn cyklus aplikcie s tromi paralelnmi kontrukciami.

184

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov

Obr. 18.3: Exekcia viacerch paralelnch kontrukci natvnej aplikcie s podporou exekunho prostredia rozhrania OpenMP Komentr k obr. 18.3: V analyzovanom ivotnom cykle softvrovej aplikcie sa vyskytuj tieto etapy: 1. Etapy sekvennej exekcie (SX): sekvenne je aplikcia spracvan v tchto asovch intervaloch: <t0, t1), <t2, t3), <t4, t5) a <t6, t7). 2. Etapy paralelnej exekcie (PX): paralelne je aplikcia spracvan v tchto asovch intervaloch: <t1, t2), <t3, t4) a <t5, t6).

185

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov

18.2 Praktick pouitie rozhrania OpenMP pri implementcii paralelnho algoritmu numerickej integrcie v jazyku C++
Praktick aplikciu pouitia rozhrania OpenMP si predvedieme na implementcii algoritmu, ktor bude realizova numerick integrciu. Numerick analza definuje numerick integrciu ako aproximan metdu vpotu uritho integrlu . Pritom predpokladme, e funkcia spojit a nezporn. Hodnota uritho intervalu ktor je: zhora ohranien grafom funkcie , zdola ohranien osou , zava ohranien priamkou rovnobenou s osou a prechdzajcou bodom , sprava ohranien priamkou rovnobenou s osou a prechdzajcou . bodom Na obr. 18.4 je znzornen rovinn tvar, ktorho obsah determinuje urit interval . predstavuje obsah (S) rovinnho tvaru (T), je na intervale

186

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov

Obr. 18.4: Geometrick vznam uritho integrlu Metd numerickej integrcie je viacero. My sme zvolili obdnikov metdu, pri ktorej postupujeme nasledujcim spsobom: 1. Interval rozdelme pomocou deliacich bodov na konen poet parcilnych intervalov, priom plat, e . 2. V kadom intervale . 3. Pre kad interval vypotame obsah obdnika so stranami a . Obsah i-teho obdnika ( ) urme takto: vypotame hodnotu funkcie , priom

187

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov 4. Ke spotame obsahy obdnikov pre vetky parcilne intervaly, zskame aproximovan hodnotu uritho integrlu. Zapsan matematicky:

5. Pouitm obdnikovej metdy nakoniec dospejeme k nasledujcej priblinej rovnosti:

Vizualizciu aproximovanho vpotu hodnoty uritho intervalu uvdzame na obr. 18.5.

Obr. 18.5: Numerick integrcia pomocou obdnikovej metdy

188

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov V naej praktickej aplikcii pouijeme numerick integrciu na vpoet

aproximovanej hodnoty uritho integrlu rovn Ludolfovmu slu ( ), teda .

. Ak pouijeme dostaton

poet parcilnych intervalov, vypotan hodnota uritho integrlu bude pribline

Najskr uvedieme sekvenn verziu algoritmizcie predmetnej numerickej integrcie v jazyku C++:
#include <iostream> #include <windows.h> using namespace std; int main() { double krok, x, obsah = 0.0f; long int i, pocetKrokov = 1000000000; unsigned int cas0, cas1; krok = 1.0f / pocetKrokov; for(int n = 1; n <= 3; n++) { x = obsah = 0.0f; cas0 = GetTickCount(); cout << "Vypocet c. " << n << " bol zahajeny." << endl; for(i = 0; i < pocetKrokov; i++) { x = i * krok; obsah += 4.0f / (1.0f + x * x); } cas1 = GetTickCount(); cout << "Vypocet c. " << n << " bol skonceny." << endl; cout.precision(20); cout << "Vystup: " << obsah * krok << endl; cout << "Cas (ms): " << cas1 - cas0 << endl << endl; } cin.get(); return 0; }

Sekvenn verzia pracuje s 1 miliardou parcilnych intervalov. Program meria exekun as (v ms), ktor numerick integrcia alokuje, a vzpt ho zobrazuje 189

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov pouvateovi. Na vstup je odosielan aj vypotan hodnota Ludolfovho sla. Vpoet numerickej integrcie uskutoujeme celkovo 3-krt. Po paralelizcii sa zdrojov kd jazyka C++ zmen takto:
#include <iostream> // Import hlavikovho sboru rozhrania OpenMP. #include <omp.h> #include <windows.h> using namespace std; int main() { double krok, x, obsah = 0.0f; long int i, pocetKrokov = 1000000000; unsigned int cas0, cas1; krok = 1.0f / pocetKrokov; for(int n = 1; n <= 3; n++) { x = obsah = 0.0f; cas0 = GetTickCount(); cout << "Vypocet c. " << n << " bol zahajeny." << endl; // Direktva rozhrania OpenMP na paraleln spracovanie // iteratvneho prkazu. #pragma omp parallel for reduction(+: obsah) private(x) for(i = 0; i < pocetKrokov; i++) { x = i * krok; obsah += 4.0f / (1.0f + x * x); } cas1 = GetTickCount(); cout << "Vypocet c. " << n << " bol skonceny." << endl; cout.precision(20); cout << "Vystup: " << obsah * krok << endl; cout << "Cas (ms): " << cas1 - cas0 << endl << endl; } cin.get(); return 0; }

Zmeny, ktor sme do zdrojovho kdu zapracovali, sa tkaj dvoch hlavnch oblast:

190

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov 1. Direktvou predprocesora #include zavdzame odkaz na hlavikov sbor omp.h rozhrania OpenMP. 2. Direktvou kompiltora #pragma omp parallel for identifikujeme paraleln sekciu, ktor je tvoren iteratvnym prkazom for. Ako si meme vimn, v direktve aplikujeme klauzuly reduction a private. Klauzula reduction sa viae s premennou obsah, v ktorej uchovvame postupne vypotan obsahy obdnikov, ktormi aproximujeme hodnotu uritho integrlu. Kee zvzky iterci cyklu for bud spracvan paralelne, musme sa vyhn potencilnym pretekom pracovnch vlkien, ktor by viedli k neelanm vsledkom. Povedan inak, je naou povinnosou zabezpei bezpen priebeh aritmetickch operci, ktor s aplikovan na premenn obsah. Vzhadom na to, e tto premenn je modifikovan naprie rznymi zvzkami iterci cyklu, musme na u aplikova tzv. redukciu. V rmci redukcie s v paralelne vykonvanch zvzkoch iterci cyklu vytvoren doasn loklne kpie poadovanej premennej, ktor s korektne inicializovan a modifikovan. Po skonen paralelnej exekcie s hodnoty vetkch doasnch loklnych kpi premennej redukovan do pvodnej premennej. Redukn klauzula pouva redukn opertor + s implicitnou nulovou inicializanou hodnotou doasnch loklnych kpi premennej. Klauzulou private explicitne nariaujeme, e pecifikovan premenn je skromn. To znamen, e exekun prostredie rozhrania OpenMP vytvor loklne kpie poadovanej premennej pre kad pracovn vlkno. Pre spen spustenie paralelnej verzie algoritmu numerickej integrcie urobme v integrovanom vvojovom prostred produktu Microsoft Visual Studio 2008 toto: Ak nie je zobrazen, zviditenme podokno Solution Explorer.

191

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov Na zdrojov sbor nho programu jazyka C++, ktor je umiestnen v prieinku Source Files, klikneme pravm tlaidlom myi a z miestnej ponuky vyberieme prkaz Properties. Po zobrazen dialgovho okna Property Pages sa zameriame na stromov truktru volieb situovan na avej strane okna. V sekcii Configuration Properties rozvinieme uzol C/C++ a klikneme na poloku Language. V zozname napravo vyhadme posledn poloku OpenMP Support a nastavme ju na hodnotu Yes (/openmp). Dialgov okno Property Pages zatvorme aktivciou tlaidla OK. Prelome zdrojov sbor a zostavme spustiten sbor paralelnho programu (Build Build Solution). V tab. 18.1 18.2 a na obr. 18.6 18.7 s zoskupen vsledky, ktor sme zaznamenali pri realizcii kolekci ladiacich (Debug) a ostrch (Release) testov sekvennej a paralelnej verzie programu na potai so 4-jadrovm procesorom Intel Core 2 Quad. Obe kolekcie testov sme uskutoovali z integrovanho vvojovho prostredia produktu Visual Studio 2008. Pri ladiacich testoch sme nepouvali iadne optimalizcie. Pri ostrch testoch sme vobou Full Optimization (/Ox) aktivovali pln optimalizcie.

192

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov Kolekcia ladiacich testov (Debug) 1. vpoet 2. vpoet 3. vpoet Priemern exekun as Nrast vkonu po paralelizcii Sekvenn verzia programu (exekun as v ms) 25054 25053 25069 25059 3,96 Paraleln verzia programu (exekun as v ms) 6349 6334 6318 6334

Tab. 18.1: Komparcia vkonnosti sekvennej a paralelnej verzie programu realizujceho numerick integrciu (kolekcia ladiacich testov) Kolekcia ostrch testov (Release) 1. vpoet 2. vpoet 3. vpoet Priemern exekun as Nrast vkonu po paralelizcii Sekvenn verzia programu (exekun as v ms) 13104 13120 13104 13109 3,91 Paraleln verzia programu (exekun as v ms) 3354 3353 3354 3354

Tab. 18.2: Komparcia vkonnosti sekvennej a paralelnej verzie programu realizujceho numerick integrciu (kolekcia ostrch testov)

193

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov

Obr. 18.6: Vizulna komparcia vkonnosti sekvennej a paralelnej verzie programu realizujceho numerick integrciu (kolekcia ladiacich testov)

Obr. 18.7: Vizulna komparcia vkonnosti sekvennej a paralelnej verzie 194

Kapitola 18: OpenMP natvne rozhranie na podporu paralelizcie vpotovch procesov programu realizujceho numerick integrciu (kolekcia ostrch testov) Vyuitie exekunch jadier viacjadrovho procesora sme sledovali pomocou aplikcie Sprvca loh, ktor je vstavan do operanho systmu Microsoft Windows Vista. Pri testovan sekvennej verzie programu bolo vyuvan len jedno exekun jadro procesora. To je logick, pretoe sekvenn verzia programu obsahuje len jedno (primrne) programov vlkno. Sekvenn verzia programu vyuvala len vpotovej kapacity potaovho systmu vybavenho 4-jadrovm procesorom Intel Core 2 Quad (obr. 18.8).

Obr. 18.8: Sekvenn verzia programu a jej vyuitie vpotovch kapact 4-jadrovho procesora Na druh stranu, paraleln verzia programu vyuva vinu exekunho asu svojho ivotnho cyklu vetky dostupn exekun jadr viacjadrovho procesora (obr. 18.9). Je evidentn, e paraleln verzia programu je ovea efektvnejia ne jej sekvenn nprotivok.

Obr. 18.9: Paraleln verzia programu a jej vyuitie vpotovch kapact 4-jadrovho procesora 195

Zver

Zver
Ven tudentky, ven tudenti, akujeme vm za v zujem o tto knihu. Pevne verme, e sa jej poradilo splni vyten cie a e ste s ou boli spokojn. Kee ako vvojri modernho potaovho softvru sa vzdelvame cel ivot, dovoujeme si pripoji kolekciu odkazov na alie hodnotn informan zdroje: 1. Centrum paralelnho programovania spolonosti Microsoft http://msdn.microsoft.com/en-us/concurrency/default.aspx. 2. Visual C# Developer Center http://msdn.microsoft.com/enus/vcsharp/default.aspx. 3. C# 3.0 Language Specification
http://download.microsoft.com/download/3/8/8/388e7205-bc10-4226-b2a875351c669b09/csharp%20language%20specification.doc.

4. Blogs from the C# Team http://msdn.microsoft.com/enus/vcsharp/aa336719.aspx. 5. C# Samples for Visual Studio 2008 http://code.msdn.microsoft.com/csharpsamples. 6. Visual C# Technical Articles http://msdn.microsoft.com/enus/vcsharp/bb466181.aspx. 7. How Do I Videos Visual C# http://msdn.microsoft.com/enus/vcsharp/bb798022.aspx. 8. Visual Studio 2008 and .NET Framework 3.5 Training Kit http://www.microsoft.com/DOWNLOADS/details.aspx?familyid=8BDAA836 -0BBA-4393-94DB-6C3C4A0C98A1&displaylang=en. 9. MSDN Forums Visual C# http://forums.microsoft.com/MSDN/default.aspx?ForumGroupID=9&SiteID =1. 10. Webcasty v eskom a slovenskom jazyku http://www.microsoft.com/cze/msdn/webcasts/default.mspx.

196

Zver 11. Praktick cvienia v slovenskom jazyku http://www.microsoft.com/slovakia/msdn/hols/default.mspx. 12. MSDN Magazine http://msdn.microsoft.com/enus/magazine/default.aspx. 13. C# Corner http://www.c-sharpcorner.com/.

Prajeme vm vea spechov pri vytvran tch najlepch potaovch aplikci v jazyku C# 3.0!

Autor

197

O autorovi

O autorovi
Ing. Jn Hank, MVP vytudoval Ekonomick univerzitu v Bratislave. Tu, na Katedre aplikovanej informatiky Fakulty hospodrskej informatiky (KAI FHI), pracuje ako vysokokolsk pedagg. Predna a vedie seminre tkajce sa programovania a vvoja potaovho softvru v programovacch jazykoch C, C++ a C#. Okrem spomenutej trojice jazykov patr k jeho obbenm programovacm prostriedkom tie Visual Basic, F# a C++/CLI. Aktvne vynachdza nov postupy tvorby softvru, ktor pomha nielen tudentom, ale aj irokej verejnosti. Je nadenm autorom odbornej potaovej literatry. V jeho portfliu mete njs nasledujce knin tituly: 1. C#: Akademick vubov kurz. Bratislava: Vydavatestvo EKONM, 2009. 2. Zklady paralelnho programovania v jazyku C# 3.0. Brno: Artax, 2009. 3. Objektovo orientovan programovanie v jazyku C# 3.0. Brno: Artax, 2008. 4. Inovcie v jazyku Visual Basic 2008. Praha: Microsoft, 2008. 5. Visual Basic 2008: Grafick transformcie a ich optimalizcie. Bratislava: Microsoft Slovakia, 2008. 6. Programovanie B Zbierka prednok (Uebn pomcka na programovanie v jazyku C++). Bratislava: Vydavatestvo EKONM, 2008. 7. Programovanie A Zbierka prednok (Uebn pomcka na programovanie v jazyku C). Bratislava: Vydavatestvo EKONM, 2008. 8. Expanzvne ablny: Prruka pre tvorbu "code snippets" pre Visual Studio. Bratislava: Microsoft Slovakia, 2008. 9. Kryptografia: Prruka pre praktick odskanie symetrickho ifrovania v .NET Framework-u. Bratislava: Microsoft Slovakia, 2007. 10. Prruka pre praktick odskanie vvoja nad Windows Mobile 6.0. Bratislava: Microsoft Slovakia, 2007.

198

O autorovi 11. Prruka pre praktick odskanie vvoja nad DirectX. Bratislava: Microsoft Slovakia, 2007. 12. Prruka pre praktick odskanie automatizcie aplikci Microsoft Office 2007. Bratislava: Microsoft Slovakia, 2007. 13. Visual Basic 2005 pro pokroil. Brno: Zoner Press, 2006. 14. C# praktick pklady. Praha: Grada Publishing, 2006 (kniha zskala ocenenie Najspenejia novinka vydavatestva Grada v oblasti programovania za rok 2006). 15. Programujeme v jazycch C++ s Managed Extensions a C++/CLI. Praha: Microsoft, 2006. 16. Pechzme z jazyka Visual Basic 6.0 na jazyk Visual Basic 2005. Praha: Microsoft, 2005. 17. Visual Basic .NET 2003 Zanme programovat. Praha: Grada Publishing, 2004. V rokoch 2006, 2007 a 2008 bol jeho prnos vvojrskym komunitm ocenen celosvetovmi vvojrskymi titulmi Microsoft Most Valuable Professional (MVP) s kompetenciou Visual Developer Visual C++. Spolonos Microsoft udelila Ing. Jnovi Hankovi, MVP v roku 2009 ocenenie za zlepovanie akademickho ekosystmu a za signifikantn rozirovanie technolgi a programovacch jazykov Microsoftu na akademickej pde. Kontakt s vvojrmi a programtormi udriava najm prostrednctvom technickch seminrov a odbornch konferenci, na ktorch vystupuje. Za vetky vyberme tieto: Konferencia Software Developer 2007, prspevok na tmu Pedstaven produktu Visual C++ 2005 a jazyka C++/CLI. Praha 19. 6. 2007. Technick seminr Novinky vo Visual C++ 2005. Microsoft Slovakia. Bratislava 3. 10. 2006.

199

O autorovi Technick seminr Visual Basic 2005 a jeho cesta k Windows Vista. Microsoft Slovakia. Bratislava 27. 4. 2006. Ako autor m mnohoron sksenosti s prcou v elektronickch a printovch mdich. Poas svojej kariry psobil ako odborn autor alebo odborn redaktor v nasledujcich asopisoch: PC WORLD, SOFTWARE DEVELOPER, CONNECT!, COMPUTERWORLD, INFOWARE, PC REVUE a CHIP. Dovedna publikoval viac ako 250 odbornch a populrnych prc venovanch vvoju potaovho softvru. Akademick blog autora mete sledova na adrese: http://blog.aspnet.sk/hanja/. Ak sa chcete s autorom spoji, mete vyui jeho adresu elektronickej poty: hanja@stonline.sk.

200

Pouit literatra

Pouit literatra
1. Akhter, S., Roberts, J.: Multi-core Programming. Hillsboro: Intel Press, 2006. 2. Dongarra, J., Foster, I., Fox, G., Gropp, W., Kennedy, K., Torczon, L., White, A.: Sourcebook of Parallel Computing. San Francisco: Morgan Kaufmann Publishers, 2003. 3. Hank, J.: Objektovo orientovan programovanie v jazyku C# 3.0. Brno: Artax, 2008. 4. Hank, J.: Inovcie v jazyku Visual Basic 2008. Praha: Microsoft, 2008. 5. Hank, J.: Programujeme v jazycch C++ s Managed Extensions a C++/CLI. Praha: Microsoft, 2006. 6. Hank, J.: C# praktick pklady. Praha: Grada Publishing, 2006. 7. Stoecker, M.: Developing Windows-based Applications with Microsoft Visual Basic .NET and Microsoft Visual C# .NET, 2002. 8. Pratschner, S.: Customizing the Microsoft .NET Framework Common Language Runtime. Washington: Microsoft Press, 2005.

201

Pouit literatra

Ing. Jn Hank je Microsoft MVP (Most Valuable Professional najcennej odbornk) s kompetenciou Visual Developer Visual C++. Je autorom 17 odbornch knh, prruiek a praktickch cvien o programovan a vvoji potaovho softvru. Pracuje ako vysokokolsk pedagg na Katedre aplikovanej informatiky Fakulty hospodrskej informatiky Ekonomickej univerzity v Bratislave. Predna a vedie seminre z programovania v jazykoch C, C++ a C#. V rmci svojej vedeckej innosti sa zaober problematikou truktrovanho, objektovo orientovanho, komponentovho, funkcionlneho a paralelnho programovania.

ISBN: 978-80-87017-03-6

202

Você também pode gostar