Ako funguje procesor. Určené pre stredné školy

Procesor, označovaný aj ako centrálna procesorová jednotka (CPU), je najzákladnejšou a stále najdôležitejšou súčasťou počítača. Ide o tú časť, ktorá spracúva a vykonáva všetky úlohy dané inštrukciami, ktoré sa počítaču zadávajú prostredníctvom kódu programov, súčasne sa k nej rôznymi spôsobmi pripájajú periférne zariadenia, operačná pamäť a úložisko (disk, SSD a predtým napríklad aj pásky). Je to teda naozaj centrálny prvok počítača.

Súčasné procesory sú extrémne zložité a sofistikované: Hĺbkové detaily ich architektúr sú úplne nad rámec tohto článku, ale pokúsime sa tu črty moderných pokročilých CPU a to, ako fungujú, trochu priblížiť.

Prvky jadra

Štruktúra architektúr procesorových jadier je veľmi zložitá a tiež sa často líši. Hlavné prvky jadra sa rozdeľujú do tzv. frontendu a backendu. Frontend zahŕňa vyrovnávaciu pamäť prvej úrovne pre inštrukcie (kód), ktorá je v procesore primárnym miestom, kde je pri spracovaní držaný kód programu. Procesor tento kód načítava (tzv. „fetch“) po inštrukciách či po bloku určitého počtu bajtov, dekóduje („decode“) jednotlivé inštrukcie, čo znamená, že zistí, o akú inštrukciu ide, a potom ju odošle („issue“) na spracovanie ďalej do backendu.

Moderné procesory majú často ešte ďalšiu vyrovnávaciu pamäť (MicroOP či µOP cache), v ktorej sú uložené dekódované inštrukcie pre ďalšie použitie bez toho, aby museli byť dekódované znova.

Backend je časť procesora obsahujúca jednotky na vykonanie inštrukcií. Sú to najmä aritmeticko-logické jednotky (ALU), ktoré vykonávajú väčšinu všeobecných operácií inštrukčnej súpravy. Spolu s nimi sú v jadre aj tzv. Load/Store jednotky. Tie slúžia na načítavanie dát z pamäte (load) alebo ich ukladanie do pamäte (store), prípadne môžu podporovať oba typy operácií. Vedľa týchto jednotiek môžu byť prítomné aj ďalšie, napríklad separátne jednotky iba na spracovanie operácií vetvenia a skokov.

Load/Store jednotky nepracujú priamo s operačnou pamäťou, napojené sú najprv na vyrovnávaciu pamäť prvej úrovne pre dáta a potom vyrovnávaciu pamäť druhej úrovne (a potom tretej), cez ktoré sa dáta eventuálne dostanú do RAM. Vyrovnávacie pamäte prvej a druhej úrovne pre dáta bývajú preto úzko pridružené k Load/Store jednotkám. Tie sa tiež niekedy označujú AGU, čo odkazuje na funkciu generovania adries (Adress Generation Unit) pre potreby operácií s pamäťou.

Dôležitou súčasťou jadra sú registre, ktoré sú úzko prepojené s jednotkami ALU a Load/Store. Registre sú oddielmi špeciálnej pamäte typu SRAM priamo v jadre, do ktorých sa nahrajú z pamäte operandy na ich spracovanie inštrukciami, a z ktorých sa dáta potom zase môžu nahrávať späť do pamäte.

Inštrukcie FPU (x87) a SIMD majú svoje vlastné súpravy registrov a vlastné jednotky na vykonávanie, ku ktorým sú SIMD a x87 registry pripojené. Ide v podstate tiež o ALU, ale také, ktoré sú schopné pracovať jednak s operandmi s plávajúcou rádovou čiarkou, jednak s obsahom SIMD registrov, tvoreným väčším počtom hodnôt naraz—pozri predchádzajúcu kapitolu.

Zjednodušená schéma jadra Zen 5 od AMD (Zdroj: AMD)
Zjednodušená schéma jadra Zen 5 od AMD (Zdroj: AMD)

Optimalizácia spracovania programu

