Staattinen haarautumisen ennustus haarautumishasardi ratkaistaan olettamalla haarautumispäätöksen tulos ilman, että odotetaan oikean haarautumisehdon laskennan tulosta ① 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) Jos haaraudutaan, tyhjennä haarautumiskäskyn jälkeiset käskyt (liukuhihnan alussa olevat käskyt): #96 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 IM Reg ALU 4 beq $1,$2,2 I IM Reg DM Reg n t DM Reg ALU 8 sub flush$4,$1,$5 ALU s IM Reg r. 16 and $6,$1,$7 IM Reg DM Reg O 20 or r8,$1,$9 d ALU r DM e r IF-tasolla olevan käskyn poistamiseksi, aseta IF/ID- liukuhihnarekisterin käskykenttä IF.Flush nollaksi(käskystä tulee noop) #98 Reg Haarautumisrakenteet Ennustus, että haarautumista ei tehdä, toimii hyvin “top of the loop” -haarautumisrakenteessa Loop: beq $1,$2,Out 1nd loop instr Mutta tällaisissa silmukoissa on hyppyjä silmukan lopusta alkuun – joka aiheuttaa stall-jakson hypyn ansiosta . . . last loop instr j Out: Loop fall out instr Ennustus, että haarautumista ei tehdä, ei toimi “bottom of the loop” -haarautumisrakenteen yhteydessä Loop: 1 loop instr st 2nd loop instr . . . last loop instr bne $1,$2,Loop #99 fall out instr Staattinen haarautumisen ennustus, … Ratkaistaan haarautumishasardi olettamalla haarautumispäätöksen tulos ja jatkamalla suoritusta ② Predict taken – Ennusta, että haarautuminen tullaan aina tekemään Kun haarautumisen kustannus kasvaa (pidemmissä liukuhihnoissa), yksinkertainen staattinen ennustusmenetelmä voi heikentää suorituskykyä ③ #100 Predict taken tuottaa aina yhden stall -jakson (jos haarautumislogiikka on siirretty ID-tasoon) 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 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 #101 4096-bittinen BHT: väärinennustus vaihtelee 1% (nasa7, tomcatv) - 18% (eqntott) Haarautumiskohdepuskuri BHT ennustaa milloin haarautuminen tulisi tehdä, mutta ei kerro minne! 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ä BTB Instruction Memory PC Read 0 Address Jos ennustus on oikein, liukuhihnaa ei tarvitse pysäyttää haarautumiskäskyn takia (paitsi ensimmäisellä kerralla, jolloin BTB on tyhjä) #102 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 Loop: 1st loop instr ohjaus on silmukkakoodin lopussa 1:llä kerralla ennustetaan väärin, koska haarautuminen tapahtuu takaisin silmukan alkuun; invertoidaan ennustusbitti (predict_bit = 1) #103 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) 2nd loop instr . . . last loop instr bne $1,$2,Loop fall out instr Esim. suoritettaessa silmukka 10 kertaa, saadaan 80% ennustustarkkuus haarautumiselle, joka tapahtuu 90% tapauksista 2-bittinen ennustaja 2-bittisellä ennustajalla voidaan saavuttaa 90% tarkkuus, koska ennusteen pitää olla väärin kahdesti ennen kuin ennustebitin tila vaihdetaan Loop: 1st loop oikein 9 kertaa 2nd loop Väärin silmukasta . Taken poistuttaessa Not taken . Predict 1 Predict 1 11 Taken Taken 0 Predict 01 Not Taken #105 10 Taken Taken Oikein 1:llä iteraatiolla Not taken Taken last loop instr bne $1,$2,Loop fall out instr 00 Not taken instr . Not taken Predict 0 Not Taken instr BHT tallettaa myös tilakoneen alkutilan 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? Reg ALU IM DM Reg liukuhihnataso(t)? synkroninen? Aritmetiikan ylivuoto EX kyllä Laiton käsky ID kyllä I/O-palvelupyyntö mikä tahansa ei Laitteistovika mikä tahansa ei #109 Yhdellä kellojaksolla voi tapahtua useampia poikkeuksia Useampi samanaikainen poikkeus IM Reg ALU Inst 0 I DM Reg n D$ page fault Inst 1 t IM Reg ALU s DM Reg arithmetic overflow r. IM Reg ALU Inst 2 DM Reg O undefined instruction Inst 3 d IM Reg ALU r IM Reg DM Reg e Inst 4 #111 I$ page fault ALU r DM Reg 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 0180hex aritmetiikan ylivuoto) Tarvitaan menetelmä tyhjentää uhkaavat käskyt ja sitä seuraavat käskyt liukuhihnasta #112 Datapolku: tuki poikkeuksille PCSrc Branch EX.Flush 8000 0180hex Hazard ID.Flush Unit PC Read Address Add Read Addr 1 Compare IF.Flush Instruction Memory Shift left 2 EX/MEM 0 Control Cause Add 4 0 1 0 IF/ID ID/EX 0 MEM/WB EPC Data Memory RegFile 0 Read Addr 2 Read Data 1 Write Addr ReadData 2 Write Data 16 Sign Extend 32 ALU Write Data ALU cntrl Forward Unit Forward Unit #113 Read Data Address Vielä lisää suorituskykyä Liukuhihnan syvyyden lisääminen kasvattaa kellotaajuutta – superpipelining Mitä enemmän liukuhihnatasoja, sitä enemmän forwarding/hasardi- laitteistoa 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ä? 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 #115 että konerinnakkaisuus Multiple-Issue -prosessorit ① Staattinen 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 Superscalar IF0 IF1 IF2 IF3 ID0 ID1 ID2 ID3 OF0 OF1 OF2 OF3 EX0 EX1 EX2 EX3 aika VLIW IF0 IF2 IF1 IF3 ID0 ID2 ID1 ID3 OF0 OF2 OF1 OF3 EX0 EX2 EX1 EX3 aika IF0 IF1 ID0 ID1 OF0 OF4 OF1 OF5 OF2 OF6 OF3 OF7 EX0 EX4 EX1 EX5 EX2 EX6 EX3 EX7 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 #118 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 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 Ei sisällä hasardilaitteistoa (joten “load use” ei sallittu) Add ALU 4 PC Instruction Memory Register File Data Write Addr Write Data Sign Extend Sign Extend #122 Add Memory MIPS VLIW (2-issue) datapolku Add Add 4 PC Instruction Memory Register File Data Write Addr Write Data Sign Extend Sign Extend #123 Add Memory Koodinvuoronnusesimerkki Oletetaan seuraava silmukkakoodi lp: #124 lw addu sw addi bne $t0,0($s1) $t0,$t0,$s2 $t0,0($s1) $s1,$s1,-4 $s1,$0,lp # # # # # $t0=array element add scalar in $s2 store result decrement pointer 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 Vuoronnettu koodi (Not Unrolled) ALU or branch lp: lw Data transfer $t0,0($s1) CC 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 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 #127 datariippuvuuksia Unrolled Code Example lp: #128 lw lw lw lw addu addu addu addu sw sw sw sw addi bne $t0,0($s1) $t1,-4($s1) $t2,-8($s1) $t3,-12($s1) $t0,$t0,$s2 $t1,$t1,$s2 $t2,$t2,$s2 $t3,$t3,$s2 $t0,0($s1) $t1,-4($s1) $t2,-8($s1) $t3,-12($s1) $s1,$s1,-16 $s1,$0,lp # # # # # # # # # # # # # # $t0=array element $t1=array element $t2=array element $t3=array element add scalar in $s2 add scalar in $s2 add scalar in $s2 add scalar in $s2 store result store result store result store result decrement pointer branch if $s1 != 0 Vuoronnettu koodi (Unrolled) lp: ALU / branch addi $s1,$s1,-16 CC lw Datan siirto $t0,0($s1) lw $t1,12($s1) 2 1 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 sw $t3,4($s1) 8 bne $s1,$0,lp 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) #129 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 VLIW edut ja haitat Edut Yksinkertainen laitteisto (potentiaalia energiatehokkuuteen) Mahdollisesti paremmin skaalattavissa Sallitaan enemmän käskyjä nipussa ja lisätään toiminnallisia yksiköitä Haitat 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 #132 Noop-käskyt tuhlaavat käskymuistia Loop unrolling käytössä ILP:n maksimoimiseksi, joka käyttää enemmän käskymuistia 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 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) #133 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 #135 Voi syöttääa operandeja aktiivisille käskyille 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 #136 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 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 Antidependency R4 := R3 + 1 True data dependency R3 := R5 + 1 Output dependency Samanlainen rajoite kuin todellisilla datariippuvuuksilla, paitsi käänteinen #137 R3 := R3 * R5 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) 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 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 #139 R3 := R3 * R5 R3b := R3a * R5a R4 := R3 + 1 R4a := R3b + 1 R3 := R5 + 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 variable format fixed format fixed format fixed format Registers few, some special Many GP GP and rename (RUU) many, many GP Many ports Many ports Limited # of ports Limited # of ports Memory reference embedded in many instr’s load/store load/store load/store Key Issues decode complexity data forwarding, hazards hardware dependency resolution (compiler) code scheduling #141 Liukuhihnoitettujen SS prosessoreiden evoluutio #142 Year Clock Frequency #Pipeline Issue Stages Widt h Cores/ Chip Power Intel 486 1989 25 MHz 5 1 1 5W Intel Pentium 1993 66 MHz 5 2 1 10 W Intel Pentium Pro 1997 200 MHz 10 3 1 29 W Intel Pentium 4 Willamette 2001 2000 MHz 22 3 1 75 W Intel Pentium 4 Prescott 2004 3600 MHz 31 3 1 103 W Intel Core 2006 2930 MHz 14 4 2 75 W Sun USPARC III 2003 1950 MHz 14 4 1 90 W Sun T1 (Niagara) 2005 1200 MHz 6 1 8 70 W
© Copyright 2024