100787830

Page 1


Przedmowa

Wczasie,któryupłynąłodroku1986,rokupierwszegowydaniatejksiążki, światprojektowaniakompilatorówznaczącosięzmienił.Ewolucjajęzykówprogramowaniastworzyłanoweproblemy.Architekturykomputerówoferujądziś bogactwozasobów,któreprojektantkompilatorapowinien,awzasadziemusi wykorzystać.Byćmożenajbardziejinteresującejestto,żeszanowanetechniki optymalizowaniakoduznalazłyzastosowaniapozakompilatorami.Sądziśużywanewnarzędziachwyszukującychbłędy,aconajważniejsze,lukizabezpieczeń wjużistniejącymoprogramowaniu.Zarazemwiększośćtechnologii„przodowych” –gramatyki,wyrażeniaregularne,parseryitranslatorysterowaneskładnią–nadaljestwszerokimużyciu.

Tymsamymnaszafilozofiaprezentowanawpoprzednichwersjachtejksiążki sięniezmieniła.Zdajemysobiesprawę,żebardzonielicznispośródczytelników będątworzyć,lubchoćbyutrzymywać,kompilatorydlaktóregośzgłównych językówprogramowania.Jednakmodele,teoriaialgorytmypowiązanezkompilatoramimogąbyćstosowanewszerokimzakresieproblemówprojektowania irozwijaniaoprogramowania.Dlategoszczególniewyróżniamykwestiedorozstrzygnięcia,któresąnajczęściejspotykaneprzyprojektowaniuprocesorów języków,niezależnieodjęzykaźródłowegoczymaszynydocelowej.

Korzystaniezksiążki

Opanowaniecałościczychoćwiększościmateriałuztejksiążkiwymagaco najmniejdwóchkwartałów,amożenawetdwóchsemestrów.Typowepodejście poleganaprzedstawieniupierwszejpołowywramachwykładupodstawowego, drugązaśpołowętematykiksiążki–optymalizowaniekodu–napoziomie dyplomowymlubpośrednim.Otokonspektposzczególnychrozdziałów:

W rozdziale1 zawartomateriałymotywujące,aponadtoprzedstawiono wnimkilkapodstawowychzagadnieńarchitekturykomputerówizasadyjęzyków programowania.

W rozdziale2 pokazanoprojektowanieminiaturowegokompilatoraiwprowadzonowieleważnychkoncepcji,którezostanąrozwiniętewkolejnychrozdziałach.Samkompilatorzostałwcałościzamieszczonywdodatkunakońcu książki.

W rozdziale3 zawartoomówienieanalizyleksykalnej,wyrażeńregularnych,automatówskończonychinarzędzigenerującychleksery.Materiałtenjest podstawądoprzetwarzaniatekstówdowolnegorodzaju.

W rozdziale4 zaprezentowanogłównemetodyparsingu:zstępujące(metoda zejśćrekurencyjnychLL)iwstępujące(LRijejwarianty).

W rozdziale5 wprowadzonopodstawowekoncepcjedefinicjikierowanych składniąitranslacjisterowanejskładnią.

W rozdziale6 rozwiniętoteorięzrozdziału5ipokazano,jakmożnają wykorzystaćdogenerowaniakodupośredniegodlatypowegojęzykaprogramowania.

W rozdziale7 skupionosięnaśrodowiskachwykonawczych,zeszczególnym naciskiemnazarządzaniestosemwczasiewykonaniaimechanizmyodśmiecania pamięci.

W rozdziale8 omówionogenerowaniekoduwynikowego.Obejmujeono konstruowanieblokówpodstawowych,generowaniekodudlawyrażeńibloków podstawowychoraztechnikialokowaniarejestrów.

W rozdziale9 wprowadzonotechnologieoptymalizacjikodu,wtymgrafy przepływu,problemyprzepływudanychiiteracyjnealgorytmyrozwiązywania tychproblemów.

W rozdziale10 zaprezentowanooptymalizacjenapoziomieinstrukcji. Głównynaciskzostałtupołożonynamożliwościwydobyciarównoległościzmałychsekwencjiinstrukcjiiszeregowaniaichnapojedynczychprocesorach,które sąwstaniewykonywaćwięcejniżjednączynnośćnaraz.

