Vo všeobecnosti všetky CPU, jednočipové mikroprocesory alebo viacčipové implementácie spúšťajú programy vykonávaním nasledujúcich krokov:
- Prečítajte si inštrukciu a dekódujte ju.
- Nájdite všetky súvisiace údaje, ktoré sú potrebné na spracovanie pokynu.
- Spracujte pokyn.
- Výsledky si zapíšte.
Túto na prvý pohľad jednoduchú sériu krokov komplikuje skutočnosť, že hierarchia pamäte, ktorá zahŕňa vyrovnávaciu pamäť, hlavnú pamäť a nevolatilné úložisko, ako sú pevné disky (kde sa nachádzajú inštrukcie programu a údaje), bola vždy pomalšia ako samotný procesor. Krok (2) často prináša oneskorenie (v terminológii procesora často nazývané "stall"), kým dáta dorazia na počítačovú zbernicu. Veľké množstvo výskumu sa venovalo návrhom, ktoré sa týmto oneskoreniam čo najviac vyhýbajú. V priebehu rokov bolo hlavným cieľom návrhu vykonávať viac inštrukcií paralelne, čím sa zvýšila efektívna rýchlosť vykonávania programu. Tieto snahy zaviedli komplikované logické a obvodové štruktúry. V minulosti sa takéto techniky mohli implementovať len na drahých mainframoch alebo superpočítačoch vzhľadom na množstvo obvodov potrebných pre tieto techniky. S rozvojom výroby polovodičov sa čoraz viac týchto techník dalo implementovať na jednom polovodičovom čipe.
Nasleduje prehľad mikroarchitektonických techník, ktoré sú bežné v moderných procesoroch.
Výber súboru inštrukcií
Výber architektúry inštrukčnej sady, ktorá sa má použiť, výrazne ovplyvňuje zložitosť implementácie vysokovýkonných zariadení. V priebehu rokov sa konštruktéri počítačov snažili čo najviac zjednodušiť inštrukčné sady, aby umožnili implementáciu vyšších výkonov tým, že ušetrili úsilie a čas konštruktérov na funkcie, ktoré zvyšujú výkon, namiesto toho, aby ich premrhali na zložitosť inštrukčnej sady.
Návrh inštrukčnej sady prešiel od typov CISC, RISC, VLIW, EPIC. Medzi architektúry, ktoré sa zaoberajú dátovým paralelizmom, patria SIMD a vektory.
Potrubné spájanie inštrukcií
Jednou z prvých a najúčinnejších techník na zvýšenie výkonu je použitie inštrukčnej pipeline. Pri prvých návrhoch procesorov sa všetky vyššie uvedené kroky vykonávali na jednej inštrukcii pred prechodom na ďalšiu. Veľká časť obvodov procesora zostávala v každom kroku nečinná; napríklad obvody dekódovania inštrukcií by boli počas vykonávania nečinné atď.
Potrubia zvyšujú výkon tým, že umožňujú, aby procesorom prechádzalo viacero inštrukcií súčasne. V tom istom základnom príklade by procesor začal dekódovať (krok 1) novú inštrukciu, zatiaľ čo posledná by čakala na výsledky. To by umožnilo "rozbehnúť" až štyri inštrukcie naraz, vďaka čomu by procesor vyzeral štyrikrát rýchlejšie. Hoci dokončenie každej jednej inštrukcie trvá rovnako dlho (stále sú to štyri kroky), procesor ako celok "odstupuje" inštrukcie oveľa rýchlejšie a môže bežať na oveľa vyššej taktovacej frekvencii.
Cache
Zlepšenia vo výrobe čipov umožnili umiestniť na jeden čip viac obvodov a konštruktéri začali hľadať spôsoby, ako ich využiť. Jedným z najbežnejších spôsobov bolo pridávanie stále väčšieho množstva vyrovnávacej pamäte na čip. Cache je veľmi rýchla pamäť, pamäť, ku ktorej sa dá pristupovať za niekoľko cyklov v porovnaní s tým, čo je potrebné na komunikáciu s hlavnou pamäťou. Procesor obsahuje radič vyrovnávacej pamäte, ktorý automatizuje čítanie a zápis z vyrovnávacej pamäte, ak sa údaje už nachádzajú vo vyrovnávacej pamäti, jednoducho sa "objavia", zatiaľ čo ak nie, procesor sa "zastaví", kým ich radič vyrovnávacej pamäte načíta.
Konštrukcie RISC začali pridávať vyrovnávaciu pamäť v polovici až na konci 80. rokov, často len 4 KB. Tento počet časom narastal a typické procesory majú teraz približne 512 KB, zatiaľ čo výkonnejšie procesory sa dodávajú s 1 alebo 2, či dokonca 4, 6, 8 alebo 12 MB, usporiadanými vo viacerých úrovniach pamäťovej hierarchie. Vo všeobecnosti platí, že väčšia vyrovnávacia pamäť znamená vyššiu rýchlosť.
Cache a pipelines sa k sebe dokonale hodili. Predtým nemalo veľký zmysel vytvárať pipeline, ktorá by mohla pracovať rýchlejšie, ako je latencia prístupu k hotovostnej pamäti mimo čipu. Použitie vyrovnávacej pamäte na čipe namiesto toho znamenalo, že pipeline mohla bežať rýchlosťou prístupovej latencie vyrovnávacej pamäte, teda oveľa kratší čas. To umožnilo zvyšovať pracovné frekvencie procesorov oveľa rýchlejšie, ako je to v prípade pamäte mimo čipu.
Predpovedanie vetiev a špekulatívne vykonávanie
Dve hlavné veci, ktoré bránia dosiahnutiu vyššieho výkonu prostredníctvom paralelizmu na úrovni inštrukcií, sú zasekávanie potrubia a vyprázdňovanie v dôsledku vetvenia. Od okamihu, keď dekodér inštrukcií procesora zistí, že narazil na podmienenú inštrukciu vetvenia, až do okamihu, keď sa môže prečítať rozhodujúca hodnota registra skoku, môže byť pipeline zastavená na niekoľko cyklov. V priemere každá piata vykonaná inštrukcia je vetvenie, takže ide o vysoký počet zdržaní. Ak sa vykoná vetvenie, je to ešte horšie, pretože potom sa musia prepláchnuť všetky nasledujúce inštrukcie, ktoré boli v pipeline.
Na zníženie týchto pokút za vetvenie sa používajú techniky ako predikcia vetiev a špekulatívne vykonávanie. Pri predpovedaní vetiev hardvér odhaduje, či sa určitá vetva vykoná. Tento odhad umožňuje hardvéru prefetchovať inštrukcie bez čakania na čítanie registrov. Špekulatívne vykonávanie je ďalším vylepšením, pri ktorom sa kód pozdĺž predpovedanej cesty vykoná skôr, ako sa zistí, či sa má vetva vykonať alebo nie.
Vykonanie mimo poradia
Pridanie vyrovnávacej pamäte znižuje frekvenciu alebo trvanie prestojov spôsobených čakaním na načítanie údajov z hierarchie hlavnej pamäte, ale týchto prestojov sa úplne nezbaví. V prvých návrhoch by zmeškanie vyrovnávacej pamäte prinútilo radič vyrovnávacej pamäte zastaviť procesor a čakať. Samozrejme, v programe môže byť nejaká iná inštrukcia, ktorej údaje sú v tom momente dostupné v cache. Vykonávanie mimo poradia umožňuje, aby sa táto pripravená inštrukcia spracovala, zatiaľ čo staršia inštrukcia čaká na vyrovnávaciu pamäť, a potom zmení poradie výsledkov, aby sa zdalo, že všetko prebehlo v naprogramovanom poradí.
Superskalárne
Aj napriek všetkej pridanej zložitosti a hradlám potrebným na podporu vyššie uvedených konceptov umožnili zlepšenia vo výrobe polovodičov čoskoro použiť ešte viac logických hradiel.
Vo vyššie uvedenom náčrte procesor spracováva časti jednej inštrukcie naraz. Počítačové programy by sa mohli vykonávať rýchlejšie, keby sa súčasne spracúvalo viac inštrukcií. To sa v superskalárnych procesoroch dosahuje replikáciou funkčných jednotiek, ako sú ALU. Replikácia funkčných jednotiek bola možná až vtedy, keď plocha integrovaného obvodu (niekedy nazývaná "die") jednočlánkového procesora už nepresahovala hranice toho, čo sa dalo spoľahlivo vyrobiť. Koncom 80. rokov 20. storočia sa na trh začali dostávať superskalárne návrhy.
V moderných návrhoch sa bežne vyskytujú dve jednotky načítania, jedna jednotka ukladania (mnohé inštrukcie nemajú žiadne výsledky na ukladanie), dve alebo viac celočíselných matematických jednotiek, dve alebo viac jednotiek s pohyblivou rádovou čiarkou a často aj nejaká jednotka SIMD. Logika vydávania inštrukcií narastá na zložitosti čítaním obrovského zoznamu inštrukcií z pamäte a ich odovzdávaním rôznym vykonávacím jednotkám, ktoré sú v danom okamihu nečinné. Výsledky sa potom na konci zhromaždia a znovu zoradia.
Premenovanie registra
Premenovanie registrov sa vzťahuje na techniku používanú na zabránenie zbytočnému sériovému vykonávaniu programových inštrukcií z dôvodu opakovaného používania tých istých registrov týmito inštrukciami. Predpokladajme, že máme skupiny inštrukcií, ktoré budú používať ten istý register, jedna sada inštrukcií sa vykoná ako prvá, aby sa register prenechal druhej sade, ale ak je druhá sada priradená k inému podobnému registru, obe sady inštrukcií sa môžu vykonávať paralelne.
Multiprocesing a viacvláknové spracovanie
Vzhľadom na rastúci rozdiel medzi pracovnými frekvenciami procesora a prístupovými časmi k pamäti DRAM nemohla žiadna z techník, ktoré zvyšujú paralelizmus na úrovni inštrukcií (ILP) v rámci jedného programu, prekonať dlhé zdržania (oneskorenia), ktoré vznikali pri načítavaní údajov z hlavnej pamäte. Okrem toho veľký počet tranzistorov a vysoké pracovné frekvencie potrebné pre pokročilejšie techniky ILP si vyžadovali úroveň rozptylu energie, ktorú už nebolo možné lacno chladiť. Z týchto dôvodov sa v novších generáciách počítačov začali využívať vyššie úrovne paralelizmu, ktoré existujú mimo jedného programu alebo programového vlákna.
Tento trend sa niekedy označuje ako "priepustné výpočty". Táto myšlienka vznikla na trhu mainframov, kde sa pri online spracovaní transakcií kládol dôraz nielen na rýchlosť vykonania jednej transakcie, ale aj na schopnosť zvládnuť veľké množstvo transakcií súčasne. Vzhľadom na to, že v poslednom desaťročí výrazne vzrástol počet aplikácií založených na transakciách, ako je smerovanie po sieti a obsluha webových stránok, počítačový priemysel opäť zdôraznil otázky kapacity a priepustnosti.
Jednou z techník, ako tento paralelizmus dosiahnuť, sú multiprocesorové systémy, počítačové systémy s viacerými CPU. V minulosti to bolo vyhradené pre špičkové mainframy, ale v súčasnosti sa multiprocesorové servery malého rozsahu (2-8) stali bežnou súčasťou trhu malých podnikov. Pre veľké spoločnosti sú bežné veľké multiprocesory (16 - 256). Od 90. rokov sa objavili dokonca aj osobné počítače s viacerými procesormi.
Pokroky v polovodičovej technológii zmenšili veľkosť tranzistorov; objavili sa viacjadrové procesory, v ktorých je na jednom kremíkovom čipe implementovaných viacero procesorov. Spočiatku sa používali v čipoch zameraných na vstavané trhy, kde jednoduchšie a menšie CPU umožňovali, aby sa na jeden kus kremíka zmestilo viacero inštancií. Do roku 2005 umožnila polovodičová technológia sériovú výrobu dvoch špičkových desktopových CPU čipov CMP. Niektoré návrhy, ako napríklad UltraSPARC T1, používali jednoduchšie (skalárne, v poradí) návrhy, aby sa na jeden kus kremíka zmestilo viac procesorov.
V poslednom čase je čoraz populárnejšia ďalšia technika, ktorou je multithreading. Pri multithreadingu, keď má procesor načítať údaje z pomalej systémovej pamäte, namiesto toho, aby čakal na príchod údajov, procesor sa prepne na iný program alebo programové vlákno, ktoré je pripravené na vykonávanie. Hoci sa tým nezrýchli konkrétny program/vlákno, zvýši sa celková priepustnosť systému tým, že sa skráti čas nečinnosti procesora.
Koncepčne je multithreading ekvivalentný prepínaniu kontextu na úrovni operačného systému. Rozdiel je v tom, že viacvláknový procesor môže prepnúť vlákno za jeden cyklus procesora namiesto stoviek alebo tisícok cyklov procesora, ktoré si prepínanie kontextu zvyčajne vyžaduje. Dosahuje sa to replikáciou stavového hardvéru (napríklad súboru registrov a programového čítača) pre každé aktívne vlákno.
Ďalším vylepšením je simultánny multithreading. Táto technika umožňuje superskalárnym procesorom vykonávať inštrukcie z rôznych programov/vlákien súčasne v tom istom cykle.