Syöttöjonon esihaku - Prefetch input queue
Hakemalla käskyn operaatiokoodia välillä ohjelman muistista hyvissä ajoin tunnetaan prefetching ja se palvelee käyttämällä esihaun tulojonoon (PIQ) kantavassa ennalta haettu ohjeet on tallennettu datarakenne - eli jono . Opcodien noutaminen hyvissä ajoin ennen niiden suorittamistarvetta lisää prosessorin yleistä tehokkuutta lisäämällä sen nopeutta. Prosessorin ei tarvitse enää odottaa muistin käyttöoperaatioita seuraavan käskykoodin valmistumista varten. Tätä arkkitehtuuria käytettiin näkyvästi Intel 8086 -mikroprosessorissa .
Johdanto
Pipelining otettiin laskentaarkkitehtuurin suunnittelun eturintamaan 1960 -luvulla nopeamman ja tehokkaamman laskennan tarpeen vuoksi. Pipelining on laajempi käsite, ja useimmat nykyaikaiset prosessorit lataavat käskyjään joitakin kellojaksoja ennen niiden suorittamista. Tämä saavutetaan esilataamalla konekoodi muistista esilatauksen syöttöjonoon .
Tämä käyttäytyminen koskee vain von Neumann -tietokoneita (eli ei Harvardin arkkitehtuuritietokoneita ), jotka voivat ajaa itse muuttuvaa koodia ja joissa on jonkinlainen käskyjohtaminen . Lähes kaikki nykyaikaiset korkean suorituskyvyn tietokoneet täyttävät nämä kolme vaatimusta.
Yleensä PIQ: n esilatauskäyttäytyminen on näkymätön suorittimen ohjelmointimalliin . On kuitenkin tilanteita, joissa PIQ: n toiminta näkyy, ja ohjelmoijan on otettava se huomioon.
Kun x86 prosessoria vaihtaa mode realmode ja suojattuun tilaan ja päinvastoin, The PIQ on huuhdella tai muuten CPU jatkaa kääntää konekielelle kuin se olisi kirjoitettu viimeisessä tilassa. Jos PIQ ei huuhdella, prosessori voi kääntää sen koodeja väärin ja aiheuttaa Virheellinen käsky poikkeus .
Kun suoritetaan itse muuttuvaa koodia , prosessorikoodin muutos heti suorituspaikan edessä ei välttämättä muuta sitä, miten prosessori tulkitsee koodin, koska se on jo ladattu PIQ-koodiinsa. Se yksinkertaisesti suorittaa vanhan kopion, joka on jo ladattu PIQ: hen, eikä sen uutta ja muutettua koodiversiota sen RAM -muistissa ja/tai välimuistissa .
Tätä PIQ: n käyttäytymistä voidaan käyttää määrittämään, suoritetaanko koodia emulaattorin sisällä vai suoraan oikean suorittimen laitteistossa. Useimmat emulaattorit eivät todennäköisesti koskaan simuloi tätä käyttäytymistä. Jos PIQ-koko on nolla (koodin muutokset vaikuttavat aina suorittimen tilaan välittömästi), voidaan päätellä, että joko koodi suoritetaan emulaattorissa tai prosessori mitätöi PIQ: n kirjoitettaessa PIQ: een ladattuihin osoitteisiin .
Suorituskyvyn arviointi jonoteorian perusteella
Se oli AK Erlang (1878-1929), joka aluksi suunniteltiin jonon ratkaisuna ruuhkien puhelinliikennettä. Erilaisia jonotusmalleja ehdotetaan reaaliaikaisten jonotusjärjestelmien simuloimiseksi suunnilleen, jotta ne voidaan analysoida matemaattisesti eri suorituskykyvaatimusten perusteella.
Jonotusmalleja voidaan esittää käyttämällä Kendallin merkintätapaa :
- A1/A2/A3/A4
missä:
- A1 on ajanjako kahden saapumisen välillä
- A2 on palveluajan jakauma
- A3 on palvelimien kokonaismäärä
- A4 on järjestelmän kapasiteetti
- M/M/1-malli (Single Queue Single Server/ Markovian ): Tässä mallissa jonon elementtejä palvellaan saapumisjärjestyksessä. Kun otetaan huomioon keskimääräiset saapumis- ja palvelunopeudet, todelliset hinnat vaihtelevat satunnaisesti näiden keskiarvojen ympärillä, joten ne on määritettävä käyttämällä kumulatiivista todennäköisyysjakaumatoimintoa .
- M/M/r -malli : Tämä malli on yleistys perusmallista M/M/1, jossa useita palvelimia toimii rinnakkain. Tällainen malli voi myös mallintaa skenaarioita kärsimättömien käyttäjien kanssa, jotka poistuvat jonosta heti, jos he eivät saa palvelua. Tämä voidaan myös mallintaa käyttämällä Bernoullin prosessia, jossa on vain kaksi tilaa, menestys ja epäonnistuminen. Paras esimerkki tästä mallista on tavalliset lankapuhelinjärjestelmämme.
- M/G/1 -malli (Takacsin rajallinen syöttömalli): Tätä mallia käytetään edistyneiden tapausten analysointiin. Palveluajan jakautuminen ei ole enää Markov -prosessi . Tässä mallissa tarkastellaan tapausta, jossa yksi korjaaja korjaa useamman kuin yhden viallisen koneen. Kaikkien käyttäjien palveluaika kasvaa tässä tapauksessa.
Yleensä sovelluksissa, kuten esimääritetty syöttöjono, M/M/1 -mallia käytetään yleisesti, koska jonotoimintoja on rajoitettu. Tässä mikroprosessorien mukaisessa mallissa käyttäjä suorittaa suoritusyksikön ja palvelin on väyläliitäntäyksikkö.
Ohjejono
Prosessori suorittaa ohjelman noutamalla ohjeet muistista ja suorittamalla ne. Yleensä suorittimen suoritusnopeus on paljon nopeampi kuin muistin käyttönopeus. Käskyjonoa käytetään seuraavien ohjeiden noutamiseen erilliseen puskuriin prosessorin suorittaessa nykyistä käskyä.
Jossa on neljä vaihetta putki , nopeus, jolla ohjeita suoritetaan voi olla jopa nelinkertainen peräkkäistä suorittamista.
Suorittimessa on yleensä kaksi erillistä yksikköä ohjeiden noutamiseen ja ohjeiden suorittamiseen.
Toteuttamalla putken arkkitehtuuri on mahdollista vain, jos väyläliitäntäyksikön ja suoritusyksikön ovat riippumattomia. Kun suoritusyksikkö purkaa tai suorittaa käskyn, joka ei vaadi käyttöä tietojen ja osoite linja , väylän liitäntäyksikkö hakee käskyn operaatiokoodia muistista.
Tämä prosessi on paljon nopeampi kuin osoitteen lähettäminen, opcode -koodin lukeminen ja sen purkaminen ja suorittaminen. Seuraavan käskyn hakemista nykyisen käskyn dekoodauksen tai suorittamisen aikana kutsutaan pipeliningiksi.
8086 arkkitehtuuri on kuuden tavun prefetch opetusta putki, kun taas 8088 on nelitavuiseksi maaherra. Kun suoritusyksikkö suorittaa nykyistä käskyä, väyläliitäntäyksikkö lukee muistista etukäteen enintään kuusi (tai neljä) tavua opcodeja. Jonon pituudet valittiin simulaatiotutkimusten perusteella.
Poikkeus ilmenee, kun suoritusyksikkö kohtaa haarakäskyn eli hyppy- tai kutsukäskyn. Tässä tapauksessa koko jono on tyhjennettävä ja käskyn osoittama sisältö on haettava muistista.
Haitat
Suorittimet, jotka toteuttavat käskyjonon esilatausalgoritmin, ovat teknisesti melko kehittyneitä. Tällaisten prosessorien CPU -suunnittelutason monimutkaisuus on paljon korkeampi kuin tavallisilla prosessoreilla. Tämä johtuu pääasiassa tarpeesta ottaa käyttöön kaksi erillistä yksikköä, BIU ja EU , jotka toimivat erikseen.
Näiden sirujen monimutkaisuuden kasvaessa myös kustannukset kasvavat. Nämä suorittimet ovat suhteellisen kalliimpia kuin vastaavat ilman esisyöttöjonoa.
Nämä haitat kuitenkin kompensoivat suuresti prosessorin suoritusajan paraneminen. Kun esikäsittelyohjejono on otettu käyttöön 8086 -prosessorissa, kaikki peräkkäiset prosessorit ovat sisällyttäneet tämän ominaisuuden.
x86 esimerkkikoodi
code_starts_here:
mov bx, ahead
mov word ptr cs:[bx], 9090h
ahead:
jmp near to_the_end
; Some other code
to_the_end:
Tämä itse muuttuva ohjelma korvaa jmp: n_the_end kahdella NOP: lla (joka on koodattu muodossa 0x9090 ). Hyppy jmp lähellä to_the_end on koottu kahteen tavuun konekoodia, joten kaksi NOP: ta vain korvaavat tämän hyppyn eikä mitään muuta. (Eli hyppy korvataan tekemättä-koodilla.)
Koska hyppykonekoodi on jo luettu PIQ: een ja luultavasti myös suorittimen suorittama ( superskalaariset suorittimet suorittavat useita ohjeita kerralla, mutta he "teeskentelevät", että eivät, koska ne tarvitsevat taaksepäin yhteensopivuutta ), koodin muutos ei muuta suorituksen kulkua.
Esimerkkiohjelma koon havaitsemiseksi
Tämä on esimerkki NASM - syntaksi itse muuttuva x86 - kokoonpanokielen algoritmi, joka määrittää PIQ: n koon:
code_starts_here:
xor bx, bx ; zero register bx
xor ax, ax ; zero register ax
mov dx, cs
mov [code_segment], dx ; "calculate" codeseg in the far jump below (edx here too)
around:
cmp ax, 1 ; check if ax has been altered
je found_size
; 0x90 = opcode "nop" (NO oPeration)
mov byte [nop_field+bx], 0x90
inc bx
db 0xEA ; 0xEA = opcode "far jump"
dw flush_queue ; should be followed by offset (rm = "dw", pm = "dd")
code_segment:
dw 0 ; and then the code segment (calculated above)
flush_queue:
; 0x40 = opcode "inc ax" (INCrease ax)
mov byte [nop_field+bx], 0x40
nop_field:
times 256 nop
jmp around
found_size:
;
; register bx now contains the size of the PIQ
; this code is for [[real mode]] and [[16-bit protected mode]], but it could easily be changed into
; running for [[32-bit protected mode]] as well. just change the "dw" for
; the offset to "dd". you need also change dx to edx at the top as
; well. (dw and dx = 16 bit addressing, dd and edx = 32 bit addressing)
;
Tämä koodi tekee pohjimmiltaan sen, että se muuttaa suoritusvirtaa ja määrittää raa'alla voimalla kuinka suuri PIQ on. "Kuinka kaukana minun on vaihdettava edessäni oleva koodi, jotta se vaikuttaisi minuun?" Jos se on liian lähellä (se on jo PIQ: ssa), päivityksellä ei ole vaikutusta. Jos se on tarpeeksi kaukana, koodin muutos vaikuttaa ohjelmaan ja ohjelma on sitten löytänyt suorittimen PIQ -koon. Jos tätä koodia suoritetaan moniajo -käyttöjärjestelmässä, kontekstikytkin voi johtaa väärään arvoon.