Pôvodná historická koncepcia procesora je taká, že spracováva inštrukcie v poradí, v akom prichádzajú v sekvencii programu, jednu po druhej s tým, že pred začatím ďalšej inštrukcie sa musí počkať na dokončenie predchádzajúcej a zapísanie jej výsledkov. Ide o tzv. „in-order“ spracovanie. Avšak rešpektovanie tejto prirodzenej štruktúry programu by výrazne obmedzovalo výkon a rýchlosť spracovania. Napríklad preto, že niektoré operácie (napríklad delenie) trvajú procesorom mnoho cyklov. Ale najmä preto, že pri spracovávaní programov pomerne často vzniknú prestoje. Ich najčastejším zdrojom je to, že procesor nemá k dispozícii dáta z operačnej pamäte, s ktorými má nasledujúca inštrukcia pracovať a čaká, kým dorazia do vyrovnávacej pamäte a z nej do pracovných registrov.

Aby sa výkon mohol zlepšiť (aby sa mohlo zvýšiť množstvo inštrukcií spracovaných za jednotku času, napríklad za jeden cyklus či na 1 MHz frekvencie—často sa hovorí o tzv. „IPC“, čo pôvodne znamená instructions per cycle), je nevyhnutné vykonávať inštrukcie rýchlejšie a sofistikovanejšie.

Pipelining

Dnes prakticky vždy používanou technikou je, že sa spracovanie inštrukcií rozdeľuje do niekoľkých rôznych krokov (stupňov), ktoré tvoria tzv. pipeline, pričom každý stupeň vykonáva toľko práce, aby sa dalo stihnúť za jeden cyklus hodinového signálu. Touto pipeline postupne prechádzajú inštrukcie programu tak, že keď jedna absolvuje jeden stupeň (N), presunie sa do nasledujúceho (N+1) a do dotyčného stupňa vykonávania N vstúpi inštrukcia nasledujúca.

Pri tomto spôsobe spracovania procesor súčasne spracováva niekoľko inštrukcií naraz, ktorých spracovanie sa prekrýva a každá ďalšia je o cyklus pozadu. Pipelining dovolil výrazne zvýšiť frekvencie CPU, pretože sa zmenšilo množstvo práce, ktoré obvody musia vykonať za jeden cyklus hodinového taktu.

Na ilustráciu, časté stupne pipeline v prvých RISC procesoroch využívajúcich tento princíp boli tieto, tvoriace tzv. klasickú RISC pipeline o piatich stupňoch:

  1. Načítavanie (fetch) inštrukcie ako sekvencie bitov, ktorými je zapísaná v programe, z vyrovnávacej pamäte prvej úrovne pre inštrukcie
  2. Tzv. dekódovanie (decode) inštrukcie, keď procesor z bitov inštrukcie zistí, o akú operáciu ide a aké použije registre, tie sú načítané pre ďalšiu fázu
  3. Vykonanie (execute) inštrukcie, teda samotnej aritmeticko-logickej operácie vykonanej v ALU
  4. Prístup do pamäte (memory access), ak je potrebný
  5. Zápis výsledkov späť do registrov (writeback)

Moderné procesory ale mávajú pipeline dlhšiu s väčším počtom stupňov, do ktorých sú tieto fázy ešte ďalej rozdelené. Väčšie množstvo stupňov, ktoré každý koná menej práce, umožňuje jadru procesora dosiahnuť vyššiu taktovaciu frekvenciu.

Predikcia vetvenia a prefetch

To, že inštrukcie sa začínajú vykonávať nie vtedy, keď sú predchádzajúce inštrukcie hotové, ale okamžite potom, čo sa predchádzajúce iba začnú spracovávať, má vedľa pozitív pre výkon aj svoje nevýhody. Dôsledok je napríklad ten, že ak program narazí na inštrukciu vetvenia, ešte nemusí byť jasné, ktorým smerom sa vykonávanie programu vydá, pretože napríklad operácia IF závisí od hodnoty, ktorú má ešte len dodať práve spracovávaná inštrukcia.