W rozdziale11 omówionowykrywanieiwykorzystywanierównoległości wwiększejskali.Wtymmiejscuskupionouwagęnaprogramachnumerycznych mogącychzawieraćwieleciasnychpętliprzebiegającychwielowymiarowetablice.

W rozdziale12 zajętosięanalizamimiędzyproceduralnymi.Omówiono tuanalizywskaźników,aliasowaniaorazprzepływudanych,uwzględniające sekwencjewywołańprocedur,któreosiągajądanypunktwkodzie.

Wykładyopartenamaterialezawartymwtejksiążcebyłyprowadzone nauniwersytetachColumbia,HarvardiStanford.NaUniwersytecieColumbia regularnieproponowanyjestwykładdlapierwszegorokustudiówwyższego poziomunatematjęzykówprogramowaniaitranslatorów,wykorzystującymateriałzpierwszychośmiurozdziałów.Cechęwyróżniającątegowykładustanowi trwającysemestrprojekt,wktórymstudenciwmałychzespołachpracująnad utworzeniemiimplementacjąprostegojęzykawłasnegoprojektu.Tworzoneprzez nichjęzykiobejmująwielkąrozmaitośćzastosowań,wtymobliczeniakwantowe, syntezowaniemuzyki,grafikękomputerową,gry,operacjenamacierzachiwiele innychobszarów.Dozbudowaniaswoichwłasnychkompilatorówstudenciwykorzystujągeneratorykomponentówkompilatorów,takiejakANTLR,Lexlub Yacc,oraztechnikitranslacjisterowanejskładniąomówionewrozdziałach2i5. Następującypóźniejzaawansowanywykładskupiasięnamateriałachrozdziałów9–12,zwyróżnieniemgenerowaniaioptymalizacjikodudlanowoczesnych maszyn,wtymprocesorówsieciowychiarchitekturwieloprocesorowych.

NaUniwersytecieStanfordakwartalnywykładwprowadzającyobejmuje wprzybliżeniumateriałzrozdziałów1–8,choćznajdujesięwnimwprowadzenie doglobalnychtechnikoptymalizacyjnychzrozdziału9.Drugiwykładobejmuje treśćrozdziałów9–12orazbardziejzaawansowanymateriałdotyczącyodśmie-

caniapamięcizrozdziału7.Studenciwykorzystująopracowanynamiejscu, opartynaJavie,systemonazwieJoeqdoimplementowaniaalgorytmówanalizy przepływudanych.

Wymaganiawstępne

Czytelnikpowiniendysponowaćpewnym„wyrafinowanieminformatycznym”, obejmującymconajmniejzaawansowanywykładnatematprogramowaniaoraz wykładyzestrukturdanychimatematykidyskretnej.Przydatnabędzietakże znajomośćkilkuróżnychjęzykówprogramowania.

Ćwiczenia

Wksiążcezawartorozbudowanećwiczenia,pokilkadlaniemalkażdegopodrozdziału.Trudniejszećwiczenialubichczęścizostaływyróżnionewykrzyknikiem. Najtrudniejszećwiczeniaoznaczonopodwójnymwykrzyknikiem.

Podziękowania

JonBentleydostarczyłwyczerpującychkomentarzyowielurozdziałachwcześniejszegoszkicutejksiążki.Pomocnekomentarzeipoprawkidostarczylirównież (wkolejnościalfabetycznej):DomenicoBianculli,PeterBosch,MarcioBuss, MarcEaddy,StephenEdwards,VibhavGarg,KimHazelwood,GauravKc,Wei Li,MikeSmith,ArtStamness,KrystaSvore,OlivierTardieuorazJiaZeng. Jesteśmybardzowdzięcznizapomoctychwszystkichosób.Winazawszelkie pozostawionebłędyoczywiściespoczywananas.

