Staattinen haarautumisen ennustus haarautumishasardi ratkaistaan olettamalla haarautumispäätöksen tulos ilman, että odotetaan oikean haarautumisehdon laskennan tulosta 1 Predict not taken ennustetaan aina, että haarautumista ei tehdä: jatka käskynhakua sekventiaalisesta käskyvirrasta, jolloin liukuhihna pysäytetään ainoastaan silloin, kun haarautuminen tehdään (virheellinen ennustus) #96 Jos haaraudutaan, tyhjennä haarautumiskäskyn jälkeiset käskyt (liukuhihnan alussa olevat käskyt): IF-, ID- ja EX-tasoilta, jos haarautumislogiikka MEM-tasossa: 3 stall-jaksoa IF- ja ID-tasoilta, jos haarautumislogiikka EX-tasossa: 2 stall-jaksoa IF-tasolta, jos haarautumislogiikka on ID-tasossa: 1 stall-jakso Varmista, että poistetut käskyt eivät ole muuttaneet koneen tilaa MIPS-liukuhihnassa automaattinen, koska koneen tilan vaihtavat operaatiot ovat liukuhihnan lopussa: MemWrite (MEM) tai RegWrite (WB) Käynnistä liukuhihna uudelleen haarautumisen kohteesta
Liukuhihnan tyhjennys ennustuksen epäonnistuessa I n s t r. O r d e r 4 beq $1,$2,2 8 sub flush $4,$1,$5 16 and $6,$1,$7 20 or r8,$1,$9 ALU IM Reg DM Reg ALU IM Reg DM Reg ALU IM Reg DM Reg ALU IM Reg DM Reg IF-tasolla olevan käskyn poistamiseksi, aseta IF/IDliukuhihnarekisterin käskykenttä IF.Flush nollaksi(käskystä tulee noop) #98
#99 Haarautumisrakenteet Ennustus, että haarautumista ei tehdä, toimii hyvin top of the loop -haarautumisrakenteessa Loop: beq $1,$2,Out Mutta tällaisissa silmukoissa on hyppyjä silmukan lopusta alkuun joka aiheuttaa stall-jakson hypyn ansiosta 1 nd loop instr... last loop instr j Loop Out: fall out instr Ennustus, että haarautumista ei tehdä, ei toimi bottom of the loop -haarautumisrakenteen yhteydessä Loop: 1 st loop instr 2 nd loop instr... last loop instr bne $1,$2,Loop fall out instr
Staattinen haarautumisen ennustus, Ratkaistaan haarautumishasardi olettamalla haarautumispäätöksen tulos ja jatkamalla suoritusta 2 3 Predict taken Ennusta, että haarautuminen tullaan aina tekemään Predict taken tuottaa aina yhden stall -jakson (jos haarautumislogiikka on siirretty ID-tasoon) Kun haarautumisen kustannus kasvaa (pidemmissä liukuhihnoissa), yksinkertainen staattinen ennustusmenetelmä voi heikentää suorituskykyä Laitteistoa lisäämällä on mahdollista yrittää ennustaa haarautumiskäyttäytymistä dynaamisesti ohjelman suorituksen aikana Dynaaminen haarautumisen ennustus ennusta haarautuminen ajoaikana käyttäen ajoaikaisia tietoja #100
#101 Dynaaminen haarautumisen ennustus IF-tasolla sijaitseva haarautumishistoriapuskuri (branch history table (BHT)), jota osoittaa PC:n alimmat bitit, sisältää bittejä IF/ID-liukuhihnarekisteristä ID-tasolle vietyjä bittejä, jotka kertovat onko haarautuminen suoritettu edellisellä suorituskerralla Ennustusbitti voi ennustaa väärin (väärä ennustus haarautumiseen tällä iteraatiokierroksella tai kyseessä voi olla toinen haarautuminen, jonka käskyosoitteessa on samat vähiten merkitsevät bitit), mutta virheellisellä ennustuksella ei ole vaikutusta laskennan lopputulokseen, ainoastaan suorituskykyyn Haarautumispäätös tehdään ID-tasolla sen jälkeen kun on haettu käsky on tulkittu ja havaittu haarautumiskäskyksi ja BHT:stä on tarkastettu ennustusbitit) Jos ennustus on väärä, väärät käskyt poistetaan liukuhihnasta (flush), liukuhihna käynnistetään uudelleen oikeilla käskyillä ja ennustusbitit invertoidaan 4096-bittinen BHT: väärinennustus vaihtelee 1% (nasa7, tomcatv) - 18% (eqntott)
Haarautumiskohdepuskuri BHT ennustaa milloin haarautuminen tulisi tehdä, mutta ei kerro minne! #102 IF-tasolla oleva haarautumiskohdepuskuri (branch target buffer, BTB) tallettaa haarautumisen kohdeosoitteet, mutta myös seuraava sekventiaalinen osoite on haettava. IF/ID-tason ennustusbitti valitsee kumpi seuraava käsky ladataan IF/ID seuraavalla kellon nousevalla reunalla Käskymuistiin tarvitaan kaksi lukuporttia Tai: BTB tallettaa myös haarautumiskohteen käskyn, samaan aikaan kuin käskymuistista haetaan seuraavaa sekventiaalista käskyä Instruction Memory Read 0 Address Jos ennustus on oikein, liukuhihnaa ei tarvitse pysäyttää haarautumiskäskyn takia (paitsi ensimmäisellä kerralla, jolloin BTB on tyhjä) PC BTB
1-bittisen ennustuksen tarkkuus 1-bittinen ennustaja on väärässä kahdesti, jos ei haarauduta Oletetaan, että alussa predict_bit = 0 (indikoi haarautumista ei tapahtunut) ja silmukan ohjaus on silmukkakoodin lopussa 1:llä kerralla ennustetaan väärin, koska haarautuminen tapahtuu takaisin silmukan alkuun; invertoidaan ennustusbitti (predict_bit = 1) Niin kauan kuin haarautuminen tapahtuu (iterointi), ennustus on oikein Silmukasta poistuttaessa ennustetaan taas väärin, koska nyt haarautumista ei tapahdu; invertoidaan ennustusbitti (predict_bit = 0) Loop: 1 st loop instr 2 nd loop instr... last loop instr bne $1,$2,Loop fall out instr Esim. suoritettaessa silmukka 10 kertaa, saadaan 80% ennustustarkkuus haarautumiselle, joka tapahtuu 90% #103 tapauksista
2-bittinen ennustaja 2-bittisellä ennustajalla voidaan saavuttaa 90% tarkkuus, koska ennusteen pitää olla väärin kahdesti ennen kuin ennustebitin tila vaihdetaan oikein 9 kertaa Väärin silmukasta Taken poistuttaessa. 1 Taken 0 Predict Taken 11 Predict Not Taken 01 Not taken Taken Not taken Taken 10 Oikein 1:llä iteraatiolla Predict Taken Predict Not Taken 00 1 Not taken Not taken 0 Loop: 1 st loop instr 2 nd loop instr.. last loop instr bne $1,$2,Loop fall out instr BHT tallettaa myös tilakoneen alkutilan #105
Poikkeuksien hallinta Poikkeukset (exception) tai keskeytykset (interrupt) ovat yksi kontrollihasardin muoto Poikkeuksen syy voi olla R-tyypin aritmetiikkaoperaation ylivuoto Yritys suorittaa laiton käsky I/O-laitteen palvelupyyntö OS palvelupyyntö Laitteiston virhetoiminto Liukuhihna on lopetettava uhkaavan käskyn suoritus: aiemmat käskyt suoritetaan loppuun, seuraavat käskyt tyhjennetään liukuhihnasta, asetetaan poikkeuksen syy rekisteriin, talletetaan uhkaavan käskyn osoite ja hypätään ennelta määrättyyn osoitteeseen (poikkeuksen käsittelijän osoite) ohjelmisto (OS) tarkastaa poikkeuksen syyn ja suorittaa tarvittavat toimenpiteet poikkeuksesta toipumiseksi #106
Kaksi poikkeustyyppiä keskeytys asynkroninen ohjelman suorituksen suhteen aiheutuvat ulkoisista tapahtumista Voidaan käsitellä käskyjen välissä, joten liukuhihnassa olevat aktiiviset käskyt voidaan suorittaa loppuun ennen kontrollin siirtämistä OS:n keskeytyskäsittelijälle simply suspend and resume user program Ansa ohjelman suorituksen suhteen synkroninen Aiheutuvat sisäisistä tapahtumista Ansan käsittelijän on korjattava tilanne: uhkaava käsky on pysäytettävä liukuhihnan keskellä ja annettava kontrolli OS:n ansan käsittelijälle Uhkaava käsky voidaan yrittää suorittaa uudestaan ja jatkaa suoritusta tai ohjelman suoritus lopetetaan #107
Missä poikkeus ilmenee liukuhihnassa? ALU IM Reg DM Reg liukuhihnataso(t)? synkroninen? Aritmetiikan ylivuoto EX kyllä Laiton käsky ID kyllä I/O-palvelupyyntö mikä tahansa ei Laitteistovika mikä tahansa ei Yhdellä kellojaksolla voi tapahtua useampia poikkeuksia #109
Useampi samanaikainen poikkeus I n s t r. O r d e r Inst 0 Inst 1 Inst 2 Inst 3 Inst 4 ALU IM Reg DM Reg ALU IM Reg DM Reg ALU IM Reg DM Reg I$ page fault D$ page fault arithmetic overflow undefined instruction ALU IM Reg DM Reg ALU IM Reg DM Reg #111 Laitteisto lajittelee poikkeukset siten, että aikaisin käsky keskeytetään ensimmäiseksi
Lisäyksiä MIPS:iin poikkeuksien käsittelyyn (Fig 6.42) Cause -rekisteri (tallettaa poikkeukset) laitteisto poikkeuksen syyn tallentamiseen ja signalointi rekisterin kirjoitusta varten (CauseWrite) EPC -rekisteri (tallettaa uhkaavien käskyjen osoitteet) laitteisto uhkaavien käskyjen osoitteiden tallentamiseen EPCrekisteriin ja signalointi kirjoitusta varten (EPCWrite) Poikkeuksen käsittelyohjelmiston pitää vastata poikkeuksen käskyä Tarvitaan menetelmä käsittelijän alkuosoitteen lataamiseksi ohjelmalaskuriin Laajennetaan ohjelmalaskurin sisääntulo-mux langoitetulla poikkeuksenkäsittelijän osoitteella - (esim. 8000 0180 hex aritmetiikan ylivuoto) Tarvitaan menetelmä tyhjentää uhkaavat käskyt ja sitä seuraavat käskyt liukuhihnasta #112
PC Datapolku: tuki poikkeuksille 4 Instruction Memory Read 0 Address 8000 0180 hex Add IF.Flush IF/ID PCSrc Hazard ID.Flush Unit 0 1 Control 0 Shift left 2 Read Addr 1 RegFile Read Addr 2 Read Data 1 Write Addr ReadData 2 Write Data 16 Sign Extend Forward Unit Branch Add 32 Compare ID/EX Cause EPC EX.Flush 0 0 ALU ALU cntrl EX/MEM Data Memory Read Data Address Write Data MEM/WB Forward Unit #113
Vielä lisää suorituskykyä Liukuhihnan syvyyden lisääminen kasvattaa kellotaajuutta superpipelining Mitä enemmän liukuhihnatasoja, sitä enemmän forwarding/hasardilaitteistoa tarvitaan ja liukuhihnan hallinta vie yhä suuremman osan kellojakson ajasta (latch-time) Haetaan (ja suoritetaan) useampi kuin 1 käsky kerralla (laajenna jokainen liukuhihnataso tukemaan useampia käskyjä) multiple-issue Käskynsuoritustaajuus CPI < 1, joten käytetään IPC: instructions per clock cycle #114 Esim, 6 GHz 4-tie prosessori voi suorittaa max. 24 milj. käskyä / sec., CPI: 0.25 tai parhaassa tapauksessa IPC on 4 Jos datapolussa 5 tasoa, kuinka monta käskyä liukuhihnassa on aktiivisena kullakin ajan hetkellä?
#115 Rinnakkaisuuden tasoja Ohjelman käskytason rinnakkaisuus (instruction-level parallelism, ILP) mittaa ohjelman keskimääräistä ohjelman käskyjen määrää, jotka prosessori voisi suorittaa samanaikaisesti Määräytyy pääasiassa käskyn todellisten (data) riippuvuuksien ja menettelytapa (kontrolli) riippuvuuksien perusteella suhteessa muihin käskyihin Datatason rinnakkaisuus, data-level parallelism (DLP) DO I = 1 TO 100 A[I] = A[I] + 1 CONTINUE Prosessorin konetason rinnakkaisuus, machine parallelism mittaa prosessorin kykyä hyödyntää ohjelman ILP:tä Käskyjen lukumäärä, joita voidaan hakea ja suorittaa samanaikaisesti Suorituskyvyn kasvattamiseksi tarvitaan molempia, sekä ILP että konerinnakkaisuus
Multiple-Issue -prosessorit 1Staattinen multiple-issue prosessori (very long instruction word machine, VLIW) Päätös siitä, mitkä käskyt suoritetaan samanaikaisesti, tehdään staattisesti (käännösaikana kääntäjän toimesta)) Esim., Intel Itanium ja Itanium 2 : IA-64 ISA EPIC (Explicit Parallel Instruction Computer) 128-bittiset kimput sisältävät 3 käskyä, jokainen 41 bittiä + 5-bittinen mallinekenttä (joka määrittää mitä toiminnallista yksikköä kukin käsky tarvitsee) 5 toiminnallista yksikköä (IntALU, Mmedia, Dmem, FPALU, Branch) Laaja tuki spekuloinnille ja ennustukselle Dynaaminen multiple-issue prosessori (superscalar) Päätös siitä, mitkä käskyt suoritetaan samanaikaisesti (luokkaa 2-8), tehdään dynaamisesti (ajoaikana erillisen laitteiston toimesta) Esim. IBM Power series, Pentium 4, MIPS R10K, AMD Barcelona #116
Multiple-Issue Prosessorit Pipelined IF 0 IF 1 IF 2 IF 3 ID 0 ID 1 ID 2 ID 3 Superscalar IF 0 IF 2 VLIW IF 0 IF 1 ID 0 ID 1 IF 1 IF 3 OF 0 OF 1 OF 2 OF 3 EX 0 EX 1 EX 2 EX 3 ID 0 ID 2 OF 0 OF 4 ID 1 ID 3 OF 1 OF 5 aika OF 0 OF 2 OF 1 OF 3 OF 2 OF 6 OF 3 OF 7 EX 0 EX 2 EX 0 EX 4 EX 1 EX 3 EX 1 EX 5 aika EX 2 EX 6 EX 3 EX 7 aika #117
Multiple-Issue -datapolku Käsiteltävä seuraavat rajoitteet Kuinka monta käskyä otetaan suoritukseen yhdellä kellojaksolla issue slots Tallennus- (data-) riippuvuudet data hasardit SS/VLIW prosessorissa suuremmat rajoitteet vähäisestä ILP:stä johtuen Proseduuririippuvuudet kontrollihasardit Kuten edellä, mutta vakavampia rajoitteita Käytetään dynaamista haarautumisen ennustusta ILP-rajoitteen kiertämiseksi Resurssikonfliktit rakennehasardit SS/VLIW prosessorissa on suurempi todennäköisyys resurssikonfliktiin Toiminnalliset yksiköt voivat joutua kilpailemaan tulosväylien tai rekisteritiedoston kirjoitus-porttien käytöstä Resurssikonfliktit voidaan eliminoida kahdentamalla tai liukuhihnoittamalla resurssi #118
Spekulointi Spekulaatiota käytetään sallimaan tulevan käskyn suoritus, jolla voi olla riippuva spekuloidusta käskystä Spekuloi ehdollisen haarautumisen (branch prediction) Spekuloidaan, että tallennus (kohdeosoitetta ei vielä tiedetä), joka edeltää latauskäskyä, ei viittaa samaan osoitteeseen, mikä mahdollistaa latauksen vuoronnettavan ennen tallennusta (load speculation) Tarvitaan seuraava mekanismit (laitteisto ja/tai ohjelmisto) Tarkastus, oliko arvaus oikein Toipumismekanismi niiden spekuloitujen käskyjen osalta, jotka on arvattu väärin, käskyn aiheuttamien vaikutusten korjaamiseen Jätä huomiotta ja/tai puskuroi poikkeukset, jotka on generoinut spekulatiivisesti suoritettu käsky, kunnes on selvää, että poikkeus on todellakin suoritettava #119
Staattiset Multiple Issue -koneet (VLIW) Staattisen multiple-issue -prosessorin (VLIW) yhteydessä kääntäjä päättää staattisesti (käännösaikana) mitkä käskyt haetaan ja suoritetaan samanaikaisesti Issue packet joukko käskyjä, jotka on niputettu yhteen ja haetaan samalla kellojaksolla yksi pitkä käsky sisältäen useita operaatioita Käskyjoukko nipussa on tavallisesti rajoitettu yksi käsky usealla etukäteen määritellyillä kentillä Kääntäjä ennustaa haarautumisen ja koodin vuoronnuksen staattisesti yrittäen vähentää (kontrolli) tai eliminoidakseen (data) hasardeja VLIW sisältää Useita toiminnallisia yksiköitä Moniporttisia rekisteritiedostoja Leveän ohjelmaväylän #120
Esimerkki: VLIW MIPS Oletetaan multiple-issue MIPS 2:n käskyn nipulla 64 bits ALU Op (R format) Load or Store (I format) or Branch (I format) käskyt haetaan, dekoodataan ja suoritetaan aina pareittain Jos toista parin käskyistä ei voida käyttää, niin se korvataan noop -käskyllä Tarvitaan 4 lukuporttia ja 2 kirjoitusporttia ja erillinen osoitesummain #121
MIPS VLIW (2-issue) datapolku Add Add Ei sisällä hasardilaitteistoa (joten load use ei sallittu) 4 ALU PC Instruction Memory Register File Write Addr Data Write Data Add Memory Sign Extend Sign Extend #122
MIPS VLIW (2-issue) datapolku Add 4 Add PC Instruction Memory Register File Write Addr Data Write Data Add Memory Sign Extend Sign Extend #123
Koodinvuoronnusesimerkki Oletetaan seuraava silmukkakoodi lp: lw $t0,0($s1) # $t0=array element addu $t0,$t0,$s2 # add scalar in $s2 sw $t0,0($s1) # store result addi $s1,$s1,-4 # decrement pointer bne $s1,$0,lp # branch if $s1!= 0 Käskyt on vuoronnettava välttäen liukuhihnan pysäyttämistä Yhdessä nipussa olevien käskyjen on oltava toisistaan riippumattomia load use -käskyt erotettava load-käskyistä vähintään yhdellä kellojaksolla 2 ensimmäisellä käskyllä on load-riippuvuus, 2:lla seuraavalla ja 2:lla viimeisellä datariippuvuus Oletetaan, että laitteisto osaa ennustaa haarautumiset täydellisesti #124
Vuoronnettu koodi (Not Unrolled) ALU or branch Data transfer CC lp: lw $t0,0($s1) 1 addi $s1,$s1,-4 2 addu $t0,$t0,$s2 3 bne $s1,$0,lp sw $t0,4($s1) 4 5 4 kellojaksoa 5 käskyn suorittamiseen CPI: 0.8 (vs. parhaassa tapauksessa 0.5) IPC: 1.25 (vs. parhaassa tapauksessa 2.0) Noop-käskyjä ei lasketa suorituskykyä mitattaessa!! #126
#127 Silmukan iteraatioiden purkaminen Loop unrolling silmukan rungosta tehdään useita kopioita ja eri iteraatiosta olevia käskyjä vuoronnetaan yhteen ILP:n kasvattamiseksi Puretaan iteraatiot (4 kertaa edellisessä esimerkissä) ja tämän jälkeen vuoronnetaan aikaansaatu koodi Eliminoidaan tarpeettomat silmukanohjauskäskyt Vuoronnetaan siten, että vältetään load use hasardeja Silmukoiden purkamisen yhteydessä kääntäjä suorittaa rekisterien uudelleen nimeämisen (register renaming) Eliminoidaan datariippuvuudet, jotka eivät ole todellisia datariippuvuuksia
Unrolled Code Example lp: lw $t0,0($s1) # $t0=array element lw $t1,-4($s1) # $t1=array element lw $t2,-8($s1) # $t2=array element lw $t3,-12($s1) # $t3=array element addu $t0,$t0,$s2 # add scalar in $s2 addu $t1,$t1,$s2 # add scalar in $s2 addu $t2,$t2,$s2 # add scalar in $s2 addu $t3,$t3,$s2 # add scalar in $s2 sw $t0,0($s1) # store result sw $t1,-4($s1) # store result sw $t2,-8($s1) # store result sw $t3,-12($s1) # store result addi $s1,$s1,-16 # decrement pointer bne $s1,$0,lp # branch if $s1!= 0 #128
Vuoronnettu koodi (Unrolled) ALU / branch Datan siirto CC lp: addi $s1,$s1,-16 lw $t0,0($s1) 1 lw $t1,12($s1) 2 addu $t0,$t0,$s2 lw $t2,8($s1) 3 addu $t1,$t1,$s2 lw $t3,4($s1) 4 addu $t2,$t2,$s2 sw $t0,16($s1) 5 addu $t3,$t3,$s2 sw $t1,12($s1) 6 sw $t2,8($s1) 7 bne $s1,$0,lp sw $t3,4($s1) 8 #129 14 käskyn suoritukseen käytetään 8 kellojaksoa CPI: 0.57 (vs. parhaassa tapauksessa 0.5) IPC: 1.8 (vs. parhaassa tapauksessa 2.0)
Predikointi Predikointia voidaan käyttää haarautumisten välttämiseen Käskyn suoritus tehdään riippuvaiseksi predikaatista. Esim. if (p) {statement 1} else {statement 2} normaalisti käännettäisiin kahta haaraa käyttäen, mutta predikoinnilla: (p) statement 1 (~p) statement 2 Ehdon (condition)käyttäminen indikoi, että käsky lähetetään suoritukseen ainoastaan kun condition on tosi Predikointia voidaan käyttää sekä spekulointiin että haarautumisen välttämiseen #130
VLIW -prosessorin kääntäjätuki Kääntäjä pakkaa joukon toisistaan riippumattomia käskyjä nipuksi Tehdään osana koodin uudelleenjärjestelyä (trace scheduling) Kääntäjä purkaa silmukoita ILP:n paljastamiseen Kääntäjä käyttää rekisterin uudelleen nimeämistä nimiriippuvuuksien ratkomiseen ja no load -hasardien välttämiseen Superskalaarit käyttävät dynaamista ennustusta, mutta VLIW:ssä pääasiassa luotetaan kääntäjän tekemiin haarautumisennustuksiin Loop unrolling vähentää ehdollisten haarautumisien määrää Predikointi eliminoi if-the-else rakenteita korvaamalla niitä predikoiduilla käskyillä Kääntäjä ennustaa muistipankkien viittaukset tavoitteena minimoida muistikonfliktien määrä #131
Edut Haitat VLIW edut ja haitat Yksinkertainen laitteisto (potentiaalia energiatehokkuuteen) Mahdollisesti paremmin skaalattavissa Sallitaan enemmän käskyjä nipussa ja lisätään toiminnallisia yksiköitä Ohjelmoinnin / kääntäjän kompleksisuus ja pidemmät käännösajat Syvät liukuhihna ja pitkät latenssit sekoittavat ohjelmoijaa (huippusuorituskyvyn saavuttaminen voi olla vaikeaa) Täysin synkronoitu toiminta; hasardi pysäyttää kaikki käskynhaut, kunnes hasardi on täysin ratkaistu (joten käytetään ennustusta) Objekti (binääri-) koodin yhteensopimattomuus Tarvitaan leveä käskymuisti koodin turpoaminen Noop-käskyt tuhlaavat käskymuistia Loop unrolling käytössä ILP:n maksimoimiseksi, joka käyttää enemmän käskymuistia #132
Superskalaariprosessori (SS) Dynaamiset multiple-issue -prosessorit (SuperScalar) hyödyntävät ajoaikaista laitteistoa dynaamisesti päättelemään mitkä käskyt lasketaan liikkeelle ja suoritetaan samanaikaisesti Käskynhaku ja liikkeellelasku (instruction fetch and issue) hae käskyt, dekoodaa ja ohjaa ne toiminnalliselle yksikölle odottamaan suoritusta #133 Hae, dekoodaa ja ohjaa käskyjä, joka ovat paljon nykyistä käskyä myöhempänä suoritus (instruction-execution) heti, kun operandit ovat saatavilla ja FU ovat vapaana, tulokset voidaan laskea käskynsuoritus käskyille, jotka ovat huomattavasti nykyistä käskyä myöhempänä sitoutuminen (instruction commit) tulokset kirjoitetaan takaisin rekisteritiedostoon tai D$, kun tiedetään, että se on turvallista (i.e., muutetaan koneen tilaa)
Käskyjen järjestys (In-Order, Out-of-Order) Käskynhaku ja dekoodausyksikköjen täytyy tuottaa käskyt järjestyksessä, jotta riippuvuudet voidaan jäljittää Commit yksikön täytyy kirjoittaa tulokset rekistereihin ja muistiin samassa järjestyksessä kuin käskyt on haettu Poikkeuksen tapahtuessa ainoastaan ne rekisterit päivittyvät, joihin kirjoittavat ennen poikkeuksen aiheuttavaa käskyä olevat käskyt Jos haarautuminen ennustetaan väärin, haarautumiskäskyn jälkeen suoritetut käskyt eivät muuta koneen tilaa (Commit-yksikkö korjaa väärät ennustukset) Vaikka liukuhihnan etuosa (fetch, decode, and issue) ja takaosa (commit) käsittelevät käskyt järjestyksessä, FU:t voivat aloittaa operaation suorituksen milloin tahansa kunhan tarvittava data on saatavilla out-of-(program) order execution Suorituksen salliminen epäjärjestyksessä kasvattaa ILP:n määrää #134
Dynaamisesti vuoronnettu CPU Säilyttää riippuvuudet Säilyttää vireillä olevat operandit Tulokset lähetetään kaikille odottaville varausasemille järjestää puskurin uudelleen rekisterikirjoituksia varten Voi syöttääa operandeja aktiivisille käskyille #135
Suoritus epäjärjestyksessä Myöhempi käsky voidaan suorittaa ennen edellistä käskyä, joten laitteiston tulee ratkoa sekä read before write ja write before write data hasardit lw $t0,0($s1) addu $t0,$t1,$s2... sub $t2, $t0, $s2 Jos lw käskyn kirjoitus rekisteriin $t0 tapahtuu addu kirjoituksen jälkeen, niin sub käsky saa väärän arvon rekisteristä $t0 addu -käskyllä on ulostuloriippuvuus käskyyn lw write before write #136
Epäriippuvuudet Laitteiston on käsiteltävä myös epäriippuvuudet (antidependencies) kun (aiemmin suoritettava) myöhempi käsky tuottaa data-arvon, joka hävittää (myöhemmin suoritettavan) aiemman käskyn käyttämän lähdeoperandin R3 := R3 * R5 R4 := R3 + 1 R3 := R5 + 1 Antidependency True data dependency Output dependency Samanlainen rajoite kuin todellisilla datariippuvuuksilla, paitsi käänteinen Sen sijaan, että myöhempi käsky käyttää aiemman käskyn (ei vielä) tuottamaa arvoa (read before write), myöhempi käsky tuottaa arvon, joka tuhoaa aiemman käskyn (ei vielä) käyttämän arvon (write before read) #137
Riippuvuudet, yhteenveto Kaikki kolme riippuvuustyyppiä todellinen datariippuvuus (read before write) epäriippuvuus (write before read) ulostuloriippuvuus (write before write) talletuskonflikti ilmenevät rekisterien (tai muiden talletuspaikkojen) käytössä Todelliset riippuvuudet johtuvat ohjelmasta ja ovat nähtävillä ohjelman datavuokaaviossa Epä- ja ulostuloriippuvuudet johtuvat rekistereiden rajallisesta määrästä ohjelmoija käyttää rekistereitä uudelleen laskennan eri vaiheissa johtaen tallennuskonflikteihin #138
#139 Tallennuskonfliktit ja rekisterin uudelleennimeäminen Tallennuskonflikteja voidaan vähentää (tai eliminoida) lisäämällä ongelmalliseksi osoittautuvaa resurssia Otetaan käyttöön lisärekistereitä, joiden avulla muodostetaan uusi yhteys rekisterin ja arvon välille SS-prosessorissa laitteisto allokoi uudet rekisterit dynaamisesti Rekisterin uudelleen nimeäminen prosessori nimeää käskyssä olevan rekisterin tunnisteen uudelle rekisterille (joka ei näy ohjelmoijalle) arkkitehtuurirekisterit vs. fyysiset rekisterit R3 := R3 * R5 R4 := R3 + 1 R3 := R5 + 1 R3b := R3a * R5a R4a := R3b + 1 R3c := R5a + 1 Nimeämisen suorittava laitteisto valitsee korvaavan rekisterin vapaiden rekisterien varastosta ja vapauttaa rekisterin takaisin varastoon, kun sen arvo on korvattu ja ratkaisemattomia viittauksia rekisteriin ei ole olemassa
Yhteenveto: Lisää suorituskykyä Suorituskyvyn kasvattamiseksi on hyödynnettävä sekä konetason että käskytason (ILP) rinnakkaisuutta Superpipelining Staattinen multiple-issue (VLIW) Dynaaminen multiple-issue (superskalaari) Prosessorin käyttämät mekanismit käskyn liikkeelle laskuun ja suoritukseen vaikuttavat käytettävissä olevaan ILP:een In-order fetch, issue, and commit ja out-of-order execution Liukuhihnoitus luo todellisia riippuvuuksia (read before write) Epäjärjestyksessä suoritus luo epäriippuvuuksia (write before read) Epäjärjestyksessä suoritus luo ulostuloriippuvuuksia (write before write) In-order commit sallii spekuloinnin (ILP:n kasvattamiseksi) ja tarvitaan tarkkojen keskeytysten toteuttamiseksi Rekisterin uudelleen nimeäminen voi ratkoa talletuskonfliktit #140
CISC vs RISC vs SS vs VLIW CISC RISC Superscalar VLIW Instr size variable size fixed size fixed size fixed size (but large) Instr format Registers Memory reference Key Issues variable format few, some special Limited # of ports embedded in many instr s decode complexity fixed format fixed format fixed format Many GP Limited # of ports GP and rename (RUU) Many ports many, many GP Many ports load/store load/store load/store data forwarding, hazards hardware dependency resolution (compiler) code scheduling #141
Liukuhihnoitettujen SS - prosessoreiden evoluutio #142 Year Clock Frequency #Pipeline Stages Issue Widt h Cores/ Chip Power Intel 486 1989 25 MHz 5 1 1 5 W Intel Pentium 1993 66 MHz 5 2 1 10 W Intel Pentium Pro Intel Pentium 4 Willamette Intel Pentium 4 Prescott 1997 200 MHz 10 3 1 29 W 2001 2000 MHz 22 3 1 75 W 2004 3600 MHz 31 3 1 103 W Intel Core 2006 2930 MHz 14 4 2 75 W Sun USPARC III Sun T1 (Niagara) 2003 1950 MHz 14 4 1 90 W 2005 1200 MHz 6 1 8 70 W