Aby procesor nemusel čakať, boli vyvinuté tzv. prediktory vetvenia. Tie sa snažia predpovedať, ktorým smerom sa vetvenie a podobné operácie v kóde vydajú, a to napríklad na základe predchádzajúceho správania programu (čo funguje dobre pri slučkách v kóde), ale aj na základe rozpoznania iných, zložitejších vzorcov. Keď procesor narazí na inštrukciu vetvenia, prediktor vetvenia dodá predpoveď (špekuláciu), ktorým smerom sa program pravdepodobne vydá (napríklad či skočí na inú adresu, alebo bude pokračovať bez skoku), čo umožňuje okamžite pokračovať v spracovaní.

Nevýhoda je, že v prípade, keď sa po dokončení predošlých inštrukcií zistí, že odhad vetvenia nebol správny, musí procesor zahodiť všetky nasledujúce inštrukcie a výsledky, ktoré od špekulácie urobil, a vrátiť sa späť. Toto vyžaduje zložitú logiku a dobré overenie korektného fungovania. Každé chybne špekulované vetvenie zhoršuje výkon a postih je tým väčší, čím viac stupňov pipeline procesor má—tým viac inštrukcií sa musí typicky zahodiť. Zdokonaľovanie prediktorov vetvenia (znižovanie početnosti chybných predikcií) je preto jedna z najdôležitejších častí vylepšovania procesorov a každá nová generácia jadier CPU robí pokroky v schopnostiach prediktorov.

Podobný problém a výkonnostný limit ako prediktory vetvenia rieši technika prefetch. U nej ide o problém čakania na dáta z operačnej pamäte, ktorá je oproti CPU relatívne pomalá a môže trvať desiatky až stovky cyklov, kým dodá dáta, ktoré si program spracovávaný v CPU vyžiada. Aby preto procesor mohol pracovať s vysokým výkonom, musí vyžadovať dáta z pamäte mnoho cyklov pred tým, než ich potrebuje.

Prefetching spočíva práve vo včasnom odhadovaní toho, ktoré dáta bude procesor potrebovať, a ich predbežnom načítavaní do vyrovnávacích pamätí druhej a prvej úrovne, aby ich procesor našiel v nej a nemusel čakať na dodanie z RAM. Rovnako ako u prediktorov vetvenia sú neustále zdokonaľované schopnosti prefetche identifikovať vzorce v prístupe k dátam v pamäti a podľa nich dáta včas načítavať. Aj táto technika je kritická na zlepšovanie výkonu CPU.

Superskalárne procesory

Potom, čo procesory implementovali pipelining, bolo ďalším krokom na zlepšenie výkonu paralelné spracovanie inštrukcií. Ako bolo spomenuté, v kóde programu nasleduje jedna inštrukcia za druhou, ale neplatí, že by vždy na predchádzajúcej inštrukcii závisela (v tom zmysle, že výsledok prvej je jedným zo vstupov druhej, takže naň musí čakať). Vstupy aktuálnej inštrukcie môžu tvoriť dáta, ktoré boli pripravené inštrukciami, ktoré sú už ďalej v minulosti. Potom je možné túto inštrukciu spracovávať súčasne s tou, ktorá jej predchádza.

Prvý procesor x86 využívajúci superskalárny princíp bolo Pentium z roku 1993 (foto: Intel)
Prvý procesor x86 využívajúci superskalárny princíp bolo Pentium z roku 1993 (foto: Intel)

Superskalárne procesory to využívajú a majú v jadre viac paralelných jednotiek (ALU, FPU pipeline, Load/Store jednotiek). Čím viac paralelných jednotiek jedného typu je v jadre, tým viac inštrukcií, ktoré nie sú na sebe závislé, možno spracovať v jednom cykle, ak je na to príležitosť.

In-Order a Out-of-Order vykonávanie

Pri kombinácii pipeliningu a superskalárnej architektúry sa ale prítomnosť závislostí medzi inštrukciami rýchlo stáva limitom pre to, ako často možno paralelné jednotky využiť súčasne. Ďalším stupňom na zlepšenie výkonu (IPC) je prechod od vykonávania inštrukcií striktne v poradí (in-order) k vykonávaniu tzv. out-of-order, čo znamená, že ich možno vykonať mimo poradia. Ide o techniku, ktorá výrazne posúva výkon, ale zároveň aj komplexitu procesorov a to, ako náročné je overenie ich správneho správania a eliminovanie chýb v ich logike.

