50 MIPS
Popis funkčních bloků procesoru:
ICU (instruction control unit) - instrukční cache a jednotka větvení
Oddělení instrukční cache od datové, umožňuje součastné načítání a vykonávání instrukcí. Tato jednotka načítá instrukce do
instrukční cache s délkou 64B (16 instrukcí). Sama pak provádí instrukce skoku a vyhodnocení podmínky. Ostatní instrukce předává
prováděcím jednotkám FPU a FXU.
Jednotka ICU obsahuje:
- 8 kB dvoucestnou set-associative cache s délkou řádku 64 Bajtů
- 32 položková dvoucestná set-associative I-TLB
- Machine State Register (zpracovává přerušení a supervisor call)
- podmínkový registr (příznaky pro větvení)
FPU (floating point unit) - aritmetická jednotka pro práci s plovoucí řádovou čárkou
Tato jednotka dekóduje a provádí všechny operace v plovoucí řádové čárce, kromě load/store instrukcí.
Jednotka FPU obsahuje:
- 64 bitovou aritmetickou jednotku pro operace v pohyblivé řádové čárce (formát čísel podle IEEE 754 - dvojitá přesnost)
- 32 64 bitových registrů (s možností přejmenování)
FXU (fixed point unit) - aritmeticko logická jednotka pro práci s pevnou řádovou čárkou
Tato jednotka dekóduje a provádí všechny operace s pevnou řádovou čárkou a datové operace load/store plovoucí řádové čárky.
Jednotka FXU obsahuje:
- 32 bitová aritmeticko-logická jednotku
- 32 32 bitových obecných registrů
- jednotka adresace a ochrany paměti
DCU (Data cache unit) - datová cache
Datová cache je 64 kB čtyřcestná cache se stupněm asociativity 2 a s délkou řádku 128B. Je rozdělena do čtyř čipů po 16 kB.
Funguje stylem "store-back" - data se zapíšou do hlavní paměti až při mazání řádku z cache. Přístup do hlavní paměti je zajištěn
pomocí sběrnice o šířce 4 slov.
SCU (storage control unit) - centrální řadič
Tato jednotka řídí veškerou komunikaci mezi jednotkami ICU, FXU, DCU, hlavní pamětí a I/O pomocí vnitřní sběrnice PBUS.
I/O unit - jednotka pro připojení vstupních/výstupních zařízení
K CPU je připojena pomocí sběrnice o šířce 2 slova. Je tu podpora Micro Channel Architekturu, dále podporuje 15 DMA kanálů
a 16 úrovní přerušení.
Paměť
Standardní SIMM velikost 8, 16, 32 nebo 64 MB. Minimálně dvě pozice musí být zaplněny, výjimku tvoří levnější verze procesoru,
který má poloviční počet datových cache, tam stačí jen jeden SIMM. Celková velikost paměti pak může být 16 - 512 MB, resp. 8 - 256 MB.
Instrukční pipeline:
Procesor RS/6000 umí díky superskalární architektuře vykonat až 4 instrukce součastně:
- instrukci větvení
- instrukci, která pracuje s podmínkovým registrem
- aritmetickou instrukci pevné řádové čárky nebo
load/store instrukci plovoucí řádové čárky
- instrukci jednotky plovoucí řádové čárky
První dva typy instrukcí se zpracovávají v jednotce ICU, třetí v jednotce FXU a čtvrtá v jednotce FPU. Samozřejmě nelze v jednom taktu
provést 4 stejné instrukce, protože odpovídající jednotka může zpracovávat pouze jednu instrukci. To aby byl procesor využit co
nejlépe musí obstarat hlavně kompilátor. Ten musí instrukce seřadit tak, aby na sebe zbytečně nečekaly.
Zpracování instrukcí:

