Yleisesti ottaen kaikki suorittimet, yhden sirun mikroprosessorit tai monisirutoteutukset, suorittavat ohjelmia suorittamalla seuraavat vaiheet:
- Lue ohje ja purkaa se.
- Etsitään kaikki liitännäistiedot, joita tarvitaan käskyn käsittelyyn.
- Käsittele ohje.
- Kirjoita tulokset ylös.
Tätä yksinkertaiselta näyttävää vaihesarjaa vaikeuttaa se, että muistihierarkia, johon kuuluvat välimuisti, keskusmuisti ja haihtumaton tallennus, kuten kiintolevyt, (jossa ohjelmakäskyt ja tiedot ovat) on aina ollut hitaampi kuin itse prosessori. Vaihe (2) aiheuttaa usein viiveen (prosessorin termein usein "sakkaus"), kun tiedot saapuvat tietokoneen väylän kautta. Paljon on tutkittu malleja, joissa näitä viiveitä vältetään mahdollisimman paljon. Vuosien mittaan suunnittelun keskeisenä tavoitteena on ollut useampien käskyjen suorittaminen rinnakkain, mikä lisää ohjelman tehokasta suoritusnopeutta. Näissä pyrkimyksissä otettiin käyttöön monimutkaisia logiikka- ja piirirakenteita. Aiemmin tällaisia tekniikoita voitiin toteuttaa vain kalliissa suurtietokoneissa tai supertietokoneissa, koska tekniikoiden toteuttamiseen tarvittiin paljon piirirakenteita. Puolijohdevalmistuksen kehittyessä yhä useammat näistä tekniikoista voitiin toteuttaa yhdellä puolijohdesirulla.
Seuraavassa esitellään mikroarkkitehtuuritekniikoita, jotka ovat yleisiä nykyaikaisissa suorittimissa.
Ohjekokonaisuuden valinta
Käskykanta-arkkitehtuurin valinta vaikuttaa suuresti suorituskykyisten laitteiden toteuttamisen monimutkaisuuteen. Vuosien mittaan tietokoneiden suunnittelijat ovat tehneet parhaansa yksinkertaistaakseen käskykokonaisuuksia, jotta suorituskykyisempiä toteutuksia voitaisiin toteuttaa säästämällä suunnittelijoiden vaivaa ja aikaa suorituskykyä parantaviin ominaisuuksiin sen sijaan, että ne tuhlattaisiin käskykokonaisuuden monimutkaisuuteen.
Käskykokonaisuuksien suunnittelu on kehittynyt CISC-, RISC-, VLIW- ja EPIC-tyypeistä. Datan rinnakkaisuutta käsitteleviin arkkitehtuureihin kuuluvat SIMD ja vektorit.
Käskyjen putkijohtaminen
Yksi ensimmäisistä ja tehokkaimmista tekniikoista suorituskyvyn parantamiseksi on komentoputken käyttö. Varhaisissa prosessorimalleissa kaikki edellä mainitut vaiheet suoritettiin yhdessä käskyssä ennen seuraavaan siirtymistä. Suuri osa prosessoripiireistä jätettiin toimettomaksi yksittäisen vaiheen aikana; esimerkiksi käskyn dekoodauspiiri oli toimettomana suorituksen aikana ja niin edelleen.
Suoratoistoputket parantavat suorituskykyä, koska niiden avulla useat käskyt kulkevat prosessorin läpi samanaikaisesti. Samassa perusesimerkissä prosessori aloittaisi uuden käskyn dekoodauksen (vaihe 1) edellisen käskyn odottaessa tuloksia. Tämä mahdollistaisi sen, että jopa neljä ohjetta olisi "lennossa" samanaikaisesti, jolloin prosessori näyttäisi neljä kertaa nopeammalta. Vaikka yksittäisen käskyn suorittaminen kestää yhtä kauan (vaiheita on edelleen neljä), prosessori kokonaisuutena "vetäytyy" käskyistä paljon nopeammin ja sitä voidaan käyttää paljon suuremmalla kellotaajuudella.
Välimuisti
Sirujen valmistuksen parantuminen mahdollisti sen, että samalle sirulle voitiin sijoittaa enemmän piiriä, ja suunnittelijat alkoivat etsiä tapoja käyttää niitä. Yksi yleisimmistä tavoista oli lisätä piirille yhä enemmän välimuistia. Välimuisti on erittäin nopeaa muistia, muistia, jota voidaan käyttää muutamassa syklissä verrattuna siihen, mitä tarvitaan keskusmuistin kanssa keskustelemiseen. CPU sisältää välimuistiohjaimen, joka automatisoi lukemisen ja kirjoittamisen välimuistista. Jos tieto on jo välimuistissa, se vain "ilmestyy", kun taas jos se ei ole, prosessori "pysähtyy", kun välimuistiohjain lukee sen sisään.
RISC-malleissa välimuistia alettiin lisätä 1980-luvun puolivälissä tai lopussa, usein vain 4 kilotavua. Määrä kasvoi ajan mittaan, ja tyypillisissä suorittimissa on nykyään noin 512 kilotavua, kun taas tehokkaammissa suorittimissa on 1 tai 2 tai jopa 4, 6, 8 tai 12 megatavua, jotka on järjestetty muistihierarkian eri tasoille. Yleisesti ottaen enemmän välimuistia tarkoittaa enemmän nopeutta.
Kätköt ja putkistot sopivat täydellisesti yhteen. Aikaisemmin ei ollut kovin järkevää rakentaa putkistoa, joka toimisi nopeammin kuin piirin ulkopuolisen käteismuistin käyttöviive. Kun sen sijaan käytettiin piirin sisäistä välimuistia, putkilinja pystyi toimimaan välimuistin käyttölatenssin nopeudella, joka on paljon pienempi aika. Tämä mahdollisti sen, että prosessoreiden toimintataajuudet kasvoivat paljon nopeammin kuin sirun ulkopuolisen muistin toimintataajuudet.
Haarautumisen ennakointi ja spekulatiivinen suoritus
Putkilinjan pysähtymiset ja haarojen aiheuttamat tyhjennykset ovat kaksi tärkeintä tekijää, jotka estävät suorituskyvyn parantamisen käskytason rinnakkaistamisen avulla. Siitä hetkestä, kun prosessorin käskyn dekooderi on havainnut, että se on kohdannut ehdollisen haarautumiskäskyn, siihen hetkeen, kun ratkaiseva hyppyrekisterin arvo voidaan lukea, putkisto saattaa pysähtyä useiksi sykleiksi. Keskimäärin joka viides suoritettu käsky on haarautuminen, joten viivytyksen määrä on suuri. Jos haarautuminen tapahtuu, tilanne on vielä pahempi, koska silloin kaikki putkessa olleet seuraavat ohjeet on tyhjennettävä.
Haaraennusteiden ja spekulatiivisen suorituksen kaltaisia tekniikoita käytetään vähentämään näitä haarakohtaisia rangaistuksia. Haarojen ennustamisessa laitteisto tekee valistuneita arvauksia siitä, tehdäänkö tietty haara. Arvauksen perusteella laitteisto voi hakea käskyjä etukäteen odottamatta rekisterin lukemista. Spekulatiivinen suoritus on lisäparannus, jossa ennustettua polkua pitkin kulkeva koodi suoritetaan ennen kuin tiedetään, pitäisikö haara ottaa vai ei.
Järjestyksen ulkopuolinen suoritus
Välimuistien lisääminen vähentää päämuistihierarkiasta haettavien tietojen odottamisesta johtuvien pysähdysten taajuutta tai kestoa, mutta ei poista niitä kokonaan. Varhaisissa malleissa välimuistin puuttuminen pakotti välimuistiohjaimen pysäyttämään prosessorin ja odottamaan. Ohjelmassa voi tietysti olla jokin muu käsky, jonka tiedot ovat käytettävissä välimuistissa kyseisellä hetkellä. Järjestyksen ulkopuolinen suoritus mahdollistaa sen, että tämä valmis käsky voidaan käsitellä, kun vanhempi käsky odottaa välimuistissa, ja järjestelee sitten tulokset uudelleen, jotta näyttäisi siltä, että kaikki tapahtui ohjelmoidussa järjestyksessä.
Superskalaarinen
Vaikka edellä kuvattujen käsitteiden tukemiseen tarvittiin lisää monimutkaisuutta ja portteja, puolijohdevalmistuksen parannukset mahdollistivat pian entistä useampien logiikka-porttien käytön.
Yllä olevassa hahmotelmassa prosessori käsittelee yhden käskyn osia kerrallaan. Tietokoneohjelmat voitaisiin suorittaa nopeammin, jos useita ohjeita käsiteltäisiin samanaikaisesti. Tämä saavutetaan superskalaarisilla prosessoreilla, jotka monistavat toiminnallisia yksiköitä, kuten ALU:ita. Toiminnallisten yksiköiden monistaminen tuli mahdolliseksi vasta, kun integroitujen piirien (joita joskus kutsutaan "die"-piireiksi) pinta-ala ei enää ylittänyt sen rajaa, mitä voitiin luotettavasti valmistaa. 1980-luvun lopulla markkinoille alkoi tulla superskalaarisia malleja.
Nykyaikaisissa malleissa on tavallista, että niissä on kaksi latausyksikköä, yksi tallennusyksikkö (monissa käskyissä ei ole tallennettavia tuloksia), kaksi tai useampia kokonaislukuyksiköitä, kaksi tai useampia liukulukuyksiköitä ja usein jonkinlainen SIMD-yksikkö. Käskyjen antamislogiikka monimutkaistuu lukemalla valtava luettelo käskyjä muistista ja jakamalla ne eri suoritusyksiköille, jotka ovat sillä hetkellä käyttämättömiä. Tulokset kerätään sitten yhteen ja järjestetään uudelleen lopussa.
Rekisterin uudelleennimeäminen
Rekisterien uudelleennimeämisellä tarkoitetaan tekniikkaa, jota käytetään välttämään ohjelman ohjeiden tarpeetonta sarjamuotoista suorittamista, koska kyseiset ohjeet käyttävät samoja rekistereitä uudelleen. Oletetaan, että meillä on kaksi ryhmää ohjeita, jotka käyttävät samaa rekisteriä, yksi ohjejoukko suoritetaan ensin, jotta rekisteri jää toiselle joukolle, mutta jos toiselle joukolle osoitetaan toinen samanlainen rekisteri, molemmat ohjejoukot voidaan suorittaa rinnakkain.
Moniprosessointi ja monisäikeistäminen
Koska CPU:n toimintataajuuden ja DRAM-muistin käyttöaikojen välinen ero kasvoi, yksikään tekniikka, jolla parannetaan käskytason rinnakkaisuutta (ILP) yhden ohjelman sisällä, ei pystynyt poistamaan pitkiä viiveitä, joita esiintyi, kun tietoja piti hakea keskusmuistista. Lisäksi kehittyneempien ILP-tekniikoiden edellyttämät suuret transistorimäärät ja korkeat toimintataajuudet edellyttivät tehonhäviötasoja, joita ei enää voitu jäähdyttää halvalla. Näistä syistä uudemmat tietokonesukupolvet ovat alkaneet hyödyntää korkeampia rinnakkaistasoja, jotka ovat olemassa yksittäisen ohjelman tai ohjelmasäikeen ulkopuolella.
Tämä suuntaus tunnetaan joskus nimellä "throughput computing". Tämä ajatus sai alkunsa suurtietokonemarkkinoilta, joilla verkkotapahtumien käsittelyssä korostettiin yhden tapahtuman suoritusnopeuden lisäksi kykyä käsitellä suuria määriä tapahtumia samanaikaisesti. Koska tapahtumapohjaiset sovellukset, kuten verkon reititys ja verkkosivujen palveleminen, ovat lisääntyneet huomattavasti viime vuosikymmenen aikana, tietokoneteollisuus on painottanut uudelleen kapasiteetti- ja läpimenokysymyksiä.
Rinnakkaistoiminnot voidaan toteuttaa muun muassa moniprosessorijärjestelmien eli tietokonejärjestelmien avulla, joissa on useita suorittimia. Aikaisemmin tämä oli varattu huippuluokan suurteholaskentajärjestelmille, mutta nykyään pienimuotoiset (2-8) moniprosessoripalvelimet ovat yleistyneet pienyritysten markkinoilla. Suurissa yrityksissä suuret (16-256) moniprosessorit ovat yleisiä. Jopa monisuorittimilla varustettuja henkilökohtaisia tietokoneita on ilmestynyt 1990-luvulta lähtien.
Puolijohdetekniikan kehitys on pienentänyt transistorien kokoa, ja on ilmestynyt moniydinsuoritinyksiköitä, joissa useita suoritinyksiköitä on toteutettu samalla piipiirillä. Alun perin niitä käytettiin sulautetuille markkinoille suunnatuissa siruissa, joissa yksinkertaisemmat ja pienemmät suorittimet mahdollistivat useiden suoritinten sijoittamisen yhdelle piikappaleelle. Vuoteen 2005 mennessä puolijohdeteknologia mahdollisti kahden huippuluokan työpöytäprosessorin CMP-sirujen valmistamisen volyyminä. Joissakin malleissa, kuten UltraSPARC T1:ssä, käytettiin yksinkertaisempia (skalaarisia, in-order) malleja, jotta useampi prosessori saatiin mahtumaan yhdelle piikappaleelle.
Viime aikoina toinen tekniikka, josta on tullut yhä suositumpi, on monisäikeistäminen. Monisäikeistämisessä prosessorin on haettava dataa hitaasta järjestelmämuistista, mutta sen sijaan, että se odottaisi datan saapumista, prosessori vaihtaa toiseen ohjelmaan tai ohjelmasäikeeseen, joka on valmis suoritettavaksi. Vaikka tämä ei nopeuta tiettyä ohjelmaa tai säiettä, se lisää järjestelmän yleistä läpäisykykyä vähentämällä prosessorin joutokäyntiaikaa.
Käsitteellisesti monisäikeistäminen vastaa käyttöjärjestelmän tasolla kontekstinvaihtoa. Erona on se, että monisäikeinen suoritin voi tehdä säikeenvaihdon yhdessä prosessorisyklissä sen sijaan, että kontekstinvaihto vaatisi yleensä satoja tai tuhansia prosessorisyklejä. Tämä saavutetaan kopioimalla tilalaitteisto (kuten rekisteritiedosto ja ohjelmalaskuri) kutakin aktiivista säiettä varten.
Toinen parannus on samanaikainen monisäikeistäminen. Tämän tekniikan avulla superskaaliset suorittimet voivat suorittaa eri ohjelmien/säikeiden ohjeita samanaikaisesti samassa syklissä.