Pri out-of-order vykonávaní programu procesor nie je viazaný poradím inštrukcií, len ich skutočnými závislosťami. Ak teda má procesor pre aktuálny cyklus voľné vykonávacie jednotky, môže do nich poslať na vykonanie nielen inštrukciu, ktorá je na rade, ale aj iné inštrukcie, ktoré v programe nasledujú niekde za ňou—podmienkou je, že nesmú závisieť na výsledku žiadnej ešte nedokončenej inštrukcie. Procesor out-of-order vždy analyzuje určité „okno“ kódu programu, z ktorého si môže „vyzobávať“ dopredu inštrukcie na okamžité vykonanie, vďaka čomu potom zvyšné závislé inštrukcie v momente, keď už sú ich vstupy pripravené, budú spracované rýchlejšie. Pôvodné poradie operácií programu je potom obnovené v rámci zápisu výsledkov (fáza označená retire).

Intel Pentium Pro: Procesor z roku 1995, ktorý dokázal, že je možné navrhnúť úspešné x86 CPU na princípe vykonávania inštrukcií mimo poradia (Zdroj: Intel)

Pomocou vykonávania mimo poradia sa opäť zvýši počet inštrukcií, ktoré procesor zvládne vykonať za takt, a tým výkon. Vykonávanie out-of-order umožňuje efektívnejšie využiť vykonávacie jednotky, ktoré procesorové jadro má k dispozícii, pretože menej často budú stáť naprázdno a čakať nečinne na inštrukciu.

Na úspešnosť tejto techniky je dôležitá veľkosť onoho „okna“ programu, ktoré CPU vidí a v ktorom tak môže nájsť inštrukcie, ktoré možno ihneď vykonávať. Out-of-order procesory používajú frontu či zásobník pomenovanú typicky Re-Order Buffer (ROB). Ten má určitý počet položiek, v rámci ktorého možno vykonávanie inštrukcií mimo poradia vykonávať. Spočiatku to boli napríklad len nižšie desiatky, ale u aktuálnych procesorov môže mať hĺbku až niekoľko stoviek položiek. To potom dáva výrazne lepšie možnosti vykonať inštrukcie optimálne mimo poradia a využiť čo najviac paralelných jednotiek súčasne. Niektoré dnešné procesory tak môžu mať napríklad aj 8 a viac paralelných ALU a ďalšie jednotky Load/Store.

Procesory out-of-order majú aj ďalšie fronty s podobným účelom. Napríklad jednotky Load/Store používajú na čítanie dát z pamäte (load) frontu, v rámci ktorej môžu operácie tiež byť vykonané mimo poradia, a podobne existuje fronta pre operácie store (zápis dát do pamäte).

Procesor K5 bol prvou vlastnou architektúrou vykonávajúcou inštrukcie mimo poradia (a súčasne prvou superskalárnou) od AMD (Foto: Fritzchens Fritz)
Procesor K5 bol prvou vlastnou architektúrou vykonávajúcou inštrukcie mimo poradia (a súčasne prvou superskalárnou) od AMD (Foto: Fritzchens Fritz)

Moderné procesory sa snažia čím ďalej zlepšovať jednovláknový výkon (ktorý je potom pomocou viacerých jadier multiplikovaný do výkonu mnohovláknového). Prostriedkom na to je usilovné získavanie drobných kumulatívnych zlepšení pomocou všetkých týchto techník súčasne: Teda zvyšovanie počtu paralelných jednotiek v procesore, prehlbovanie Re-Order Bufferu a ďalších front používaných na out-of-order vykonávanie inštrukcií a vylepšovanie prefetche a predikcie vetvenia. To všetko môže po malých častiach zvyšovať IPC (výkon na 1 MHz) jadra. Súčasne architekti procesora musia optimalizovať počet stupňov pipeline a množstvo práce, ktorú jednotlivé stupne robia, aby procesor mohol dosiahnuť čo možno najlepšiu taktovaciu frekvenciu.