Význam jednotlivých fází zpracování instrukce:
- IF - Instruction Fetch
Načítání instrukce z instrukční cache. Instrukce se načítají po čtyřech a umisťují do instrukčního bufferu o délce 12 slov.
- Disp/BRE - Instruction Dispatch and Branch Instruction Execute
Rozpoznávání instrukce, zpracování instrukcí v ICU - instrukce, které se týkají podmínkového registru a větvení, jsou
zpracovány okamžitě a poté vypuštěny z instrukčního bufferu. Aritmetické instrukce jsou předány do jednotek FPU a FXU - tyto
jednotky přijímají pouze nepřetržitý tok aritmetických instrukcí. Tomuto jevu se říká zero-cycle branches.
- PD - Floating Point Predecode
FPU provádí předdekódování instrukcí a přípravu na přejmenování registrů. Tato fáze je na stejné úrovni jako
dekódování instrukcí FXU.
FXD - Fixed Point Decode
FXU dekóduje instrukce pevné řádové čárky a přistupuje do registrů pro operandy.
- Remap - Register Rename
Registrům plovoucí řádové jednotky jsou přiděleny fyzické registry.
FXEX - Fixed Point Execute
FXU vykonává instrukci. U load/store operací je vygenerována adresa, která je předána do datové cache.
- FPD - Floating Point Decode
FPU dekóduje instrukci a přistupuje do registrů pro operandy.
C - Cache access
FXU načítá data z datové cache do pevné nebo plovoucí řádové jednotky.
- FPEX1 - Floating Point Execute
První fáze vykonávání instrukce FPU.
FXWB - Fixed Point Write Back
FXU zapisuje výsledky instrukce do registrů. Pro instrukce, jejichž zdrojovým i cílovým operandem jsou registry (nebylo
třeba přistupovat do cache), byl tento zápis proveden již v předchozím cyklu.
- FPEX2 - Floating Point Execute
Druhá (závěrečná) fáze vykonávání instrukce FPU.
- FPWB - Floating Point Write Back
FPU zapisuje výsledky instrukce plovoucí řádové čárky do registrů FPU.
Jednotky FPU a FXU tedy pracují paralelně. Proto zde nastává problém, jak tyto dvě nezávislé jednotky synchronizovat.
Tato synchronizace se provádí během bodu 4 a 5, kdy FXU provádí přístup k registrům FPU.
Podmínkový registr:
Podmínkový registr se nachází v ICU. Je to registr podle jehož obsahu se rozhoduje při vykonávání podmíněných skoků.
U klasických procesorů se nastavuje podmínkový registr poslední instrukcí před skokem. Ale protože procesor RS/6000 umí
zpracovávat až 4 instrukce najednou, tak je tento 32 bitový registr rozdělen na 8 polí CR0 - CR7 o čtyřech bitech:
- LT - menší (less then)
- GT - větší (great then)
- EQ - rovno (equal)
- SO - přetečení pro FXU (summary overflow) / UO - pro FPU je tento bit nedefinován (undefined order)
Pevné a plovoucí řádové jednotce je vždy přiděleno po jednom poli a instrukce těchto jednotek obsahují bit, který určuje
zda příznaky výsledku budou zapsány do výsledku. Existují také instrukce, které umožňují tato pole přesouvat a ukládat.
Tím že existuje 8 příznakových polí, je vyřešen problém součastného přístupu FXU a FPU k tomuto registru (příznaky FXU
příliš logicky nesouvisí s příznaky FPU). Také se zde dává možnost překladači k uchování více výsledků výpočtu, což může
urychlit provádění programu.
Zpracování skokových instrukcí:
Zpracování skokových instrukcí u tohoto procesoru zkomplikováno tím, že procesor může součastně vykonat až 4
instrukce, to znamená že se po něm v jednom taktu může chtít aby vypočítal příznak a součastně podle něho provedl větvení.
Mohou nastat tyto případy:
Nepodmíněné skoky:
V tomto případě není žádný problém, protože skoky jsou nezávislé na příznacích a mohou být ihned zpracovány a procesor
v dalším cyklu načítá instrukce už od nové adresy.
Podmíněné skoky:
- Nastavení příznaku proběhlo již dříve: Jako u nepodmíněného skoku. Instrukce větvení může být zpracována ihned,
v následujícím cyklu dochází k načítání instrukcí od nové adresy, z hlediska aritmetických jednotek nedochází ke ztrátě
cyklu, nastává nulová prodleva při větveni (zero -cycle branches).
- Porovnávání a větvení je ve čtyřech instrukcích, které se provedou současně, pro správné provedení skoku se musí počkat
na vyhodnocení podmínky. Něž dojde k vyhodnocení podmínky načítají se další instrukce. Po vyhodnocení podmínky může dojít k
těmto dvěma případům:
- skok nenastane - instrukce se dále načítají, do aritmetických jednotek se předávají již načtené instrukce, nedochází
ke ztrátě cyklu.
- skok nastane - instrukční buffer se vyprázdní a instrukce se načítají od nové adresy. V následujícím cyklu nelze předat
instrukce do aritmetických jednotek, tím dochází ke ztrátě jednoho až tří cyklů, než se načtou nové instrukce. Počet
ztracených cyklů závisí na vzdálenosti instrukce nastavující příznak od skoku.
Tento problém se dá řešit už na úrovni překladu tak, že se překladač bude snažit umístit výpočet podmínky alespoň čtyři
instrukce před instrukcí podmíněného skoku tak, aby byl už v době větvení znám výsledek podmínky. Pro tento účel je v
procesoru podmínkový registr.
Virtualizace paměti:
Procesor RS/6000 má 32 bitové efektivní adresy a pracuje ve dvou paměťových režimech:
- reálný mód - Používá se při startu systému a při obsluze některých přerušení. Nedochází k žádnému překladu,
efektivní adresa je přímo rovna adrese fyzické. Adresový prostor je v reálném módu 4 GB.
- virtuální mód - Ze 32 bitové efektivní adresy se složí 52 bitová virtuální adresa, to jsou 4 PB adresového prostoru,
používá se segmentace i stránkování.
Překlad adresy ve virtuálním módu:
32 bitová efektivní adresa má tyto části:
- 4 bitové číslo segmentu
Každý program má 16 segmentových registrů. Daný registr určuje tato položka. Nejvýznamnější bit obsahu registru určuje,
zda se jedná o adresu v/v zařízení nebo paměť. Dolních 24 bitů tvoří ID segmentu.
- 16 bitový index stránky
Těchto 16 bitů se složí s 24 bity ID segmentu a takto dostaneme 40 bitové číslo virtuální stránky. Tato adresa je
přeložena pomocí TLB (Translation Look-aside Buffers) na 20 bitové číslo reálné stránky.
- 12 bitový offset
Složením offsetu s virtuálním číslem stránky vznikne 52 bitová virtuální adresa a s reálným číslem stránky vznikne
32 bitová fyzická adresa.
Překlad efektivní adresy se provádí takto: Nejvýznamnější 4 bity efektivní adresy určí jeden ze 16 segmentových registrů.
Nejvýznamnější bit segmentového registru určí, zda budeme přes tento registr přistupovat do paměti (tento bit je
vynulován) a nebo do I/O zařízení (bit je nastaven na 1). Jestliže je tento bit vynulován, tak se dolních 24 bitů spojí
s dalšími 28 bity efektivní adresy a vytvoří se 52 bitová virtuální adresa. Horních 40 bitů virtuální adresy udává číslo
virtuální stránky a dolních 12 bitů udává offset v této stránce (stránka má velikost 4kB).
K převodu virtuální stránky na reálnou se používá tabulky rámů stránek - PFT (Page Frame Table), která obsahuje
16 Bajtovou položku pro každý rámec reálné stránky. Tyto položky obsahují virtuální adresu, ke které je stránka přiřazena,
ukazatel na další stránku v seznamu, příznaky platnosti a změny a také informaci o přístupových právech. překlad virtuální
na reálnou stránku je umožněn HAT (Hash Anchor Table). HAT obsahuje index do tabulky PFT na místo, kde začne hledat hledané
virtuální stránky. Když není stránka nalezena, tak dojde k přerušení a přerušovací rutina nahraje příslušnou stránku do
paměti. Nejčastěji prováděné překlady jsou uloženy do TLB, tím se minimalizuje doba potřebná k překladu.
Nastavením určitého bitu segmentového registru se stává z tohoto segmentu tzv. speciální segment, ve kterém je
aktivován mechanismus ochrany stránek. Všechny stránky v rámci tohoto segmentu jsou pomyslně rozděleny na 128 bitové bloky
a každému z těchto bloků přísluší 1 bit (zámek) v příslušné položce PFT. V této položce je také obsaženo ID transakce a
čtyři bity (l, w, r, a) určující blíže přístupová práva k blokům. Bit l (lock type) určuje, zda se uzamčení bloku vztahuje
na zápis nebo na čtení.
Translation Look-aside Buffers (TLB):
TLB provádí překlad virtuální stránky na reálnou stránku pomocí tabulky rámů stránek PFT (Page Frame Table). Stránka
v tomto procesoru je dlouhá 4 094 Bajtů. PFT obsahuje jednu položku pro každý rámec reálné stránky. Každá položka obsahuje:
- číslo virtuální stránky
- příznak platnosti
- příznak změny (zašpinění)
- úroveň ochrany
- 32 bitů zámku (4 kB/32 = 128 Bajtů je pod jedním zámkem)
- typ zámku (povolení čtení, zápisu, ...)
- 16 bitů čísla transakce TID
- ukazatel na další položku PFT (20 bitů)
Adresování probíhá v FXU (je zde 55 instrukcí pro odkazy na data). Čtyřmi instrukcemi podporuje čtení a ukládání ve formátu
little-endian. Pěti instrukcemi podporuje zpracování jak řetězců jazyka C ASCIIZ tak i řetězců jazyka PASCAL.
Podporované adresní módy
- přímý (absolutní)
- nepřímý
- bázový
- báze spolu s indexem
- inkrementace a dekrementace ukazatelů
Architektura a funkce FPU jednotky
RS/6000 nemá jednotku pro práci
s pohyblivou řádovou čárkou (Floating Point Unit, FPU) řešenou
jako koprocesor, jako např. dřívější procesory fy Intel,
ale je přímo integrována na CPU. To významně urychlilo výkon
procesoru v této oblasti. Instrukce jednotek FPU a FXU mohou být
vykonávány zároveň, FPU jednotka ale neprovádí LOAD/STORE
operace, ty za ní vykonává FXU.
Architektura
- 32 64-bitových registrů
pro zobrazení čísel dle normy IEEE 745 (znaménko-exponent-mantisa)
- 6 registrů pro přejmenovávání
- 2 registry pro dělení
- řídící registr FPSCR
(Floating Point Status Control Register), který obsahuje
stavové informace o výjimce při provádění FP
operace
- "Předvídač"
počáteční nuly (Leading Zero Anticipator, LZA), který
urychluje detekování počáteční nuly (Leading Zero
Detection, LZD) při normalizaci výsledku
- Instrukce - celkem 21 FPU
instrukcí, např:
- 13 aritmetických
instrukcí pro sčítání, odčítání, násobení,
dělení, zaokrouhlení a 4 speciální instrukce
pro multiply&add operace
- 6 instrukcí pro
práci s FPSCR
- 2 instrukce pro
porovnávání, u kterých je možné určit, do
kterého pole podmínkového registru se umístí
příznaky.
FPU produkuje každý cyklus
jeden výsledek v pohyblivé řádové čárce a zpoždění výkonné
pipeline jsou jen dva cykly. Překladač proto využije maximálně
efektivitu tak, že mezi dvě závislé operace vloží jednu nezávislou,
aby se předešlo čekání.
Implementace jednotky Multiply&Add
Nejzajímavější částí
FPU jednotky je speciální instrukce multiply-add, která provádí
vynásobení dvou čísel a přičtení čísla A*B+C ve stejném čase jako samotné sčítání
nebo násobení. Další výhody této instrukce jsou:
- menší zatížení sběrnice,
neboť potřebujeme jen čtyři přístupy do paměti ( A
* B + C = D -> 3x LOAD, 1x STORE) místo šesti (A * B
= X, X + D = E -> 4xLOAD, 2x STORE)
- větší přesnost výsledku,
protože se po násobení instrukce neprovádí
zaokrouhlování
Využití této instrukce je
zejména u maticových operací, např. v grafice.
Instrukce je implementována
pomocí tzv. multiply-add-fused jednotky (MAF). K provedení operace dochází ve dvou
fázích instrukční pipeline - FPEX1 a FPEX2. V prvním kroku
jsou čísla vynásobena a ve druhém je zároveň provedena
normalizace výsledku i přičtení třetího operandu. Při klasickém sčítání se musí počkat
na výsledek sčítačky a teprve pro tento výsledek provést
normalizaci, tedy LZD, pomocí posuvu. Viz obr Místo toho se
používá obvod LZA, který detekuje, o kolik se má výsledek
posunout, rovnou z operandů. Princip činnosti LZA je podobný sčítačce
s predikcí přenosu, což je výhodné, protože samotná sčítačka
je právě takto realizována a nedochází k přílišnému zvýšení
složitosti obvodu.
Obr. Porovnání
obvodů LZA a LZD
Uvedeme zde příklad na využití
instrukce multiply-add, který slouží zároveň jako příklad
využití paralelní práce jednotek procesoru:
Výpočet následující
transformace (x a y mohou být prvky pole hodnot, přepočítávané
do nového pole x', y' ):
x’ =
a11*x + a12*y + b1
y’ = a21*x + a22*y + b2
loop: lfdu fp0,x(i)
# load and update floating point register
fma fp3,fp1,a11,b1 #
instrukce multiply-add
lfdu fp2,y(i)
# další load and update FPR
fma fp4,fp2,a22,b2
fma fp3,fp2,a12,fp4
stfdu fp3,x'(i)
# store and update register
fma fp4,fp1,a21,fp4
stfdu fp4,y'(i)
bc loop
# branch and count
Tato část kódu obsahuje 9
instrukcí, z toho 4 instrukce pro FXU (lfdu, stfdu), 4 instrukce
pro FPU (fma) a jednu instrukci pro BU (bc). Celkem se provádí
13 různých operací. Všechny instrukce se ale na RS/6000
provedou jen během čtyř instrukčních časů pro každou
iteraci cyklu, a to právě díky paralelní práci jednotek.
Přejmenovávání registrů
Načtení hodnoty do registru
FPU vytváří pro tento registr novou hodnotu. Nastává zde ale
problém, pokud je původní hodnota registru stále využívána.
Proto RS/6000 zavádí mechanismus přejmenování registrů, a
to přidáním některých registrů "navíc," které
se využijí jako paměť pro nové hodnoty, aby se nemuselo čekat
na uvolnění využívaného registru. Pokud jsou v průběhu zpracovávání
instrukcí ještě volné fyzické registry - celkem jich je k
dispozici 40, mohou se data ukládat do některého z nich. Pokud
jsou všechny zaplněny, přestane jednotka FXU načítat a čeká
na uvolnění. Princip přejmenovávání registrů je na následujícím
obrázku:

