Pipeline - menetelmä laskelmien järjestämiseksi, jota käytetään nykyaikaisissa prosessoreissa ja ohjaimissa niiden suorituskyvyn lisäämiseksi (lisätään aikayksikköä kohden suoritettavien käskyjen määrää - rinnakkaisuuden toiminta käskytasolla ), tekniikka, jota käytetään tietokoneiden ja muiden kehittämiseen. digitaaliset elektroniset laitteet.
Ideana on suorittaa useita prosessorikäskyjä rinnakkain. Monimutkaiset prosessorin käskyt esitetään yksinkertaisempien vaiheiden sarjana. Sen sijaan, että käskyt suoritettaisiin peräkkäin (odottaisi yhden käskyn loppua ja siirrytään seuraavaan), seuraava käsky voidaan suorittaa useissa ensimmäisen käskyn suoritusvaiheissa. Tämä antaa prosessorin ohjausketjuille mahdollisuuden vastaanottaa käskyjä käsittelyn hitaimman vaiheen nopeudella, mutta samalla paljon nopeammin kuin jokaisen käskyn yksinomaisen täyden käsittelyn suorittaminen alusta loppuun.
Oikealla olevassa kuvassa on yksinkertainen viisitasoinen liukuhihna RISC-suorittimissa . Tässä:
Pystyakseli on peräkkäiset itsenäiset käskyt, vaaka-akseli on aika. Vihreä sarake kuvaa prosessorin tilaa tietyllä hetkellä, jossa aikaisin, ylempi käsky on jo rekisteriin kirjoitettavassa tilassa ja viimeisin, alempi käsky vasta lukuvaiheessa.
Itse termi "kuljetin" tuli teollisuudesta, joka käyttää samanlaista toimintaperiaatetta - materiaali vedetään automaattisesti kuljetinhihnaa pitkin työntekijälle, joka suorittaa sen kanssa tarvittavat toimenpiteet, häntä seuraava työntekijä suorittaa tehtävänsä tuloksena olevalla. työkappale, seuraava tekee jotain muuta. Siten putkilinjan loppuun mennessä työntekijöiden ketju suorittaa kaikki sille osoitetut tehtävät ja ylläpitää korkeaa tuotantoastetta. Jos hitain toiminta kestää esimerkiksi minuutin, jokainen osa poistuu kokoonpanolinjalta minuutissa. Prosessoreissa työntekijöiden roolia hoitavat toiminnalliset moduulit, jotka ovat osa prosessoria.
Yksinkertaisimman päällekkäisen käskyn suorittamisen ajassa toteutti Konrad Zuse vuonna 1941 [ 2] .
Putki pieni ETSVM " Ural " ( 1957 , Neuvostoliitto ) oli kaksivaiheinen kuljetin toimintaa. [3]
Monivaiheiset kuljettimet modernin näkökulman mukaan toteutettiin Anatoli Ivanovich Kitovin M -100- koneessa (1959, Neuvostoliitto) [ määritä ] [4] , UNIVAC LARC (1960, USA), IBM Stretch (1961, USA) [5] , Atlas (1962, Iso-Britannia) ja BESM-6 (1967, Neuvostoliitto). IBM Stretch -projektissa ehdotettiin termejä "fetch" ( eng. Fetch ), "dekoodaus" ( eng. Decode ) ja "execution" ( eng. Execute ), jotka sitten yleistyivät.
Monia nykyaikaisia prosessoreita ohjataan kellogeneraattorilla. Sisällä oleva prosessori koostuu loogisista elementeistä ja muistisoluista - flip- flopeista . Kun signaali kellogeneraattorilta saapuu, kiikut saavat uuden arvonsa, ja "logiikalla" kestää jonkin aikaa uusien arvojen purkamiseen. Sitten tulee seuraava signaali kellogeneraattorilta, kiikut saavat uusia arvoja ja niin edelleen. Jakamalla loogisten elementtien sekvenssit lyhyemmiksi sarjoiksi ja asettamalla kiikkuja näiden lyhyiden sekvenssien väliin, lyhenee logiikkaan signaalien käsittelyyn tarvittava aika. Tässä tapauksessa yhden prosessorijakson kestoa voidaan lyhentää vastaavasti.
Esimerkiksi yksinkertaisin RISC-prosessorien liukuhihna voidaan esittää viidellä vaiheella, joissa on liipaisusarjoja vaiheiden välillä:
Tilanteet, joita kutsutaan liukuhihnakonfliktiksi ( englanniksi hazards ), estävät seuraavan käskyn suorittamisen käskyvirrasta sille tarkoitetussa syklissä. Törmäykset vähentävät putkilinjan suorituskyvyn todellista nopeutumista ja voivat saada putkilinjan pysähtymään . Ristiriitojen ratkaiseminen edellyttää, että joidenkin liukuhihnassa olevien käskyjen annetaan jatkaa suoritusta, kun taas toiset viivästyvät.
Konflikteja on kolme luokkaa [6] .
Rakenteelliset ristiriidat syntyvät resurssiristiriitojen takia, kun laitteisto ei voi tukea kaikkia mahdollisia samanaikaisesti suoritettavien käskyjen yhdistelmiä [7] . Jos jotakin käskyyhdistelmää ei voida tukea, prosessorilla sanotaan olevan rakenteellinen ristiriita . Useimmiten rakenteellisia ristiriitoja esiintyy, kun jokin toiminnallinen lohko ei ole täysin valmis. Esimerkiksi jotkut prosessorit jakavat yhden muistiputken dataa ja ohjeita varten. Tämän seurauksena, kun käsky sisältää datamuistin käytön, se on ristiriidassa myöhemmän käskyn kanssa. Tämän ristiriidan ratkaisemiseksi käytettäessä muistia dataa varten liukuhihna pysähtyy yhden jakson ajaksi.
Vaihtoehtona tällaiselle rakenteelliselle ristiriidalle kehittäjä voisi tarjota erillisen käskymuistin käytön joko jakamalla välimuisti erillisiin käskyvälimuistiin ja datavälimuistiin tai käyttämällä käskyjen tallentamiseen useita puskureita, joita kutsutaan käskypuskureiksi, mutta tätä ei tehdä järjestyksessä. estääksesi lohkon kustannusten nousun [8] .
Tietoristiriitoja syntyy, kun komennon riippuvuus edellisen komennon tuloksista ilmenee, kun komentoja yhdistetään liukuhihnassa. Nämä ristiriidat ilmenevät, kun liukuhihna muuttaa operandien luku-/kirjoitusoikeuksien järjestystä niin, että se eroaa järjestyksestä, joka on olemassa peräkkäin suoritetuille käskyille prosessorissa ilman liukuhihnaa. On olemassa dataristiriitojen ratkaisumenetelmä: edelleenlähetys ( englanniksi register forwarding ) (kutsutaan joskus ohitukseksi ) [9] . Valitettavasti kaikkia mahdollisia tietoristiriitoja ei voida käsitellä ohituksen avulla, jolloin putkisto keskeytetään, kunnes ristiriita on ratkaistu.
Ohjausristiriidat ilmenevät suoritettaessa ehdollisia siirtoja ja muita käskyjä, jotka muuttavat ohjelmalaskurin arvoa . Ohjauksen siirtoviiveen aiheuttamaa liukuhihnapysähdystä voidaan käsitellä monella tapaa , mutta syvät putkilinjat käyttävät yleensä aggressiivisia työkaluja [10] , kuten ohjauksen siirron ennustamista .
Liukuhihnaton arkkitehtuuri on paljon tehottomampi prosessorin toiminnallisten moduulien pienemmän kuormituksen vuoksi, kun taas yksi tai pieni määrä moduuleja suorittaa tehtävänsä käskyjen käsittelyn aikana. Liukulinja ei täysin eliminoi prosessorien moduulien joutoaikaa eikä lyhennä jokaisen käskyn suoritusaikaa, mutta se pakottaa prosessorimoduulit toimimaan rinnakkain eri käskyjen kanssa, mikä lisää aikayksikköä kohti suoritettavien käskyjen määrää. ja siten ohjelmien yleistä suorituskykyä.
Prosessorit, joiden sisällä on putkisto, on suunniteltu siten, että käskyjen käsittely on jaettu vaihesarjaan, olettaen useiden käskyjen samanaikaisen käsittelyn eri vaiheissa. Kunkin vaiheen työn tulokset siirretään muistisolujen kautta seuraavaan vaiheeseen ja niin edelleen, kunnes käsky suoritetaan. Tällainen prosessorin organisointi, jossa kunkin käskyn keskimääräinen suoritusaika hieman kasvaa, tarjoaa kuitenkin merkittävän suorituskyvyn lisäyksen käskyjen suorittamisen suuren tiheyden vuoksi.
Kaikki ohjeet eivät kuitenkaan ole riippumattomia. Yksinkertaisimmassa liukuhihnassa, jossa käskyjen käsittelyä edustaa viisi vaihetta, täyden latauksen varmistamiseksi, kun ensimmäisen käskyn käsittely on valmis, mieluiten neljää peräkkäistä itsenäistä käskyä tulisi käsitellä rinnakkain. Jos sekvenssi sisältää käskyjä, jotka riippuvat parhaillaan suoritettavista, niin yksinkertaisimman liukuhihnan ohjauslogiikka keskeyttää useita liukuhihnan alkuvaiheita, jolloin liukuhihnaan asetetaan tyhjä käsky ("kupla"), joskus toistuvasti, kunnes riippuvuus on ratkaistu. On olemassa useita temppuja, kuten edelleenlähetys, jotka vähentävät huomattavasti tarvetta keskeyttää osa putkilinjasta tällaisissa tapauksissa. Prosessorin samanaikaisesti käsittelemien käskyjen välinen riippuvuus ei kuitenkaan mahdollista liukuhihnavaiheiden lukumäärän moninkertaista suorituskyvyn kasvua verrattuna liukuhihnattomaan prosessoriin.
Putki ei auta kaikissa tapauksissa. Mahdollisia haittapuolia on useita. Käskyliukuhihnaa voidaan kutsua "täysin liukuhihnaksi", jos se voi hyväksyä uuden käskyn joka konejaksolla . Muutoin putkilinjaan on pakotettava viiveitä, jotka tasoittavat putkilinjaa ja heikentävät sen suorituskykyä.
Edut:
Virheet:
Oikealla on yleinen putki, jossa on neljä työvaihetta:
Ylempi harmaa alue on luettelo suoritettavista ohjeista. Alempi harmaa alue on luettelo ohjeista, jotka on jo suoritettu. Ja keskimmäinen valkoinen alue on itse putkisto.
Toteutus menee näin:
Kierrä | Toiminnot |
---|---|
0 | Neljä ohjetta odottaa suoritusta |
yksi |
|
2 |
|
3 |
|
neljä |
|
5 |
|
6 |
|
7 |
|
kahdeksan |
|
9 | Kaikkia ohjeita on noudatettu |
Liukulinjaristiriitojen ratkaisemiseksi prosessori pakotetaan viivyttämään käskyn käsittelyä luomalla "kupla" liukuhihnaan. Kuplan kulkemiseen toimilaitteiden läpi ei liity mitään hyödyllistä työtä. Toisessa jaksossa purppuranpunaisen käskyn käsittely viivästyy, ja nyt kolmannen jakson dekoodausvaiheessa on kupla. Kaikki ohjeet purppuranpunaisen käskyn "jälkeen" viivästyvät yhden jakson verran, kun taas purppuranpunaisen käskyn "ennen" ohjeet jatkuvat.
Ilmeisesti kuplan läsnäolo liukuhihnassa antaa kokonaissuoritusajan 8 syklin 7 sijasta yllä esitetyssä suorituskaaviossa.
Toimilaitteiden on suoritettava jokin toiminto jokaisessa syklissä. Kuplat ovat tapa aiheuttaa viivettä käskyn käsittelyyn pysäyttämättä putkilinjaa. Kun ne suoritetaan, noudon, dekoodauksen, suorituksen ja tuloksen kirjoittamisen vaiheissa ei tapahdu hyödyllistä työtä. Ne voidaan ilmaista käyttämällä NOP [11] [12] [13] assembler-ohjetta .
Oletetaan, että tyypillinen ohje kahden numeron lisäämiseksi on СЛОЖИТЬ A, B, C. Tämä ohje lisää muistipaikkojen A ja B arvot ja sijoittaa sitten tuloksen muistipaikkaan C. Liukuhihnaprosessorissa ohjain voi jakaa tämän toiminnon lomakkeen peräkkäisiksi tehtäviksi
LATAA A , R1 LATAA B , R2 LISÄÄ R1 , R2 , R3 KIRJOITA R3 , C lataa seuraava ohjeSolut R1 , R2 ja R3 ovat prosessorirekistereitä . _ Muistipaikkoihin tallennetut arvot, joita kutsumme A:ksi ja B :ksi, ladataan (eli kopioidaan) näihin rekistereihin, sitten lasketaan yhteen ja tulos kirjoitetaan muistipaikkaan C .
Tässä esimerkissä liukuhihna koostuu kolmesta tasosta - lataus, suoritus ja kirjoittaminen. Näitä vaiheita kutsutaan luonnollisesti tasoiksi tai putkivaiheiksi .
Liukuhihnattomassa prosessorissa vain yksi vaihe voidaan suorittaa kerrallaan, joten käskyn on suoritettava loppuun ennen kuin seuraava ohje voi edes alkaa. Liukuhihnaprosessorissa kaikki nämä vaiheet voidaan suorittaa samanaikaisesti eri käskyillä. Joten kun ensimmäinen käsky on suoritusvaiheessa, toinen käsky on dekoodausvaiheessa ja kolmas käsky on lukuvaiheessa.
Liukuhihna ei lyhennä käskyn suorittamiseen kuluvaa aikaa, mutta se lisää samanaikaisesti suoritettavien käskyjen määrää (määrää) ja vähentää siten suoritettujen käskyjen välistä viivettä - lisää ns. läpäisykyky . Mitä enemmän kerroksia liukuhihnassa on, sitä enemmän käskyjä voidaan suorittaa samanaikaisesti ja sitä pienempi on viive valmiiden käskyjen välillä. Jokainen nykyään valmistettu mikroprosessori käyttää vähintään kaksitasoista putkistoa.
Teoreettinen kolmitasoinen putki:
Vaihe | Englanti otsikko | Kuvaus |
---|---|---|
Näyte | Hae | Lue ohjeet muistista |
Toteutus | Suorittaa | Suorita ohje |
Äänite | Kirjoita takaisin | Kirjoita tulos muistiin ja/tai rekistereihin |
Suoritettava pseudoassembler-listaus:
KUORMITUS 40, A ; lataa numero 40 kohtaan A KOPIO A , B ; kopioi A - B ADD 20, B ; lisää 20 kohtaan B WRITE B , 0x0300 ; kirjoita B muistipaikkaan 0x0300Kuinka se toteutetaan:
Taktisuus | Näyte | Toteutus | Äänite | Selitys |
---|---|---|---|---|
Toimenpide 1 | LADATA | LOAD-käsky luetaan muistista. | ||
Toimenpide 2 | KOPIO | LADATA | LOAD-käsky suoritetaan, COPY-käsky luetaan muistista. | |
Toimenpide 3 | TAITA | KOPIO | LADATA | LOAD-käsky on kirjoitustulosvaiheessa, jossa sen tulos (eli numero 40 ) kirjoitetaan rekisteriin A . Samalla suoritetaan COPY-käsky. Koska sen on kopioitava rekisterin A sisältö rekisteriin B , sen on odotettava LOAD-käskyn loppuun. |
Toimenpide 4 | ENNÄTYS | TAITA | KOPIO | WRITE-käsky ladataan, COPY-käsky jättää meille hyvästit ja ADD-käskyä lasketaan parhaillaan. |
Ja niin edelleen. Huomaa, että joskus ohjeet riippuvat muiden ohjeiden tuloksesta (kuten esimerkiksi COPY-ohjeemme). Kun useampi kuin yksi käsky viittaa tiettyyn paikkaan joko lukemalla sitä (eli käyttämällä sitä tulooperandina) tai kirjoittamalla siihen (eli käyttämällä sitä lähtöoperandina), käskyjen suoritus ei ole järjestys, joka oli alun perin tarkoitettu alkuperäisessä ohjelmassa. , voi aiheuttaa putkiristiriidan , (kuten edellä mainittiin). On olemassa useita todistettuja tekniikoita konfliktien ehkäisemiseksi tai niiden korjaamiseksi, jos niitä ilmenee.
Monet järjestelmät sisältävät 7-, 10- tai jopa 20-tason putkia (kuten esimerkiksi Pentium 4 -prosessorissa ). Myöhäisillä Pentium 4 -ytimillä koodinimeltään Prescott ja Cedar Mill (ja niiden Pentium D -johdannaisilla) on 31-tasoinen putkisto.
Xelerator X10q -prosessorissa on yli tuhat askelta pitkä putki [14] . Kolikon kääntöpuoli tässä tapauksessa on tarve nollata koko liukuhihna, jos ohjelman kulku on muuttunut (esimerkiksi ehdollisen lauseen avulla). Haarojen ennustajat yrittävät ratkaista tämän ongelman . Haaraennuste itsessään voi vain pahentaa asioita, jos ennustus tehdään huonosti. Joissakin sovelluksissa, kuten supertietokoneissa , ohjelmat on erityisesti kirjoitettu käyttämään ehdollisia lauseita mahdollisimman vähän, joten erittäin pitkät liukuhihnat vaikuttavat erittäin positiivisesti laskennan yleiseen nopeuteen, koska pitkät liukuhihnat on suunniteltu vähentämään CPI:tä ( jaksojen lukumäärää ohjeeseen ).
Jos haaroittumista tapahtuu jatkuvasti, koneen ohjeiden uudelleenjärjestely auttaa vähentämään nopeushäviötä merkittävästi: todennäköisimmin tarvittavat ohjeet laitetaan putkeen. Tämä menetelmä on tehokkaampi kuin se, että putkilinja on nollattava kokonaan joka kerta. Ohjelmia, kuten gcov , voidaan käyttää määrittämään, kuinka usein yksittäisiä haaroja todella suoritetaan, käyttämällä koodin peittoanalyysinä tunnettua tekniikkaa . Vaikka käytännössä tällainen analyysi on viimeinen mitta optimoinnissa.
Liukuputkien suuri suorituskyky johtaa suorituskyvyn heikkenemiseen, jos suoritettava koodi sisältää paljon ehdollisia hyppyjä: prosessori ei tiedä mistä lukea seuraava käsky, ja siksi sen on odotettava ehdollisen hyppykäskyn loppumista, jolloin tyhjä putki takana. Kun haara on ajettu ja tiedetään, mihin prosessorin on siirryttävä seuraavaksi, seuraavan käskyn on mentävä koko liukuhihnan läpi ennen kuin tulos on saatavilla ja prosessori "toimii" taas. Äärimmäisessä tapauksessa liukuhihnaprosessorin suorituskyky voi teoriassa pudota liukuhihnattoman prosessorin suorituskykyyn tai jopa olla huonompi johtuen siitä, että vain yksi liukuhihnan taso on varattu ja tasojen välillä on pieni viive.
Jos prosessori on varustettu liukuhihnalla, muistista luettua koodia ei suoriteta välittömästi, vaan se asetetaan jonoon ( prefetch input queue ). Jos muistissa olevaa koodia muutetaan, liukuhihnajonossa oleva koodi pysyy samana. Myöskään käskyvälimuistin ohjeet eivät muutu . On otettava huomioon, että tämä ongelma on tyypillinen vain itsemuokkaville ohjelmille ja suoritettavien tiedostojen pakkaajille .
prosessoritekniikat | Digitaaliset|||||||||
---|---|---|---|---|---|---|---|---|---|
Arkkitehtuuri | |||||||||
Ohjesarjan arkkitehtuuri | |||||||||
koneen sana |
| ||||||||
Rinnakkaisuus |
| ||||||||
Toteutukset | |||||||||
Komponentit | |||||||||
Virranhallinta |