Ani maximálna taktovacia frekvencia, ani maximálne IPC nie sú samy osebe dostatočné na špičkový výkon. Výkon je daný súčinom (taktovacej) frekvencie a IPC, takže na vysoký výkon musia procesory využiť v nejakej kombinácii oba tieto zdroje. V rámci architektúry procesora je využívaných aj mnoho ďalších techník, ktoré prispievajú buď k zvýšeniu frekvencie, alebo k zlepšeniu IPC a ktoré nemožno na jednom mieste vypočítať ani popísať. Ich kombinácia robí z moderného mikroprocesora jeden z najzložitejších mechanizmov na svete, ktorého nielen rýchle, ale najmä korektné a spoľahlivé fungovanie bez nepredvídaných odchýlok je bez preháňania zázrakom technológie.

Rozšírte obsah v komentároch: Článok určite nezahŕňa všetko, čo považujete za dôležité. O takéto poznanie ho však môžete rozšíriť formou príspevku (alebo viacerých príspevkov), ktoré je možné zverejniť v diskusii nižšie.


⠀⠀

Intel Core Ultra 5 245K vs. AMD R5 9600X alebo… R7 9700X?

Najnižší „K“ model z rodiny procesorov Intel Arrow Lake ťaží tak, ako jeho predchodcovia, z veľkého počtu jadier. Na rozdiel od nich síce nemá Hyper Threading, ale výpočtovo nezaostáva a pritom je Core Ultra 5 245K efektívnejšia. Na konkurenčné Ryzeny 9000 to však nestačí. Nie pri vysokom výkone. V strednej záťaži, typickej herných počítačom, sa však situácia otáča. Procesor Intel má, pokiaľ ide o efektivitu, navrch. Celý článok „Intel Core Ultra 5 245K vs. AMD R5 9600X alebo… R7 9700X?“ »

Intel Core Ultra 9 285K: Viacvláknová „jednotka“ aj bez HT

Na trón absolútneho výkonu usadol nový procesor – Intel Core Ultra 9 285K. Áno, je to tesné, na úkor vyššej spotreby a nižšej efektivity, ale to je nutná daň, ktorú treba zaplatiť za tú „úplnú špičku“. Isteže, niekto ono prvenstvo rád oželie v prospech atraktívnejších prevádzkových vlastností, každopádne 24-jadrový procesor je tým, ktorý udáva tempo vo výpočtových úlohách na mainstreamovej platforme. V tomto prípade na Intel LGA 1851. Celý článok „Intel Core Ultra 9 285K: Viacvláknová „jednotka“ aj bez HT“ »

Intel Core Ultra 7 265K: Efektivita často nad Ryzen 7 9700X

Desktopové procesory Intel v generácii Arrow Lake prešli na mnohých úrovniach výraznou premenou. Odhliadnuc od nových architektúr výkonných (P) aj efektívnych (E) jadier sú už čipletové a napríklad prestali používať Hyper Threading. Súčasne sa znížila spotreba a procesor Core Ultra 7 265K je už oproti konkurencii neraz energeticky efektívnejší. To aj v hrách, čo sme doteraz nevídali. Celý článok „Intel Core Ultra 7 265K: Efektivita často nad Ryzen 7 9700X“ »

Komentáre (3) Pridať komentár

  1. Je možné, že v texte budú nejaké chyby, ktoré vznikli pri preklade (z češtiny, v ktorej to Jano písal originálne), tak ak na nejakú narazíte, môžete ju uviesť sem alebo potom na info@hwcooling.net. To isté platí pre faktické výhrady, ak nejaké máte. Cieľ je, aby bolo všetko presné… doplniť, čo uznáte za vhodné, samozrejme, môžete tiež. K tomu už bola výzva priamo z článku. 🙂

  2. ja by som este k cipletom doplnil, ze umoznuju jednou technologiou lahko vyrabat procesory roznych cenovych hladin.. vyvinies len 1 aktualny hardware, ale na procesor ich osadis 1-2-3… a mas produkt pre rozne vykony a rozne cenove kategorie. Tiez ti to umozni znizit pocet odpadu, lebo napr. chiplet ma 4 jadra. Vyrobis ale taky kus, ktory ma 2 OK a 2 pokazene jadra… tak to predas ako 2jadro, alebo das 2 take chiplety a mas 2+2=4 dobre jadra. Tie 4 zle deaktivujes. Tak sa zvysuje vytaznost vyrobneho procesu…

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *