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