Thursday, June 16, 2011

HW: ISA a jej zakladne triedy

ReTak, asi zacnime tym, co je ISA. ISA je skratka pre architekturu suboru instrukcii (instrunction set architecture). Dalo by sa povedat, ze to je pohlad na pocitac z hladiska programatora v strojovom jazyku. Parametre ako instruction count, clock per instruction a doba hodinoveho taktu ovplyvnuju ISA.


                                       IC                                         CPI                                    Tclk
Program                   nie je sucast systemu            nie je sucast systemu
Prekladac                 priamy vplyv                           nepriamy vplyv 
ISA                            priamy vplyv                            priamy vplyv                    nepriamy vplyv
Organizacia CPU                                                     priamy vplyv                    priamy vplyv
Technologia CPU                                                                                            priamy vplyv


Z obrazku je jasne, ze ISA umoznuje istu uroven abstrakcie, ale zdaleka nie taku, ako vyssie programovacie jazyky. Sme stale blizko HW, co ale ma svoje vyhody, nakolko nie sme zavisli na sikovnosti prekladaca. ISA teda definuje rozhranie medzi nizkourovnovym SW a HW, standardizuje instrukcie poskytuje istu uroven abstrakcie. 





Vplyv na vyvoj architektur ISA ma najma 
  • technologia vyroby procesoru 
  • operacny system 
  • aplikacie 
  • programovacie jazyky 
Uz sme hovorili o zakladnom cykle pocitaca, ktory sa sklada z faz 
  • Instruction Fetch
  • Instruction Decode
  • Operand Fetch 
  • Execute 
  • Write Back 
  • Interrupt 
Interrupt na teraz nebudeme uvazovat. Preco spominam zakladny cyklus? Pretoze je presne to, co nam povie, ako budu vyzerat instrukcie a pokial nepozname ISA, ako zostrojime zakladny cyklus, ked nevieme, ake instrukcie budeme prijimat? 

ISA musi mat vzdy definovane 
  • kodovanie instrukcii 
    Inak povedane, ako su instrukcie kodovane? 
  • umiestnenie operandu 
    Kolko explicitnych operandov je v ALU? Ktore operandy su v pamati a ako su v pamati umiestnene? 
  • datove typy a velkosti operandov 
  • operacie v ISA
    Ake operacie su podporovane?
  • umiestenie vysledku 
  • vyber nasledujucej instrukcie 
    Podmienene skoky, volania, navraty z podprogramu, prerusovaci model 
Medzi zakladne triedy ISA patri 
  • stradacovo orientovana ISA
  • zasobnikovo orientovana ISA
  • ISA s univerzalnymi registrami

Stradacovo orientovana ISA (multiple accumulator ISA)
Tzv. stradac (accumulator) je implictnym zdrojovym aj cielovym operandom instrukcie. Druhy operand moze byt explicitny a to 
  • v pamati adresovany absolutne alebo s indexovym registrom 
  • adresovany nepriamo cez register, napr. ukazatel zasobnika  
  • v poli pracovnych registrov, tzv. zapisnikova pamat
Vyhodou stradacovej ISA je 
  • jednoduchy HW 
  • minimalny vnutorny stav procesoru 
  • kratke kody instrukcii 
  • jednoduche dekodovanie instrukcii a radic 
Nevyhodou je zase 
  • casty pristup do pamate 
  • a limitovany paralelizmus medzi instrukciami
Tento typ pamate bol popularny v case, ked HW CPU bol drahy a obmedzeny a cyklus pamate bol kratsi ako instrukcny cyklus. 

Program akumulatorovo orientovanej ISA s absolutnou adresaciou vzdy vyuziva tzv stradac. 

LOAD A              acc <- MEM[A]                            #acc je akumulator
STORE A            MEM[A] <- acc
ADD A                acc <- acc + MEM[A]
SUB A                 acc <- acc - MEM[A]

Indexovy register je jeden alebo viac registrov, ktore sa pouzivaju pre zjednodusenie adresacie pamate. Vyssie uvedeny priklad by sme mohli upravit na 

LOAD A, IX       acc <- MEM[A + IX] 
ADD A, IX         acc <- acc + MEM[A + IX]  

v pripade indexovych registrov ale musime pridat nove registre, aby sme s indexami vedeli manipulovat. 

JZi           A, IX         if (IX == 0) PC <- A else PC <- PC + 1, IX <- IX + 1 
LOADi    A, IX        IX <- MEM[A]

JZi je teda podmienka skoku, ktora skoci na A, ak je IX rovne 0, inak sa PC posunie na dalsiu instrukciu. 

Zasobnikovo orientovana ISA je dalsia zo sady ISA. Tato disponuje zasobnikom, co je vlastne registrove pole s ukazovatkom na vrch TOP. Nachadza sa vnutri CPU. 


Zasobnik je v pripade takejto ISA konceptualne nekonecny, v skutocnosti ma vsak zasobnik maly pocet registrov N. 
  • N najvyssich poloziek zasobnika je ulozenych v CPU, to nazyvame HW zasobnik 
  • zvysok zasobniku je simulovany v hlavnej pamati (preto je konceptualne nekonecny)
  • presuvy medzi HW zasobnikom a hlavnou pamatou riesi radic procesoru. Tieto mechanizmy nazyvame Stack Spilling a Stack Fetching 
  • k presune dochadza pri overflowe/underflowe
Zakladne instrukcie zasobnikovej ISA. Z tychto prikladov je vidno pracu so zasobnikom, bez ktoreho sa neazaobideme. 

PUSH A        TOP++, Stack[TOP] <- MEM[A]
POP A          MEM[A] <- Stack[TOP], TOP--
ADD             Stack[TOP-1] <- Stack[TOP-1] + Stack[TOP], TOP--
SUB             Stack[TOP-1] <- Stack[TOP-1] - Stack[TOP], TOP--

Registre zasobnikovej ISA nie su pristupne programatorovi a to zjednodusuje prekladac, ktory sa nemusi starat o programtorske "sachovanie" s registrami. ALU pracuje vzdy vyhradne so zasobnikom. Ako je mozne usudit z vyssie uvedenych instrukcii, tak zdrojovy aj cielovy operand je vzdy na zasobniku.
Na obrazku vidime zasobnik s 3 registrami a pamat M, v ktorej su emulovane dalsie miesta (S) zasobnika. Presun zo zasobnika do S sa vykona v pripade, ze dno zasobnika je obsadene nejakou hodnotou a mi este chceme nieco pihodit na TOP. 

Vyhody zasobnikovej ISA su najme 
  • jednoduche a efektivne specifikacie operandov v ALU instrukciach 
  • jednoduche a rychle instrukcie 
  • vysoka hustota kodovania (pretoze programy zaberaju malo pamate)
  • jednoduchy prekladac (ak nechceme optimalizovat)
  • rychla interpretacia ci emulacia 
Bohuzial, chyba nam tu par veci, ako 
  • moznost nahodneho pristupu k lokalnym premennym (k registrom)
  • zasobnik je sekvencny a tak limituje paralelizmus operacii 
  • minimalizovat pristup do pamate je velmi narocne 
Dnes najpouzivanejsia je GPR ISA, alebo ISA s univerzalnymi registrami (general purpose registers). GPR ISA je architektura, ktora vyuziva tzv. univerzalne registre. Tieto registre su samozrejme rychlejsie, ako pamat a je k nim umozneny nahodny pristup. Vdaka registrom su zaroven eliminovane caste pristupy do pamate. Problemom moze byt obmedzeny pocet registrov, zlozitejsi prekladac, nemoznost pouzit ukazatele pre pristup k objektom, zlozitejsie datove struktury sa nam do registrov nezmestia a prepnutie kontextov trva dlhsie. Format GPR instrukcii sa moze lisit. 

Pri GPR ISA nesieme oponenut jej niektore varianty.

Variant Load - Store, alebo tiez Register - Register (3,0) je typicka pre procesory RISC. Dlzka instrukcii je pevna a ich kodovanie jednoduche. Dekodovanie je tiez rychle a jednoduche. CPI zavisi len na type operacii v instrukcii a implementacia pipeline je jednoducha. Hustota kodovania je vsak mala, instrukcii je teda viac a programy su dlhsie. Niektore programy by bolo mozne zakodovat menej bitmi.

Varianta Register - Pamat (2,1) je typicka pre CISC procesory, a jedna sa o multiple-accumulator architekturu. Pristup do pamate je v tomto pripade priami, teda bez load instrukcie hustota kodovania je lepsia. Operandy v tomto pripade nie su ekvivalentne (jeden zdrojovy operand je ztrateny) a vyzaduju sa dodatocne MOVE instrukcie. Pocet registrov moze byt limitovany pretoze specificke adresy pamatovych operandov mozu zaberat vela bitov. CPI ma velky rozptyl v zavislosti na umiestneni operandov. Prudove zpracovanie instrukcii je tiez obtiaznejsie.

Varianta Pamat - Pamat (2,2 a 3,3). Jedna sa o komplexny CISC model, ktory je uz vyhynuty. Pre tuto variantu nie je potreba pouzivat registre pre data prudoveho charakteru (multimedia, grafika) a nie je potreba pouzivat Load/Store/Move instrukcie pre kratke programy. Nevyhodou je prilis premenna dlzka kodu instrukcie (1 az 36B) a velky rozptyl cpi. Pamat sa moze stat uzkym hrdlom systemu. Prekladac je prilis zlozity a prudove zpracovanie na urovni instrukcii je takmer nemozne.


Zasobnikovo orientovana ISA ma procesor s N polozkovym HW zasobnikom a ma schopnost uchovat v procesore rovnaky objem dat, ako GPR procesor s N registrami. Zasobnikovo orientovany procesor ma vsak obmedzeny pristup k datam v procesore a je nutne implementovat stack spilling. Naproti tomu GPR procesor umoznuje plne nahodny pristup k datam v registroch, ale jeho miplmentacia registroveho pola je, samozrejme, zlozitejsia. GPR procesor je teda efektivnejsi v pocte pristupov do pamate, pretoze moze s registrami pracovat v lubovolnom rezime.