proging pinigai istorija link04 paranoja apie    
    {local_links}    
    Yra dvi pagrindinės šiuolaikinių procesorių architektūros (tiksliau - koncepcijos), jas būtų galima pavadinti ir dviem skirtingom ideologijom. Viena vadinasi "CISC", kita - "RISC".

"CISC" yra daug senesnė procesorių kūrimo pakraipa. Pagrindinė "CISC" idėja yra tokia: jei mes turime dažnai naudojamą procesoriaus komandų seką, mes galime pakeisti ją specialia procesoriaus instrukcija. Kadangi tokia komandų seka jau bus realizuota aparatiškai, ji įvykdyta bus greičiau. Iš esmės, pirmus du kompiuterių egzistavimo dešimtmečius visi jie buvo kuriami, remiantis tokia idėja. Nors, norint sukurti pilnavertį kompiuterį, pilnai pakaktų keliolikos ar netgi kelių komandų. Tai jau būtų artima "RISC" idėjoms. Iš esmės, yra sukurtas netgi teorinis procesoriaus modelis, kuris gali vykdyti visų tipų uždavinius, naudodamas vieną komandą su vienu operandu! Taigi, kokios būtų konkretesnės "CISC" ar "RISC" pasirinkimo priežastys ir kuro šie procesoriai iš viso skiriasi?

Ko gero, dažniausiai pateikiamas apibrėžimas būtų toks:
  • "RISC" - tai "Reduced Instruction Set Computer" arba "Rational Instruction Set Computer" - kompiuteris, turintis mažą skaičių instrukcijų (iki poros dešimčių) ir kurio instrukcijos parinktos apgalvotai.
  • "CISC" - "Complex Instruction Set Computer" - šis terminas atsirado tik kaip priešprieša "RISC" terminui ir reiškia kompiuterį, turintį labai daug instrukcijų, kurios dažnai įvestos neapgalvotai.

Nežinau, kaip jums, bet man tokie apibrėžimai nieko nesako: vien instrukcijomis nieko nepakeisi, juo labiau kad kai kurie iš šiuolaikinių "RISC" procesorių (pvz., "PowerPC") turi daugiau, nei šimtą instrukcijų, parinktų ne per daug protingai, dažnai - stengiantis išlaikyti suderinamumą su ankstesniais procesoriais, o kai kurie tipiški "CISC" procesoriai yra pakankamai apgalvoti. Juolab, kad pvz., tipiškiausi 8 bitų "CISC" procesoriai turi vos po kelioliką - keliasdešimt instrukcijų. Tad, ko gero, kriterijai būtų sudėtingesni:

  • "RISC" architektūrų tipiški bruožai:
    1. Visos instrukcijos yra vienodo ilgio, taigi, nereikia papildomų operacijų jų ilgiui nustatyti.
    2. Visos instrukcijos yra neišskaidomos ir minimalios. Dėl to nereikia naudoti papildomų mikroprograminių įrenginių, programa gali būti geriau optimizuota. Kaikuriuose "RISC" procesoriuose (pvz., pirmuosiuose "Sparc") atsisakyta netgi daugybos ir dalybos veiksmų.
    3. Visos operacijos atliekamos tik su reikšmėmis, esančiomis registruose, taip išvengiant bet kokių galimų prastovų, atsirandančių, kreipiantis į operacinę atmintį.
    4. Procesoriai turi kelis registrų rinkinius bei instrukcijas, leidžiančias procesoriaus darbo metu pakrauti registrų rinkinį duomenimis, tam kad paskui programa galėtų pereiti prie naujo registrų rinkinio, nesikreipdama į atmintį. Tai itin tipiškas "RISC" procesorių bruožas, kuris, nors ir nėra būtinas, tačiau egzistuoja praktiškai visosuose "RISC" procesoriuose. Toks registrų rinkinys vadinamas registrų langu.
    5. Tipiški "RISC" procesoriai yra 32 ar daugiau bitų procesoriai (kai kada jie turi net 256 bitų registrus), nors yra sukurta ir "RISC" bruožus turinčių 16 bitų procesorių (pvz., "Siemens 80C166", turėjęs 16 16bitų registrų ir tipišką "RISC" architektūrą su registrų langu).
    6. Visi "RISC" procesorių registrai yra bendros paskirties (žinoma, išskyrus komandų skaitliuką ar pan.). Aišku, yra ir daug "CISC" procesorių, turinčių bendros paskirties registrus (pvz., "Motorolla 68000"), tačiau specializuotų registrų (akumuliatorių) "RISC" architektūrose paprastai nebūna.
    7. Vektorinės instrukcijos - galimybė vienu metu vykdyti tokį patį kelių operandų sekų apdirbimą, pvz., skaičių A sudėti su skaičiumi B ir paraleliai skaičių C sudėti su skaičiumi D. Tokio tipo veiksmai lengvai realizuojami "RISC" procesoriuose, kai "CISC" tam reikia papildomų schemų. Aišku, vektorinės instrukcijos naudojamos ne visuose "RISC" procesoriuose, tačiau jos pakankamai būdingos.
    8. "Matematiška" procesoriaus optimizacija - kuriant procesorių, neatsižvelgiama į programavimo kalbų ar kompiliatorių ypatybes, kaip ir į tai, kad kartais tenka rašyti programas asembleriu. Visas komandų rinkinys parenkamas taip, kad procesorius dirbtų maksimaliai efektyviai, nesvarbu, kiek sunku bebūtų jam programuoti, o optimizacija užsiima kompiliatoriai.
  • "CISC" architektūrų tipiški bruožai:
    1. Instrukcijos gali būti skirtingų ilgių, tai leidžia efektyviau panaudoti operacinę atmintį.
    2. Dažnai pasitaikančios instrukcijų sekos apjungiamos, įvedant naujas instrukcijas. Pvz., tipiškos instrukcijų sekos:
      PUSH PC ; išsaugomas einamasis adresas
      JMP @Subroutine ; perėjimas į paprogramę
      ;
      POP REGISTER ; iš steko ištraukiamas grįžimo adresas
      JMP REGISTER ; pagal adresą, esantį registre, vykdomas perėjimas
      ;
      INC REGISTER ; registras padidinamas vienetu
      JMP @Cycle ; pereinama į ciklo pradžią
      ;
      PUSH REGISTER1 ; į steką permetamas pirmo registro turinys
      PUSH REGISTER2 ; į steką permetamas antras registras
      PUSH REGISTER3 ; į steką permetamas trečias registras
      PUSH REGISTER4 ; į steką permetamas paskutinis registras
      keičiamos į pavienes komandas:
      CALL @Subroutine ; kviečiama paprogramė, išsaugant adresą
      ;
      RET ; Vykdomas perėjimas pagal adresą, kuris ištraukiamas iš steko
      ;
      LOOP @Cycle ; pereinama į ciklo pradžią, inkrementuojant registrą
      ;
      PUSHR ; visi registrai eilės tvarka išsaugomi steke
      Dėl tokio komandų apjungimo programuoti asembleriu darosi daug paprasčiau.
    3. Daugelis aritmetinių operacijų vykdoma su duomenimis, esančiais atmintyje, gali būti netgi operacijų, kurios vienos atminties lastelės turinį sudeda su kitos ląstelės turiniu ir rezultatą įrašo į trečios ląstelės turinį, kartu naudodamos adresus, esančius atmintyje. Pastaruoju atveju, vienos komandos vykdymui atliekami bent 5 veiksmai, iš kurių trys - kreipimaisi į atmintį, o vienas - komandos išskaidymas į paprastus veiksmus.
    4. Procesoriai turi vieną registrų rinkinį, o darbas su atmintimi pagreitinamas, naudojant sudėtingus kešavimo mechanizmus bei kreipimųsi į atmintį prognozavimą. Tiesa, kai kurie "CISC" architektūros procesoriai visgi turi registrų langus (pvz., "Hitachi H16"), taip pat kešavimo priemones turi ir dauguma šiuolaikinių "RISC" procesorių, tačiau kešo reikšmė "CISC" sistemoms yra daug didesnė.
    5. Tipiški "CISC" procesoriai yra ne daugiau, nei 32 bitų ir turi daugelį architektūros bruožų, būdingų 8 ar 16 bitų procesoriams. Tiesa, yra ir 64 bitų "CISC" procesorių (pvz., "AMD Hammer") ir netgi 128 bitų operacijas turėjusių "CISC" mašinų (konkrečiau - rusiškas "Elbrus" superkompiuteris).
    6. Dažnai naudojami specializuoti registrai, kurie gali būti net nenurodomi kai kuriose komandose. Pvz., bet kokių aritmetinių operacijų rezultatai gali būti permetami į vieną konkretų registrą. Tai leidžia naudoti trumpesnes komandas, bet apsunkina programų optimizavimą ir apriboja procesorių galimybes. Beje, tokie, specializuoti, registrai vadinami akumuliatoriais.
    7. "CISC" procesoriuose nebūna vektorinių instrukcijų, nebent jos būtų realizuotos atskirame procesoriaus galimybes padidinančiame priede, turinčiame atskirą instrukcijų ir registrų rinkinį (kaip, pvz., "Pentium III" procesoriuje).
    8. "Programinė" procesoriaus optimizacija - procesorius kuriamas taip, kad programuoti asembleriu būtų patogu, stengiantis sukurti kuo daugiau aukšto lygio programavimo kalbose naudojamų konstrukcijų ekvivalentų. Šiuo atžvilgiu itin išsiskiria du (abudu jau negaminami) kompiuteriai - "DEC" firmos "VAX" ir rusiškas "Elbrus", kurie laikomi pačiais ryškiausiais "CISC" architektūros pavyzdžiais. Beje, "Elbrus" šiuo atžvilgiu buvo rekordininkas: jis aparatiškai palaikė netgi duomenų tipus, leisdamas, pvz., tai pačiai funkcijai perduoti ir duomenis, ir rodyklę į duomenis ir rodyklę į funkciją, ir rodyklę į rodyklę į rodyklę į funkciją, kuri grąžina rodyklę į duomenis, etc..

Vis dėl to, sakyčiau, tipiškiausias "RISC" bruožas - tai specifinė, kraštutinai optimizuota architektūra, leidžianti procesoriaus galimybes panaudoti tiek efektyviai, kiek tai įmanoma ir neturinti jokių nereikalingų ar mažai reikalingų išplėtimų.

Aišku, gilinantis, iš karto galima atmesti procesorius su viena komanda bei kai kurias netradicines architektūras, pvz., tokias, kur skaičiavimus atlieka ne procesorius, o operacinė atmintis. Kita vertus, reikia pastebėti, kad aiškios ribos tarp dviejų "architektūrų" nėra: tai ne tiek skirtingos architektūros, kiek skirtingas procesorių kūrėjų nusistatymas. Galų gale, net ir sukūrus tipišką "RISC" procesorių, jis tobulinamas, tad ilgainiui dalis jo komandų gali tapti nenaudingomis, dalis - dubliuotis, o dalis - veikti kaip papildomi išplėtimai. Taip, per kelias kartas, tipiškas "RISC" gali tapti tipišku "CISC".

Gal geriausia būtų palyginti tipiškas "RISC" bruožų turėjusias mašinas - rusišką "M-10", sukurtą 1973 (tai pirmas pasaulyje "RISC" kompiuteris) ir tipišką šių laikų "CISC" procesorių šeimą - "Intel x86".

Esminis "M-10" bruožas - tai specifinė procesoriaus architektūra:

Registrai Magistralė
bitai
16 32 64 128 512
16 32 64 128   <-
<-
256 In
<-
<-
->
->
256 Out
->
->
16
16 32
16
16 32 64
16
16 32
16
16 32 64 128
16
16 32
16
16 32 64
16
16 32
16

