Dekodiranje ukazov v CPE
Centralna procesna enota (CPE) izvaja program v neprekinjeni zanki: fetch → decode → execute. To gradivo podrobno razlaga fazo dekodiranja, kaj pomeni, kje se dogaja in zakaj je ključna za delovanje procesorja.
1. Uvod v dekodiranje ukazov
CPE (centralna procesna enota, ang. CPU) izvaja program tako, da neprestano ponavlja cikel ukaza:fetch (pridobi) → decode (dekodira) → execute (izvede)(pogosto še write-back oziroma zapis rezultata).
Pri tem je dekodiranje ukazov ključna faza, ker CPE v tej fazi ugotovi:
- kaj ukaz pomeni,
- katere podatke potrebuje,
- katere enote v procesorju morajo sodelovati pri izvedbi.
2. Kaj pomeni "dekodirati ukaz"?
Ukaz v strojni kodi je zapisan kot bitni vzorec (npr. 32-bitni ali spremenljive dolžine pri x86). Dekodiranje pomeni, da procesor iz tega bitnega vzorca prebere:
- Opcode (operacijska koda)
- Določa, katero operacijo želimo — ADD, SUB, LOAD, JUMP …
- Operandi
- Kateri registri ali podatki v pomnilniku sodelujejo pri operaciji.
- Način naslavljanja (addressing mode)
- Kako priti do podatkov — npr. neposredno iz registra ali prek izračunanega pomnilniškega naslova.
- Dodatne informacije
- Takojšnja konstanta (immediate), velikost podatkov, pogoji pri skokih ipd.
Rezultat dekodiranja je „načrt", ki pove krmilni logiki, katere signale mora poslati registrski datoteki, ALU-ju, enoti za dostop do pomnilnika itd.
3. Kje v CPE se dogaja dekodiranje?
Dekodiranje je tesno povezano s štirimi komponentami procesorja:
IR (Instruction Register)
Sem se po fazi fetch naloži trenutni ukaz, ki čaka na dekodiranje.
Krmilna enota (Control Unit)
Je "dirigent" procesorja. Iz dekodiranega ukaza izdela kontrolne signale in časovno zaporedje mikro-korakov.
Dekoderji ukazov
Posebna logika, ki iz bitnega vzorca ukaza izdela interni opis ukaza ali mikrooperacije.
Registrska datoteka
V fazi decode se pogosto že berejo registri, ki bodo operandi. Odvisno je od zasnove procesorja oziroma pipeline-a.
4. Kaj se zgodi v fazi Decode?
V tipični zasnovi (npr. RISC pipeline) faza decode vključuje štiri korake:
- 1
Razčlenitev ukaza
Procesor loči opcode, polja registrov, immediate vrednosti itd. iz bitnega vzorca.
- 2
Branje operandov iz registrov
Če ukaz uporablja registre, jih procesor prebere (npr. R1 in R2).
- 3
Priprava na dostop do pomnilnika
Pri LOAD/STORE ukazih se izračuna osnovni naslov ali se pripravijo komponente za kasnejši izračun.
- 4
Priprava kontrolnih signalov
Procesor določi, katera funkcionalna enota bo uporabljena (ALU, enota za skoke, enota za pomnilnik) ter kakšen bo naslednji korak v cevovodu.
5. Mikrooperacije, mikroprogramiranje in Microcode
Pri nekaterih procesorjih, posebej pri kompleksnejših naborih ukazov kot je x86, en strojni ukaz pogosto ne pomeni ene same preproste operacije. Namesto tega ga procesor v fazi dekodiranja pretvori v mikrooperacije (μops): bolj enostavne interne korake, ki jih jedro lažje izvaja.
Se lahko pretvorijo v samo nekaj μops takoj v dekoderjih, hitro in brez posebne obdelave.
Se izvedejo prek mikrokode (microcode ROM), ki deluje kot interni recept mikrooperacij za zapletene primere.
To omogoča, da procesor podpira širok in zgodovinsko združljiv nabor ukazov, hkrati pa notranje deluje bolj RISC-ovsko z mikrooperacijami.
6. Dekodiranje in cevovod (Pipeline)
V cevovodnem procesorju se več ukazov obdeluje hkrati, vsak v svoji fazi: eden se pridobiva, drugi se dekodira, tretji izvaja. Dekodiranje mora biti zato posebej prilagojeno.
Hitro
Dekodiranje ne sme biti ozko grlo, ki upočasni celoten cevovod.
Upoštevanje skokov
Napačna napoved skoka (branch) zahteva izpraznitev dela cevovoda (stall/flush), kar je drago.
Odvisnosti podatkov
Če ukaz potrebuje rezultat prejšnjega ukaza, mora cevovod počakati ali pa uporabiti posredovanje (forwarding).
V modernih x86 procesorjih obstajajo tudi predpomnilniki za že dekodirane μops (npr. »micro-op cache / op cache«), kar zmanjša potrebo po ponovnem dekodiranju v zanki in poveča učinkovitost.
7. Kratek primer
Poglejmo, kako faza decode deluje v praksi pri dveh različnih arhitekturah.
ADD R3, R1, R2
| opcode | ADD |
| operandi | R1 in R2 |
| cilj | R3 |
V decode fazi procesor prebere R1 in R2 ter pripravi ALU na seštevanje.
ADD EAX, [RBX+4]
| opcode | ADD |
| operand 1 | register EAX |
| operand 2 | pomnilnik @ RBX+4 |
| μops | naslov + branje + ADD |
Procesor mora dekodirati način naslavljanja in ukaz razdeliti v več μops.
8. Zaključek
Dekodiranje ukazov je faza, kjer CPE „razume" strojni ukaz in ga pretvori v notranje korake ter kontrolne signale.
Pri enostavnih procesorjih je to relativno neposredno. Pri modernih procesorjih pa pogosto vključuje:
- prevajanje v
mikrooperacije, - delo z
mikro-kodo, - optimizacije kot je
μop cache.
Hitro in učinkovito dekodiranje je ključno, ker vpliva na hitrost celotnega cevovoda in posledično na zmogljivost procesorja.