DodatkowoMonicachciałabypodziękowaćswoimkoleżankomikolegom zzespołukompilatoraSUIFza18-letniąnaukękompilowania,sąto:Gerald Aigner,DzintarsAvots,SamanAmarasinghe,JenniferAnderson,MichaelCarbin, GeraldCheong,AmerDiwan,RobertFrench,AnwarGhuloum,MaryHall,John Hennessy,DavidHeine,Shih-WeiLiao,AmyLim,BenjaminLivshits,Michael Martin,DrorMaydan,ToddMowry,BrianMurphy,JereyOplinger,Karen Pieper,MartinRinard,OlatunjiRuwase,ConstantineSapuntzakis,Patrick Sathyanathan,MichaelSmith,StevenTjiang,Chau-WenTseng,Christopher Unkel,JohnWhaley,RobertWilson,ChristopherWilsonorazMichaelWolf.

A.V.A.,ChathamNJ

M.S.L.,MenloParkCA

R.S.,FarHillsNJ

J.D.U.,StanfordCA Czerwiec2006r.

Analizaleksykalna

Wtymrozdzialepokażemy,jakskonstruowaćanalizatorleksykalny(lekser). Wsamodzielnejimplementacjilekserapomocnebędzierozpoczęcieoddiagramu lubinnegoopisuleksemówdlakażdegotokenu.Następniebędziemymoglinapisać kodrozpoznającykażdewystąpieniekażdegoleksemuwdanychwejściowych izwracającyinformacjeozidentyfikowanymtokenie.

Możemyrównieżutworzyćlekserautomatycznie,specyfikującwzorceleksemóww generatorzeanalizatorówleksykalnych ikompilująctewzorcewkod, którybędziefunkcjonowałjakolekser.Podejścietoułatwiamodyfikowanieutworzonegoanalizatoraleksykalnego,gdyżmusimynapisaćodnowa jedynieodpowiedniewzorce,aniecałyprogram.Przyśpieszatorównież procesimplementacjileksera,gdyżprogramistaspecyfikujeoprogramowanie nabardzowysokimpoziomiewzorcówipoleganageneratorzepodwzględemtworzeniaszczegółowegokodu.Wpodrozdziale3.5przedstawimygeneratoranalizatorówleksykalnychonazwie Lex (lub Flex wjegonowszym wcieleniu).

Badaniegeneratorówanalizatorówleksykalnychzaczniemyodwprowadzenia wyrażeńregularnych,poręcznejnotacjidlaspecyfikowaniawzorcówleksemów. Pokażemy,jakmożnaprzekształcaćtęnotację,najpierwwniedeterministyczne automaty,apóźniejwautomatydeterministyczne.Tedwienotacjemogązostać użytejakowejściedo„sterownika”,czylikodu,którysymulujeteautomaty iużywaichdoustalaniakolejnegotokenu.Tensterownikispecyfikacjeautomatówstanowiąjądroanalizatoraleksykalnego.

3.1.Rolaanalizatoraleksykalnego

Będącpierwsząfaządziałaniakompilatora,głównymzadaniemlekserajest odczytywaniezwejściaznakówprogramuźródłowego,grupowanieichwleksemy iutworzenietokenudlakażdegoleksemuzeźródłowegoprogramuipotraktowanietakiejsekwencjitokenówjakowyjścia.Strumieńtokenówjestnastępnie

przekazywanydoparserawceluanalizyskładniowej.Analizatorleksykalny typowoodwołujesięrównieżdotablicysymboli.Gdylekserodkryjeleksem tworzącyidentyfikator,musiwprowadzićtenleksemdotablicysymboli.Wniektórychprzypadkachinformacjedotyczącerodzajuidentyfikatoramogąbyć czytaneztablicysymboliprzezlekser,abyułatwićustaleniewłaściwegotokenu, którymusizostaćprzekazanydoparsera.

Teinterakcjezostałyprzedstawionenarysunku3.1.Zazwyczajinterakcjajestimplementowanaprzezwywołanieanalizatoraleksykalnegoprzezparser.Towywołanie,przedstawionetutajprzezpolecenie getNextToken,powoduje,żeanalizatorleksykalnyodczytujekolejneznakizwejścia,ażzidentyfikujenastępnyleksemiutworzydlaniegoodpowiednitoken,któryzwróci doparsera.

source analysis to semantic getNextToken token

Table Symbol program Parser Analyzer Lexical Analizator leksykalny

Tablica symboli doanalizy semantycznej program źródłowy

RYSUNEK 3.1: Interakcjemiędzyanalizatoremleksykalnym aparserem

Ponieważlekserjesttączęściąkompilatora,któraczytatekstźródłowy, możewykonywaćpewneinnezadaniapozaidentyfikowaniemleksemów.Jednym znichjestusuwaniekomentarzyi„białychznaków”(spacji,znakównowego wiersza,tabulatorów,abyćmożerównieżinnychznakówsłużącychdooddzielaniatokenówwciąguwejściowym).Innezadanietokorelowaniekomunikatów błędówgenerowanychprzezkompilatorzprogramemźródłowym.Naprzykład leksermożerejestrowaćliczbękolejnychnapotkanychznakównowegowiersza, dziękiczemumożeprzypisaćnumerwierszadokażdegokomunikatubłędu. Wniektórychkompilatorachanalizatorleksykalnywykonujekopięprogramu źródłowegozkomunikatamibłędówwstawionymiwodpowiednichpozycjach. Jeśliprogramźródłowyużywapreprocesoramakr,rozwijaniemakrrównież możebyćwykonywaneprzezanalizatorleksykalny. Niekiedylekserysąpodzielonenadwaprocesywykonywanekaskadowo:

(a) Skaner realizujeprosteoperacje,któreniewymagajątokenizacjidanych wejściowych,takiejakusuwaniekomentarzyikompresjanastępujących posobiebiałychznakówwjeden.

(b) Właściwy analizatorleksykalny jestbardziejzłożonączęścią,któratworzy tokenyzwyjściaskanera.

Reprezentowaniezbiorówsytuacji

Generatortworzącyparserwstępującymożewymagaćwygodnejreprezentacjisytuacjiiichzbiorów.Zauważmy,żesytuacjamożebyćprzedstawiona jakoparaliczbcałkowitych,zktórychpierwszajestnumeremjednejzprodukcjiprzetwarzanejgramatyki,drugazaśjestpozycjąkropkiwcieletej produkcji.Zbiorysytuacjimożnaprzedstawiaćjakolistytakichpar.Jednak,jakzobaczymy,potrzebnedozaprojektowaniaparserazbiorysytuacji częstozawierająsytuacje„domykające”,wktórychkropkaznajdujesię napoczątkuciała.Sytuacjetakiezawszemożnazrekonstruowaćzinnych sytuacjiwzbiorzeiniemusimyichdołączaćdolisty.

RYSUNEK 4.31: AutomatLR(0)dlagramatykiwyrażeń(4.1)

Intuicyjniefakt,że A → α · Bβ należydo CLOSURE(I ),sygnalizuje,żewtym punkcieprocesuanalizy,wktórymsięznajdujemy,możemyzobaczyćnawejściu jakonastępnypodciąg,którymożnawyprowadzićz Bβ .Podciągwyprowa-

dzalnyzBβ będziemiałprefikswyprowadzalnyz B przezzastosowaniejednej z B-produkcji.Ztegowzględudodajemywszystkiesytuacjedlawszystkich B-produkcji;innymisłowy,jeśliistniejeprodukcja B → γ,dołączamy B →· γ do CLOSURE(I).

Przykład4.40: Rozważmyuzupełnionągramatykęwyrażeń: E → E E → E + T | T T → T ∗ F | F E → (E)| id

Jeśli I jestzbioremzawierającymjednąsytuację{[E →· E]},wówczas CLOSURE(I)będziezawieraćzbiórsytuacji I0 pokazanynarysunku4.31.

Zobaczmy,jakwyliczanejestdomknięcie. E →· E jestumieszczane w CLOSURE(I)zgodniezregułą(1).Ponieważmamytu E bezpośrednionaprawo odkropki,dodajemy E-produkcjezkropkaminalewymkońcu: E →· E + T oraz E →· T .Terazmamy T bezpośredniopokropcewdrugiejsytuacji,zatem dodajemy T →· T ∗ F oraz T →· F .Następnie F naprawoodkropkiskłania nasdododaniasytuacji F →· (E)oraz F →· id,ależadnychdalszychsytuacji nietrzebajużdodawać.

Domknięciemożnawyliczyćwsposóbpokazanynarysunku4.32.Wygodnym sposobemimplementacjifunkcji closure jestutrzymywanielogicznejtablicy added,indeksowanejnieterminalamizgramatyki G,takiej,że added[B]jest ustawianejako true wtedy,gdydodajemysytuację B →· γ dlakażdej B-produkcji B → γ

SetOfItems CLOSURE(I){ J = I; repeat for (dlakażdejsytuacji A → α Bβ należącejdo J ) for (dlakażdejprodukcji B → γ z G ) if ( B →·γ nienależydo J ) dodaj B →·γ to J; until niemawięcejelementówdododaniado J witeracji; return J; }

RYSUNEK 4.32: Obliczaniefunkcji CLOSURE

Zauważmy,żejeślipewna B-produkcjazostaniedodanadodomknięciazbioru I zkropkąpolewejstronie,wówczasdodanezostanąwszystkie B-produkcje wanalogicznysposób.Tymsamymwniektórychsytuacjachniemapotrzeby rzeczywistegowyznaczaniasytuacji B →· γ dodawanychdo I przez CLOSURE Wystarczającabędzielistanieterminali B,którychprodukcjezostałytakdodane. Możemypodzielićwszystkieinteresującenaszbiorysytuacjinadwieklasy:

1. Sytuacjebazowe:początkowasytuacja S →· S orazwszystkietesytuacje, wktórychkropkinieznajdująsięnalewymkońcuciałaprodukcji.

7.6.Wprowadzeniedoodśmiecaniabazującego

naśledzeniu

Odśmiecacześledząceniezakładająnatychmiastowegoodśmiecania,gdytylko daneśmieciowezostanąstworzone–zamiasttegouruchamiająsięokresowo wceluwyszukanianieosiągalnychobiektówizwolnieniazajmowanejprzeznie pamięci.Zazwyczajodśmiecacztakijesturuchamiany,gdyzaczynabrakować wolnejpamięcilubgdyjejilośćspadnieponiżejpewnegoprogu.

Zaczniemyodprzedstawienianajprostszegoalgorytmu„oznakujizamieć” (markandsweep).Następnieopiszemyróżneśledzącealgorytmy,posługującsię koncepcjączterechstanów,wktórychmogąznajdowaćsięfragmentypamięci. Podrozdziałtenprzedstawiateżkilkaulepszeńpodstawowegoalgorytmu,również takich,wktórychrelokacjaobiektustanowielementfunkcjonalnościodśmiecania pamięci.

7.6.1.PodstawowyodśmiecaczMarkandSweep

Algorytmyodśmiecaniapamięcitypu MarkandSweep (oznaczizamieć)są prostymi,oczywistymiprocedurami,którewyszukująwszystkienieosiągalne obiektyiumieszczająjenaliściewolnejpamięci.Algorytm7.12odwiedza i„znakuje”wszystkieosiągalneobiektywpierwszymkrokuśledzenia,poczym „zamiata”całąstertę,zwalniającnieosiągalneobiekty.

Algorytm7.14,któryomówimypoprzedstawieniuogólnychzałożeńdla algorytmówopartychnaśledzeniu,stanowiefektoptymalizacjialgorytmu7.12. Dziękiużyciudodatkowejlistydoprzechowaniawszystkichalokowanychobiektów odwiedzaonkażdyosiągalnyobiekttylkoraz.

Algorytm7.12: OdśmiecacztypuMarkandSweep.

WEJŚCIE:Zestawpodstawowyobiektów,stertaorazlistawolnejpamięci,nazwana Wolne,zawierającawszystkieniealokowanefragmentysterty.Podobniejak wpodrozdziale7.4.4,wszystkiefragmentypamięcisąoznakowaneznacznikami granicwskazującymiichstatuswolny/zajętyorazrozmiar.

WYJŚCIE:Zmodyfikowanalista Wolne pousunięciuwszystkichdanychśmieciowych.

METODA:Algorytmpokazanynarysunku7.21używakilkuprostychstruktur danych.Lista Wolne zawieraobiekty,októrychwiadomo,żesąwolne.Lista Nieprzeskanowane przechowujeobiekty,codoktórychustaliliśmy,żesąosiągalne,alektórychnastępcyniezostalijeszczesprawdzeni.Inaczejmówiąc,nie przeskanowaliśmyjeszczetychobiektów,abysprawdzić,czymożnazaichpośrednictwemosiągnąćinneobiekty.Lista Nieprzeskanowane jestpoczątkowo pusta.Dodatkowokażdyobiektzawierabitwskazujący,czyudałosiędoniego

/*fazaznakowania*/

1)dodajkażdyobiektwskazywanyprzezzestawpodstawowy dolisty Nieprzeskanowane iustawjegobitosiągalnościna1 2) while (Nieprzeskanowane = ∅){ 3)usuńpewienobiekt o zlisty Nieprzeskanowane; 4) for ((każdyobiekt o wskazywanyw o){ 5) if (o jestnieosiągalny,tzn.jegobitosiągalnościto0){ 6) ustawbitosiągalności o na1; 7) umieść o na Nieprzeskanowane; } } }

/*fazazamiatania*/

8) Wolne = ∅; 9) for ((dlakażdegofragmentupamięci o nastercie){ 10) if (o niezostałosiągnięty,czylijegobitosiągalnościto0) dodaj o do Wolne; 11) else ustawbitosiągalności o na0; }

RYSUNEK 7.21: Odśmiecacz„oznakujizamieć”

dotrzeć(bitosiągalności).Przeduruchomieniemalgorytmuwszystkiealokowane obiektymająbitosiągalnościustawionyna0.

Wwierszu(1)pseudokoduzrysunku7.21inicjujemylistę Nieprzeskanowane, umieszczającnaniejwszystkieobiektynależącedozestawupodstawowego.Bit osiągalnościdlatychobiektówjestrównieżustawianyna1.Wierszeod(2)do(7) topętla,wktórejkolejnobadamykażdyobiekt o,któryznalazłsięnaliście Nieprzeskanowane

Pętla for wwierszachod(4)do(7)implementujeskanowanieobiektu o Sprawdzamykażdyobiekt o ,dlaktóregoznajdziemyreferencjęwobiekcie o.Jeśli o zostałjużwcześniejosiągnięty(jegobitosiągalnościto1),wówczasniemusimy nicrobićz o ;albozostałjużprzeskanowanywcześniej,alboznajdujesięna liście Nieprzeskanowane izostaniesprawdzonypóźniej.Jednakjeśliwcześniejnie dotarliśmydo o ,wówczasmusimyustawićjegobitosiągalnościna1wwierszu (6)idodaćgodolisty Nieprzeskanowane wwierszu(7).

Rysunek7.22ilustrujetenproces.Pokazujelistę Nieprzeskanowane zczteremaobiektami.Pierwszyobiektnatejliście,odpowiadającyobiektowi o wpowyższymomówieniu,jestwtrakcieskanowania.Przerywanelinieodpowiadają trzemrodzajomobiektów,któremogąbyćosiągalnez o:

1.Wcześniejprzeskanowanyobiekt,któregonietrzebaskanowaćponownie.

2.Obiektznajdującysięobecnienaliście Nieprzeskanowane

3.Element,któryjestosiągalny,alewcześniejbyłuważanyzanieosiągalny.

Wavefronting

Zgniazdazawierającego k zewnętrznychwpełniprzestawialnychpętlimożna równieżłatwowygenerować k 1wewnętrznychzrównoleglalnychpętli.Choć potokowaniejestrozwiązaniempreferowanym,dołączamytęinformacjędla kompletnościrozważań.

