Üldiselt käivitavad kõik protsessorid, ühe kiibiga mikroprotsessorid või mitme kiibiga rakendused programme, sooritades järgmisi samme:
- Lugege juhendit ja dekodeerige see.
- Leidke kõik seotud andmed, mis on vajalikud käsu töötlemiseks.
- Töötle käsk.
- Kirjutage tulemused välja.
Seda lihtsa välimusega sammude seeriat raskendab asjaolu, et mäluhierarhia, mis hõlmab vahemälu, põhimälu ja mittepüsivaid mälusid, nagu kõvakettad, (kus on programmi käsud ja andmed) on alati olnud aeglasem kui protsessor ise. Samm (2) toob sageli kaasa viivituse (mida protsessori mõistes nimetatakse sageli "takistuseks"), kuni andmed jõuavad arvutibussi kaudu kohale. Palju on uuritud projekte, mis väldivad neid viivitusi nii palju kui võimalik. Aastate jooksul oli keskne projekteerimise eesmärk täita rohkem käske paralleelselt, suurendades seeläbi programmi tegelikku täitmiskiirust. Nende jõupingutuste käigus võeti kasutusele keerulised loogika- ja ahelastruktuurid. Varem sai selliseid tehnikaid rakendada ainult kallitel suurarvutitel või superarvutitel, kuna nende tehnikate jaoks oli vaja palju vooluahelaid. Pooljuhtide tootmise arenedes sai üha rohkem selliseid tehnikaid rakendada ühel pooljuhtkiibil.
Järgnevalt antakse ülevaade mikroarhitektuurilistest tehnikatest, mis on tänapäeva protsessorites levinud.
Käskude komplekti valik
Valik, millist käsureaarhitektuuri kasutada, mõjutab oluliselt suure jõudlusega seadmete rakendamise keerukust. Aastate jooksul andsid arvutite projekteerijad endast parima, et lihtsustada käsukomplekte, et võimaldada suurema jõudlusega rakendusi, säästes projekteerijate vaeva ja aega jõudlust parandavate funktsioonide jaoks, selle asemel et raisata neid käsukomplekti keerukusele.
Käskude komplekti disain on arenenud CISC, RISC, VLIW, EPIC tüüpi. Arhitektuurid, mis tegelevad andmete paralleelsusega, hõlmavad SIMD ja vektoreid.
Käskude pipelining
Üks esimesi ja kõige võimsamaid tehnikatest jõudluse parandamiseks on käsujuhtme kasutamine. Varajased protsessori disainilahendused viisid kõik eespool nimetatud sammud läbi ühe käsuga, enne kui läksid edasi järgmise käsu juurde. Suur osa protsessori vooluahelast jäeti iga sammu ajal kasutamata; näiteks käsu dekodeerimise vooluahel oli täitmisel kasutamata jne.
Pipeliinid parandavad jõudlust, võimaldades mitmel käsul korraga läbi protsessori töötada. Samas põhinäites hakkaks protsessor dekodeerima (samm 1) uut käsku, samal ajal kui viimane käsk ootab tulemusi. See võimaldaks korraga "lennata" kuni neli käsku, muutes protsessori neli korda kiiremaks. Kuigi iga üks käsk võtab sama kaua aega (endiselt on neli sammu), "loobub" protsessor tervikuna käskudest palju kiiremini ja saab töötada palju suurema taktimõõduga.
Cache
Kiipide tootmise täiustumine võimaldas paigutada samale kiibile rohkem vooluahelaid ja disainerid hakkasid otsima võimalusi nende kasutamiseks. Üks levinumaid viise oli kiibile üha suurema vahemälu lisamine. Vahemälu on väga kiire mälu, mälu, millele saab ligi mõne tsükliga, võrreldes sellega, mida on vaja põhimäluga suhtlemiseks. Protsessor sisaldab vahemälukontrollerit, mis automatiseerib vahemälu lugemise ja kirjutamise, kui andmed on juba vahemälus, siis need lihtsalt "ilmuvad", kui aga ei ole, siis protsessor "peatub", kuni vahemälukontroller need sisse loeb.
RISC-konstruktsioonides hakati vahemälu lisama 1980. aastate keskel ja lõpus, sageli ainult 4 KB ulatuses. See arv kasvas aja jooksul ja nüüd on tüüpilistel protsessoritel umbes 512 KB, samas kui võimsamatel protsessoritel on 1 või 2 või isegi 4, 6, 8 või 12 MB, mis on organiseeritud mitmetasandilise mäluhierarhia alusel. Üldiselt tähendab suurem vahemälu suuremat kiirust.
Käkid ja torujuhtmed sobisid ideaalselt kokku. Varem ei olnud palju mõtet ehitada torujuhtmeid, mis töötaksid kiiremini kui kiibivälise kassamälu ligipääsu latentsus. Kiibil oleva vahemälu kasutamine selle asemel tähendas, et torujuhtme sai töötada vahemälu juurdepääsu latentsuse kiirusega, mis on palju väiksem aeg. See võimaldas protsessorite töösagedusi suurendada palju kiiremini kui kiibivälise mälu puhul.
Haru prognoosimine ja spekulatiivne täitmine
Kaks peamist asja, mis takistavad suurema jõudluse saavutamist käsu tasandil paralleelsuse abil, on torujuhtme seisakud ja hargnemised. Alates ajast, mil protsessori käsu dekooder on avastanud, et ta on sattunud tingimusliku hargnemiskäsu peale, kuni ajani, mil saab välja lugeda otsustava hüpperegistri väärtuse, võib torujuhtme töö seiskuda mitu tsüklit. Keskmiselt on iga viies täidetav käsk hargnemine, seega on see suur aeglustumise hulk. Kui hargnemine toimub, on see veelgi hullem, sest siis tuleb kõik järgnevad käsud, mis olid torujuhtmes, kustutada.
Selliste hargnemiskaristuste vähendamiseks kasutatakse selliseid tehnikaid nagu hargnemiste ennustamine ja spekulatiivne täitmine. Hargnemiste ennustamine tähendab, et riistvara teeb haritud oletusi selle kohta, kas konkreetne hargnemine toimub. Arvatakse, et riistvara saab käsklusi ette tellida, ilma et ootaks registri lugemist. Spekulatiivne täitmine on täiendav täiustus, mille puhul täidetakse koodi mööda prognoositud teed enne, kui on teada, kas hargnemine peaks toimuma või mitte.
Järjekorras mittekohane täitmine
Vahemälu lisamine vähendab peamäluhierarhiast andmete kättesaamise ootamisest tulenevate seisakute sagedust või kestust, kuid ei kõrvalda neid seisakuid täielikult. Varasemate projektide puhul sundis vahemälu puudumine vahemälu kontrollerit protsessorit peatama ja ootama. Loomulikult võib programmis olla mõni teine käsk, mille andmed on sel hetkel vahemälus saadaval. Väljaspool järjekorda täitmine võimaldab seda valmis käsku töödelda, samal ajal kui vanem käsk ootab vahemälus, ning seejärel järjestab tulemused ümber, et näeks, et kõik toimus programmeeritud järjekorras.
Superskalaarne
Isegi kui eespool kirjeldatud kontseptsioonide toetamiseks oli vaja lisakomplekssust ja -väravaid, võimaldas pooljuhtide tootmise täiustamine peagi kasutada veelgi rohkem loogikaväravaid.
Ülaltoodud visandis töötleb protsessor ühe käsu osa korraga. Arvutiprogramme saaks kiiremini täita, kui mitut käsku korraga töödelda. Seda saavutavadki superskalaarsed protsessorid, kordistades funktsionaalseid üksusi, näiteks ALUsid. Funktsionaalsete üksuste paljundamine sai võimalikuks alles siis, kui integreeritud vooluahela (mida mõnikord nimetatakse ka "die") pindala ei ületanud enam usaldusväärselt valmistatava protsessori piire. 1980ndate lõpus hakkasid turule jõudma superskalaarsed protsessorid.
Kaasaegsetes disainilahendustes on tavaline, et leidub kaks laadimisüksust, üks salvestusüksus (paljudel käskudel ei ole salvestatavaid tulemusi), kaks või enam täisarvu matemaatikaseadet, kaks või enam ujukomaüksust ja sageli ka mingi SIMD-üksus. Käskude väljastamise loogika muutub üha keerulisemaks, lugedes mälust sisse tohutu hulga käskude nimekirja ja andes need edasi erinevatele täitmisüksustele, mis on sel hetkel kasutuseta. Seejärel kogutakse tulemused kokku ja järjestatakse lõpus uuesti.
Registri ümbernimetamine
Registrite ümbernimetamine viitab tehnikale, mida kasutatakse selleks, et vältida programmi käskude mittevajalikku järjestikust täitmist, kuna need käsud kasutavad samu registreid uuesti. Oletame, et meil on kaks gruppi juhiseid, mis kasutavad sama registrit, üks käsukomplekt täidetakse esimesena, et jätta register teisele komplektile, kuid kui teine komplekt on määratud teisele sarnasele registrile, saab mõlemat käsukomplekti paralleelselt täita.
Mitmeprotsessorlus ja mitmikprotsessorlus
Kuna protsessori töösageduse ja DRAMi ligipääsuaegade vahel on üha suurem vahe, ei suutnud ükski tehnikatest, mis suurendavad käsu-tasandi paralleelsust (ILP) ühe programmi sees, ületada pikki seisakuid (viivitusi), mis tekkisid siis, kui andmeid tuli põhimälust välja võtta. Lisaks sellele nõudsid täiustatud ILP-tehnika jaoks vajalikud suured transistorite arvud ja kõrged töösagedused energiatarbimise taset, mida ei saanud enam odavalt jahutada. Nendel põhjustel on uuemate põlvkondade arvutid hakanud kasutama kõrgemaid paralleelsuse tasemeid, mis eksisteerivad väljaspool ühte programmi või programmiliini.
Seda suundumust nimetatakse mõnikord "läbilaskevõimeliseks arvutuseks". See idee sai alguse suurarvutite turult, kus veebipõhine tehingutöötlus ei rõhutanud mitte ainult ühe tehingu täitmise kiirust, vaid võimet käsitleda suurt hulka tehinguid korraga. Kuna tehingupõhised rakendused, nagu võrgu marsruutimine ja veebisaitide teenindamine, on viimasel kümnendil oluliselt kasvanud, on arvutitööstus taas rõhutanud läbilaskevõime ja läbilaskevõime küsimusi.
Üks meetod, kuidas seda paralleelsust saavutada, on mitme protsessoriga arvutisüsteemid. Varem oli see reserveeritud kõrgekvaliteediliste suurarvutite jaoks, kuid nüüd on väikeettevõtete turul levinud väikesemahulised (2-8) mitme protsessoriga serverid. Suurettevõtete jaoks on levinud suuremahulised (16-256) multiprotsessorid. Alates 1990ndatest aastatest on ilmunud isegi mitme protsessoriga personaalarvutid.
Edusammud pooljuhttehnoloogias vähendasid transistori suurust; on ilmunud mitmetuumalised protsessorid, kus mitu protsessorit on rakendatud samal ränikiibil. Esialgu kasutati neid kiipides, mis olid suunatud manussüsteemide turgudele, kus lihtsamad ja väiksemad protsessorid võimaldasid mitme instantsi mahutamist ühele ränitükile. Aastaks 2005 võimaldas pooljuhttehnoloogia toota suures mahus kahte tipptasemel lauaarvutite CMP-kiipi. Mõnes konstruktsioonis, näiteks UltraSPARC T1, kasutati lihtsamaid (skalaarseid, järjestatud) konstruktsioone, et ühele ränitükile mahuks rohkem protsessoreid.
Viimasel ajal on populaarsemaks muutunud veel üks tehnika, milleks on multitöötlus. Mitmesideseeria puhul, kui protsessor peab aeglasest süsteemimälust andmeid hankima, siis selle asemel, et oodata andmete saabumist, lülitub protsessor teise programmi või programmiliini, mis on valmis täitma. Kuigi see ei kiirenda konkreetset programmi/niiti, suurendab see süsteemi üldist läbilaskevõimet, vähendades protsessori tühikäigu aega.
Kontseptuaalselt on multithreading samaväärne kontekstivahetusega operatsioonisüsteemi tasandil. Erinevus seisneb selles, et mitmikeeruline protsessor saab teha niidivahetuse ühe protsessoritsükliga, mitte sadade või tuhandete protsessoritsüklitega, mida kontekstivahetuse tegemine tavaliselt nõuab. See saavutatakse riistvara (näiteks registrifaili ja programmiloenduri) kordamise teel iga aktiivse niidi jaoks.
Täiendav täiustus on samaaegne mitmikeeramine. See tehnika võimaldab superskalaarsetel protsessoritel üheaegselt ja samas tsüklis täita erinevate programmide/niitide käske.