procesor IBM RS 6000 - POWER 1


Referát na předmět 36APS (architektura počítačových systémů)

školní rok: 2001/2002
datum: 12.5.2002
cvičení: st 14:30
vypracovali: P.Mikulec (st. sk. 342)
M.Vojtíšek (st. sk. 345)



  • Základní charakteristika   [©P.M.]
  • Architektura procesoru   [©P.M.]
  • Instrukční pipeline   [©P.M.]
  • Virtualizace paměti   [©P.M.]
  • Architektura a funkce FPU jednotky   [©M.V.]
  • Implementace jednotky Multiply&Add   [©M.V.]
  • Přejmenovávání registrů   [©M.V.]



    Základní charakteristika:

    Procesor RISC System/6000 (RS/6000) se objevil v roce 1990, je superskalární RISCový procesor firmy IBM, založený na architektuře nazvané POWER (Performance Optimization With Enhanced RISC). Tento procesor je nástupcem úspěšného RISCového procesoru IBM 801. Z procesoru RS/6000 se později vyvinuly procesory POWER2 a PowerPC.
    RS/6000 využívá jednoduchý instrukční soubor (184 instrukcí), všechny instrukce jsou hlouhé 1 slovo (= 4 Bajty = 32 bitů). Narozdíl od starších RISCových procesorů zavádí superskalární architekturu, což znamená, že je schopen zpracovat více instrukcí v jednom taktu - u procesoru RS/6000 to jsou až 4 instrukce. Kvůli odlišení superskalárních RISCových procesorů, nazvala IBM tuto architekturu POWER.

    Architektura procesoru:

  • 1 slovo = 4 Bajty
  • délka instrukce = 1 slovo
  • počet instrukcí = 184
  • virtuální paměť = 4 PB (252 B)
  • fyzická paměť = 4 GB (232 B)
  • 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: 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: 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: 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ě: 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:
    1. 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.

    2. 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.

    3. 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.

    4. 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.

    5. 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.

    6. 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.

    7. FPEX2 - Floating Point Execute
      Druhá (závěrečná) fáze vykonávání instrukce FPU.

    8. 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: 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: 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: Překlad adresy ve virtuálním módu:

    32 bitová efektivní adresa má tyto části: 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: 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 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

    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:

    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