Obr. Princip přejmenovávání
registrů
Popis jednotlivých částí:
R0,R1 jsou
registry, do kterých přichází instrukce z instrukční cache.
OP je opcode instrukce, T je cílový registr, který je "kandidátem"
na přejmenování, a S1, S2, S3 jsou zdrojové registry.
Map table je 6
bitové pole o 32 položkách. Každá položka obsahuje číslo
fyzického registru (tag), který odpovídá příslušnému
logickému registru. Např. pokud položka pro registr 12 je 38,
potom fyzický registr 38 obsahuje data logického registru 12.
Free list -
seznam volných registrů - je kruhová fronta o kapacitě 8
registrů obsahující právě nepřiřazené fyzické registry.
Při inicializaci je map table nastavena na identitu - registry 0-31
- a zbývající registry č. 32-39 jsou umístěny do seznamu
volných registrů.
PTRQ (Pending-Target
Return Queue) je seznam vrácených registrů - opět kruhová
fronta o kapacitě 8 registrů. Obsahuje fyzické registry použité
instrukcemi, které jsou právě dekódovány nebo jsou v IDB.
Tyto registry budou uvolněny při ukončení dekódování
instrukce. Kromě ukazatelů na začátek a konec fronty má
fronta další ukazatel (release pointer), který uchovává čísla
fyzických registrů v PTRQ, dokud se všechny dřívější
aritmetické instrukce, které mohly požadovat data v
korespondujícím fyzickém registru, nedekódují.
Decode - dekódování
- obsahuje instrukci, která je právě dekódována.
IDB -
Instruction Decode Buffer je vyrovnávací paměť, kde jsou uloženy
instrukce, které prošly přejmenováním registrů, ale ještě
nemohou být dekódovány (např. proto, že Decode ještě není
volné). Stejně jako pole pro dekódování, IDB obsahuje položky
LC a SC (load/store count). Při dekódování je LC použit ke
zvýšení release pointeru v PTRQ pro uvolnění registrů do
Free listu. SC má podobný význam u PSQ, kde zvyšuje release
pointer PSQ (viz níže) pro umožnění dalších FP store
operací.
BUSY a BYPASS
registry obsahují číslo cílového registru instrukce
v první a druhé fázi vykonávání
OLQ (Outstanding
Load Queue) obsahuje číslo fyzického registru příští
instrukce FPU načítání, do kterého budou načtena data z
datové cache. Zamezuje dekódování instrukcí, pokud požadují
data, která se z datové cache ještě nenačetla.
PSQ (Pending-Store
Queue) - zde jsou uloženy store instrukce po přejmenování
registrů. Díky tomu nemusí instrukce projít fází dekódování.
Instrukce zůstávají ve frontě, dokud nejsou uvolněny při
dekódování aritmetické instrukce. Po uvolnění mohou být
provedeny, jestliže jsou jejich data přístupná.
Poté, co instrukce přijdou
do přejmenovávací fáze, se další chování jednotky řídí
podle typů instrukcí, které jsou v registrech R0 a R1.
U aritmetických FP
instrukcí nedochází ke změně mapovací tabulky.
Instrukce přechází do dekódovací fáze. Jestli aritmetická
instrukce je v registru R1, LC a SC položky jsou nastaveny na
nulu. Jestli je v R0, LC nebo CS jsou nastaveny na 1 podle toho,
zda je v R1 load či store instrukce.
U store instrukcí je
cílový registr přejmenován na příslušný fyzický registr
a instrukce je vložena do PSQ. Zde čeká, dokud není hodnota,
která má být instrukcí uložena, k dispozici.
U load instrukcí se
provádí aktualizace mapovací tabulky, protože se definuje nová
hodnota logického registru. Tag příslušející cílovému
registru se vloží do PTRQ a do mapovací tabulky se zapíše
tag z počátku fronty volných registrů (Free list). Pokud je
fronta prázdná, FXU přeruší vykonávání instrukcí.
Příklad:
(instrukce se načítají po
dvou do R0, R1 !)
| fadd |
R3,
R2, R1 |
# na počátku
inicializace, na začátku Free listu je tedy R32, dále
R33 |
| fst |
R3 |
|
| fld |
R3 |
# registr R3 přejmenován
na R32, R3 uložen do PTQR |
| fmul |
R6,
R3, R1 |
# zde už se pracuje s R32 |
| fsub |
R2,
R6, R2 |
|
| fld |
R3 |
# registr R3 přejmenován
na R33, R32 uložen do PTQR, R3 z řádku 2 se nyní už
ukládá a může být poté zařazen do Free listu |