Dzielimyobliczaniegniazdaz k wpełniprzestawialnymizewnętrznymi pętlamiprzyużyciunowejzmiennejindeksowej i ,zdefiniowanejjakopewnadodatniakombinacjaliniowawszystkich k indeksówprzestawialnychpętligniazda. Przykłademtakiejkombinacjimożebyć i = i1 + ... + ik.

Tworzymynajbardziejzewnętrznąpętlęsekwencyjną,iterującąsiępopartycjach i wrosnącejkolejności;obliczeniazagnieżdżonewkażdejpartycjisą uporządkowanetaksamojakpoprzednio.Pierwszych k 1pętliwkażdejpartycji napewnomożnazrównoleglić.Intuicyjniedladwuwymiarowejprzestrzeniiteracjipokazanatransformacjagrupujeiteracjewzdłużprzekątnychbiegnącychpod kątem135◦ wwykonaniunajbardziejzewnętrznejpętli.Tastrategiagwarantuje, żewewnątrziteracjipętlizewnętrznejniewystępujązależnościdanych.

Tworzeniebloków

Wpełniprzestawialnegniazdopętliogłębokości k możnazblokowaćwzdłuż k wymiarów.Zamiastprzydzielaćiteracjedoprocesorówwzależnościodindeksówzewnętrznejlubwewnętrznejpętli,możemyjakoposzczególnejednostki zebraćblokiiteracji.Zblokowywaniepozwalapoprawićlokalnośćdanych,atakże zminimalizowaćnadmiaroweobciążeniepotokowania.

Przypuśćmy,żemamydwuwymiarowe,wpełniprzestawialnegniazdopętli,takiejaknarysunku11.55(a)ichcielibyśmypodzielićobliczenianabloki

for(i=0;i<n;i++) for(j=0;j<n;j++){ <S> }

(a)Prostegniazdopętli for(ii=0;ii<n;ii+=b) for(jj=0;jj<n;jj+=b) for(i=ii;i<min(ii+b,n);i++) for(j=jj;j<min(jj+b,n);j++){ <S> }

(b)Zblokowanawersjategogniazda

RYSUNEK 11.55: 2-wymiarowegniazdopętlii jegowersjablokowa

(a) Before.

(b) After.

RYSUNEK 11.56: Kolejnośćwykonaniaprzedzblokowaniem ipozblokowaniugniazdapętli

orozmiarach b × b.Kolejnośćwykonywaniazblokowanegokodupokazanajest narysunku11.56,arównoważnykodnarysunku11.55(b).

Jeślikażdyblokprzydzielimyjednemuprocesorowi,wówczascałytransfer danychzjednejiteracjidoinnejwtymsamymblokuniewymagażadnejkomunikacjimiędzyprocesorami.Alternatywniemożemyzwiększyćziarnistośćpotokowania,przydzielającjednemuprocesorowicałąkolumnębloków.Zauważmy,że każdyprocesorsynchronizujesięterazzeswoimipoprzednikamiinastępnikami tylkonagranicachbloków.Zatemkolejnąkorzyściązezblokowywaniajestto, żeprogramymusząprzesyłaćjedyniedanewystępującenagranicachmiędzy sąsiadującymiblokami.Wartościwewnątrzkażdegoblokusąobsługiwaneprzez pojedynczyprocesor.

Przykład11.63: Użyjemyterazprawdziwegonumerycznegoalgorytmu–rozkładuCholeskiego–abypokazać,jakalgorytm11.59obsługujepojedyncze gniazdapętlijedynieprzyużyciupotokowania.Kodten,pokazanynarysunku11.57,implementujealgorytmoczasiewykonania O (n3 )operującyna

for(i=1;i<=N;i++){

for(j=1;j<=i-1;j++){

for(k=1;k<=j-1;k++)

X[i,j]=X[i,j]-X[i,k]*X[j,k]; X[i,j]=X[i,j]/X[j,j]; }

for(m=1;m<=i-1;m++)

X[i,i]=X[i,i]-X[i,m]*X[i,m]; X[i,i]=sqrt(X[i,i]); }

RYSUNEK 11.57: RozkładCholeskiego

Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.