Šis procesorius turėjo 2 128 bitų registrus, kurių kiekvienas galėjo veikti kaip du 64 bitų registrai. Kiekvienas iš šių, atitinkamai, galėjo veikti, kaip 2 32 bitų registrai, o pastarieji - kaip 2 16 bitų registrai. 512 bitų pločio duomenų šyna (magistralė) leisdavo per vieną ciklą pakrauti visus registrus duomenimis bei išsaugoti visus duomenis atmintyje (labai panaši, tik mažesnio našumo schema naudojama vėlesniuose "RISC" procesoriuose, pvz., "Sparc" - tai taip vadinamas registrų langas). Tuo atveju, kai procesorius vykdydavo operacijas su mažesniais, kaip 128 bitų skaičiais, su visais procesoriaus registrais buvo galima atlikti tas pačias operacijas sinchroniškai. Dėl to procesorius galėdavo vykdyti veiksmus su vektoriais (vienodo tipo duomenų sekomis). Adresacijai realizuoti "M-10" buvo panaudotas atskiras, nepriklausomai veikiantis procesorius, veikiantis sinchroniškai su aritmetiniu, tad, duomenų ir adresų registrai buvo atskirti. Kita vertus, toks atskyrimas leido itin paprastai ir efektyviai vykdyti išankstinį duomenų krovimą.

Visiška priešingybe tokiems procesoriams tapo "Intel x86" serijos procesoriai, kurių registrų paskirtyje bei komandų veikime susigaudytų tik pamišėlis. Viskas prasidėjo, matyt, nuo "Intel 8080" procesoriaus, kuris buvo gana silpnas, tad jį teko atitinkamai optimizuoti (tuo metu techninės galimybės neleido procesoriuje panaudoti nei pakankamai komandų, nei pakankamai registrų, etc.). Gavosi maždaug toks įrenginys:

Registrai Magistralė
bitai
8 16 8
A   <-8->
B BC
C
D DE
E
H HL
L
     SP
  PC

Procsorius turi 7 8 bitų registrus. šeši iš jų suporuoti taip, kad gali būti naudojami, kaip 3 16 bitų registrai. Visi registrai yra griežtai specializuoti, kiekvienas naudojamas tik su tam tikromis opearcijomis. Kaip matome, "Intel 8080" nepasižymėjo grožiu (netgi geometriniu). Jis buvo sukurtas dar senesnio "Intel 8008" procesoriaus, skirto paprastiems kalkuliatoriams, pagrindu. Vėliau "Intel" sukūrė "8086" procesorių. Nors jis nebuvo tiesiogiai pritaikytas "8080" programoms vykdyti, "Intel" nusprendė išsaugoti seną architektūrą: tokiu atveju "8080" programas buvo galima vykdyti po nesudėtingos transliacijos. Gavosi štai toks daiktas:

Registrai Magistralė
bitai
8 16 16
AH AX   <-16->
AL
BH BX
BL
CH CX
CL
DH DX
DL
     SP
BP
SI
DI
CS
DS
SS
ES

Jau iš bendros grafinės schemos matosi, kad 1978-aisiais, daug toliau pažengusiose Jungtinėse Valstijose sukurtas procesorius "Intel 8086", lyginant su rusišku "M-10", atrodo kaip paliegęs invalidas. Dar labiau šis įspūdis sustiprėja, palyginus registrų atliekamas funkcijas ir adresaciją: nors šis procesorius gali adresuoti iki 1 megabaito atminties, realiai adresacija yra 16bitų su keturiais segmentiniais registrais (CS, DS, SS, ES). Kitaip tariant, programai kiekvienu momentu pasiekiamos 4 adresų sritys, kurių kiekviena yra 64 kilobaitų dydžio. Kai kurių rūšių operacijos gali būti tiesiogiai atliekamos tik su kuriuo nors vienu iš atminties segmentų. Registrai irgi pasižymi išskirtinumu bei papildomomis savybėmis: pvz., BX ir DX gali būti naudojami adresacijai, nors AX ir CX tokių galimybių neturi. Daugybos ir dalybos veiksmuose visada naudojamas AX registras, o su CX ir BX daugybos ir dalybos atlikti negalima. Rezultatas iš tikro bjaurus, efektyviai panaudoti registrų beveik neįmanoma. Didele dalimi tokia architektūra yra tiesiog paveldėta iš 1974-aisiais sukurto 8 bitų "Intel 8080" procesoriaus ir net iš 1972-aisiais sukurto "Intel 8008" procesoriaus. Naujesni "x86" tipo procesoriai, pradedant "Intel 80386", turi 32 bitų architektūrą, kuri iš tikro tėra tos pačios "Intel 8086" išplėtimas:

Registrai Magistralė
bitai
8 16 32 32
AH AX EAX <-32->
AL
-
BH BX EBX
BL
-
CH CX ECX
CL
-
DH DX EDX
DL
  SP ESP
SP
BP EBP
SP
SI ESI
SP
DI EDI
SP
CS
DS
SS
ES
GS
FS

Nors iš karto matosi, kad pastarasis procesorius sudėtingumu jau turėtų aplenkti senovinį "M-10" (iš tikro, taip ir yra), matosi ir tai, kad jis nei kiek nepagražėjo - greičiau atvirkščiai, tapo dar didesniu gargaru.

Per porą "x86" architektūros gyvavimo dešimtmečių, šiuose procesoriuose neatsirado ir "SIMD" instrukcijų (jos pirmą kartą labai ribotai (tiesiai šnekant - invalidiškai) panaudotos buvo tik "Pentium III", kaip "MMX" papildymas), leidžiančių vienu metu vykdyti tą pačią komandą grupei duomenų apdirbti. Būtent dėl tokio tipo komandų labai pagarsėjo 1967-1973 sukurtas "ILLIAC IV" kompiuteris - tūkstančiai jo procesorių vienu metu vykdydavo vieną ir tą pačią komandą, bet kiekvienas - su savais duomenimis. Tokia schema leido atsisakyti daugelio instrukcijų atpažinimo ir pan. mechanizmų, sumažinant "ILLIAC IV" kainą ir kartu smarkiai padidinant našumą. Analogiškos metodikos buvo panaudotos ir jau minėtame rusiškame "M-10" kompiuteryje.

Vidutinio ir didelio našumo procesorių rinkoje "CISC" žlugimą galutinai pademonstravo "Intel" pasirinkimas, kuriant "Intel 486" procesorius: šį kartą, vitoje to, kad kurti eilinį, dar sudėtingesnį "CISC" gargarą, "Intel" sukūrė didelio našumo "RISC" procesorių, turintį registrų rinkinį ir adresacijos mechanizmus, būdingus "Intel 80386" procesoriui, o paskui prie viso to prikabino aparatinį transliatorių, kuris tiesiog keičia "80386" komandas į "RISC" branduolio komandas bei jų sekas. Nors, iš pirmo žvilgsio, tokia schema atrodo dar sudėtingesnė, nei ankstesnė "80386", realiai ji gali turėti netgi mažiau loginių elementų, o dirbti daug greičiau. "Intel" sprendimas pasiteisino: "486" procesorius, esant tam pačiam taktiniam dažniui, dirbo 2 kartus greičiau už "386", tad tokiu keliu "Intel" (kaip, beje ir "AMD", "Cyrix" bei kiti) eina iki šiol. Kraštutinį žingsnį šioje srityje žengė "Transmeta" kompanija, išleidusi "Crusoe" procesorius: pastarieji yra tipiški "RISC" procesoriai, turintys komandų rinkinį, išplėstą efektyvesniam kitų procesorių emuliavimui. Rezultate šie procesoriai, turėdami praktinius "RISC" privalumus (mažas energijos naudojimas, paprastumas ir pigumas), našumu prilygsta to paties taktinio dažnio "Intel" procesoriams. Kartu "Crusoe" aparatiškai nėra susieti su "x86" architektūra, tad, bent jau teoriškai, gali emuliuoti ir kitų architektūrų procesorius.


Jei pabandytume sukurti našumui optimizuotą, minimalų elementų skaičių turintį procesorių, turintį labai trumpą darbinį žodį, susidurtume su paprasta problema: tuo atveju, jei naudosime greičiausią (sinchroniškai su aritmetiniu įrenginiu dirbančią) komandų ir registrų žymėjimo schemą, pagrįsta identifikacija pagal pavienius bitus, remiantis jų prioritetais, į 8 bitų režimu galėsime panaudoti vos keletą registrų bei komandų. Norint kreiptis į duomenis, mums reiks mažiausiai vieno adresų registro, norint apdirbinėti masyvus ar naudoti sąlyginę adresaciją, mums prireiks indeksų registro. Dar dviejų registrų prireiks, norint atlikti bet kokias aritmetines operacijas. Taigi, 4 iš 8 bitų susinaudos. 4 bitai liks komandoms. Tačiau, esant ribotam registrų skaičiui bei ribotoms galimybėms, mums 4 komandų jau nepakaks. Juo labiau, kad dalis komandų naudos du operandus, taigi nepakaks nurodyti kad naudojamas registras A ir registras B, o teks dar ir nurodyti registrų panaudojimo tvarką. Štai čia ir prasideda inžinierių gudrybės: pvz., vietoje registrų imama naudoti akumuliatorius. Tokiu atveju, vykdant skaičiavimus, rezultatas visada bus permetamas į konkretų registrą.


Registras Registro aprašymas Komandos Paaiškinimai
Accum Į šį registrą duomenys permetami po operacijos su Data1 ir Data2. Pvz., ADD sudeda šiuos registrus ir reikšmę patalpina į Accum. XCHG DataR Apkeisti duomenimis Accum ir DataR
Data1 Šie du registrai vienodi, jie naudojami duomenims, su kuriais bus vykdomi veiksmai, saugoti. Aprašyme jie žymimi kaip DataR, kur R lygus registro numeriui (1 arba 2). Šie registrai netinkami adresacijai, tačiau jais gali būti atliekamos įvairios aritmetinės operacijos. Visų aritmetinių operacijų, išskyrus INC ir DEC, rezultatai patalpinami į Accum registrą. XCHGD Sukeisti reikšmėmis Data1 ir Data2
Data2 INC DataR Pridėti prie DataR 1
DEC DataR Atimti iš DataR 1
ADD Sudėti DataR, gautą rezultatą patalpinti į Accum
SUB DataR Atimti iš nurodyto DataR registro kitą registrą, rezultatą patalpinti į Accum
GETA DataR Patalpinti į DataR reikšmę, kurios adresas yra Address registre.
GETI DataR Patalpinti į DataR reikšmę, kurios adresas yra Base ir Index registrų suma.
PUTA DataR Patalpinti DataR reikšmę į atminties ląstelę, kurios adresas yra Address registre.
PUTI DataR Patalpinti DataR reikšmę į atminties lastelę, kurios adresas lygus Base ir Index sumai.
   
Address Šis registras naudojamas, dirbant su atmintimi, pvz, komanda MOV Data1 permeta duomenis, kurių adresas yra Address registre į registrą Data1. Šis registras netinkamas jokiems aritmetiniams veiksmams, tačiau jis vienintelis, pagal kurį gali veikti perėjimo komandos. ADDR CONST Įkelti konstantinę reikšmę į Address
ADDR DataR Įkelti DataR reikšmę į Address
Base Bazinis registras, naudojamas tik netiesiogiai, kartu su Index registru. Bazinis registras nurodo atminties adresą, prie kurio pridedamas Index, kai naudojama indeksuotoji adresacija. Iš esmės, jis naudojamas tik neakivaizdžiai. BASE CONST Įkelti konstantinę reikšmę į Base
BASE DataR Įkelti DataR reikšmę į Base
Index Šis registras naudojamas tada, kai reikia nuosekliai kreiptis į greta esančius duomenis arba kai reikia turėti skaitliuką. Su juo pakanka atlikti vieną aritmetinę operaciją - inkrementavimą. CLEAR Index Išvalyti Index
MOVI DataR Įkelti į Index reikšmę, esančią DataR registre.
MOVI CONST Įkelti į Index konstantinę reikšmę.
INC Index Pridėti prie Index 1
DEC Index Atimti iš Index 1
Flags Šis registras saugo loginius ankstesnių operacijų rezultatus. Kiekvienos rūšies rezultatui paskiriamas vienas bitas. Tiesiogiai Flags registro reikšmės gali būti neprieinamos, bet jos gali nustatyti, ar bus vykdoma sąlyginio perėjimo komanda. Pvz., komanda JUMPZ ADDR bus įvykdyta, tik jei paskutinio aritmetikos veiksmo rezultatas bus lygus nuliui. JZ CONST Pereitį į konstantinį adresą, jei paskutinės operacijos rezultatas lygus nuliui.
JNZ CONST Pereiti į konstantinį adresą, jei paskutinės operacijos rezultatas nelygus nuliui.
JZ Address Pereiti į adresą, esantį Address registre, jei paskutinės operacijos rezultatas lygus nuliui.
JNZ Address Pereiti į adresą, esantį Address registre, jei paskutinės operacijos rezultatas nelygus nuliui.
- Yra ir keletas komandų, nenaudojančių jokių registrų arba vykdomų besąlygiškai. Nors vienas iš JMP variantų ir naudoja adresų registrą, jis išsiskiria, nes neskirtas manipuliavimui jokiais duomenimis. JMP Address Pereiti į adresą, esantį Address registre
JMP CONST pereiti pagal konstantinį adresą.
   
Taigi, šioje lentelėje mes gavome 14 skirtingų vienoperandžių komandų ir 11 komandų, naudojančių duomenų registrus. Kiekvieną iš pastarųjų mes galime skaičiuoti, kaip 2 skirtingas komandas. Tokiu atveju turėsime iš viso 36 komandas.

Norėdami užkoduoti tokių komandų rinkinį, galėsime pasinaudoti paprastu interpretatoriumi:
0 1 2 3 4 5 6 7
0 1 2 3 4 Index CONST DataR
er er er er er er er
er er er
er er er er er
er er er er er er
er er er er er er er
er er er
er er er er er
er er er er er er
er er er er er
er er
er    
er er er   er
er er er er
er er
er er er
er er er er er

Norint


"CISC" architekturos paremtos idėja, kad programos bus vykdomos greičiau, jei jos bus sudarytos iš šimtu ar tukstanchiu skirtingu, specializuotu komandu. Tipishkas tokiu procesoriu pavyzdys - ivairus xxx86 architekturos procesoriai. Dar pirmieji 8086 procesoriai turejo daugiau kaip shimta skirtingu komandu. Naujesni, pvz., Pentium procesoriai ivairiu komandu turi dar daug kartu daugiau. Ivairios komandos tokiuose procesoriuose turi daugybe variaciju. Tai, atseit, turetu padidinti procesoriu darbo greiti, nes programas butu galima efektyviau optimizuoti. Deja, kaip bebutu gaila, pirmuju CISC architekturu shalininkai klydo. Devintajame deshimtmetyje, atsiradus zhymiai sudetingesniems procesoriams, paaishkejo, kad komandu skaichiaus didinimas procesoriaus efektyvuma tiktai sumazhina. Priezhastys kelios: Visu pirma, dvi panashios komandos, skirtos tik truputeli skirtingiems dalykams, dirbs tik truputeli greichiau, nei viena, bet universali komanda. Del to, net ir idealiu atveju, nashumas padides labai nezhymiai. Antra, keleriopai sudetingesnis procesorius, turintis keleriopai dauigau komandu, tures ir zhymiai letesni komandu ishrinkimo bei identifikavimo mechanizma. Del to procesoriaus greitis gali smarkiai sumazheti. Trechia - itin sudetingus procesorius itin sunku optimizuoti. Sunku ir atidirbti tokiu procesoriu schemas, bet dar sunkiau optimizuoti tokius procesorius, pritaikant juos realaus kodo vykdymui bei analizei. Rezultatas - tokie sudetingi procesoriai dirba labai ish leto. Ketvirtas, itin svarbus dalykas - efektyviai optimizuojanchius kompiliatorius CISC procesoriams sukurti yra zhymiai kebliau, nei RISC, del to daugelis programu nesugeba efektyviai pasinaudoti tomis "galingomis" CISC komandomis. Rezultatas aishkus - del per didelio sudetingumo CISC procesoriai tampa neefektyviais. Ashtuntame deshimtmetyje tarp daugelio procesoriu kureju eme plisti mintis, kad procesorius supaprastinus, butu galima juos efektyviai optimizuoti. Viska optimizavus, nedideli komandu rinkineli turintys procesoriai galetu dirbti greichiau uzh sudetingus. Negana to, jie kainuotu bent kelis kartus pigiau. Dar daugiau - jie butu ekonomishki, ir del to galetu dirbti neshiojamuose kompiuteriuose. Ideja pasiteisino, o greitai ji buvo dar patobulinta. Paaishkejo, kad su paprastais procesoriais galima naudoti itin rafinuotus programu greichio didinimo metodus - pavyzdzhiui, aptikti, kokios komandos kada bus vykdomos, ir reikalingas pakrauti i procesoriaus kesha ish anksto. Taip pat, kai kurias, programoje nuosekliai nurodytas komandas vykdyti vienu metu - paraleliai. Svarbiu dalyku tapo ir ypatingai mazhos RISC procesoriu energijos sanaudos: jei procesorius ekonomishkas, jis mazhai kaista, o jei jis mazhai kaista, galima i ta pati kristala ideti kad ir didesni kesha, ir kartu padidinti kesho taktini dazhni. Betobulindami RISC architekturas, matematikai sukure ir keleta daugiau kuriozishku, nei naudingu architekturu. Tachiau jos tikrai idomios - pavyzdzhiui, vienoje ish tokiu architekturu procesorius turi tik viena(!!!) komanda, kuriai perduodamas tik vienas(!!!) parametras. Nepaisant to, shios komandos pakanka tam, kad parashyti bet kokias programas. Devinto deshimtmechio viduryje procesoriu gamintojai isitikino, kad RISC procesoriu greitis yra bent kelis kartus didesnis, nei CISC. Tuo isitikino net ir Intel, pabandzhiusi savo 80286 procesorius pakeisti RISC architekturos 80860 procesoriais. Deja, del nepilno programinio suderinamumo nauji Intel procesoriai nepaplito. Ishpopuliarejo pagalbiniams tikslams skirtas, su 80286 suderinamas 80386. Greitai Intel isitikino, kad 80386, kuris buvo skirtas greitai 8086 emuliacijai, gavosi toks sudetingas, kad jo patobulinti jau neisheina. Shis procesorius tapo paskutiniu galingu Intel sukurtu 100% tikru CISC procesoriumi. Po to Intel procesorius eme tobulinti gudriau. Jau Intel 486 turejo RISC branduoli, kuris ish tikruju ir vykde visas operacijas. Branduolys buvo sukurtas Intel 80860 procesoriu pagrindu. Komandas ish CISC i RISC transliavo specialus papildomas irenginys, esantis tame pachiame kristale, kaip ir procesorius. Greitai prie panashiu architekturu perejo ir Intel procesoriu klonuotojai - Cyrix bei AMD. Pastaroji firma RISC tipo procesoriais uzhsieme bene ankschiau uzh Intel, bet irgi nesekmingai. Visi shiuolaikiniai xxx86 tipo procesoriai dabar gaminami taip, kaip sumane Intel - jie turi RISC branduoli, kuris tiesiog emuliuoja CISC komandu rinkini. Aishku, del emuliacijos tokie procesoriai dirba daug lechiau, nei galetu. Kita vertus, tokiu sudetingu CISC procesoriu, kaip Pentium, nenaudojant RISC branduolio, gali net nepavykti sukurti. Tur but ryshkiausias panashiu architekturu pavyzdys - tai nauji Transmeta firmos Crusoe procesoriai. Jie net neturi aparatinio transliatoriaus, del to yra zhymiai lankstesni ir paprastesni uzh Intel Pentium, bet kartu sugeba emuliuoti Pentium procesorius beveik tokiu pat greichiu. Kitos firmos gamina daugeli kitu RISC procesoriu. Labiausiai pagarseje ish tokiu procesoriu - tai Digital(dabar Compaq padalinys) Alpha procesoriai, IBM ir Motorola firmu sukurti PowerPC, Silicon Graphics(dabar - tiesiog SGI) MIPS, Hewlett Packard firmos PA-RISC ir ivairus Sun Microsystems Sparc. Deja, idealios architekturos turbut nera. Shiuolaikiniai RISC procesoriai turi daug komandu - kai kada beveik shimta, o tai jau panashiau i CISC, nei i RISC. Tad faktishkai tipishki shiuolaikiniai procesoriai yra RISC ir CISC mishinys. {text}
   
   

Burgzt Banner Exchange
   
         

Ričardas Savukynas © (C), Vilnius, 2002, Visos teisės išsaugotos, naudojant medžiagą, nuoroda būtina.