Ortogonální instrukční sada - Orthogonal instruction set
V počítačové techniky , An ortogonální instrukční sada je sada instrukcí architektury , kde lze všechny typy instrukcí používat všechny adresování režimy . Je „ ortogonální “ v tom smyslu, že typ instrukce a režim adresování se liší nezávisle. Sada ortogonálních instrukcí neukládá omezení, které vyžaduje, aby určitá instrukce používala konkrétní registr, takže se funkčnost instrukcí málo překrývá.
Ortogonalita byla považována za hlavní cíl návrhářů procesorů v 70. letech a VAX-11 je často používán jako měřítko pro tento koncept. Zavedení konstrukčních filozofií RISC v 80. letech však významně obrátilo trend proti větší ortogonálnosti. Moderní CPU často simulují ortogonalitu v kroku předzpracování před provedením skutečných úkolů v jádru podobném RISC.
Základní pojmy
Ve svém jádru fungují všechny počítače pro všeobecné použití stejným způsobem; data uložená v hlavní paměti jsou načítána centrální procesorovou jednotkou (CPU) do rychlé dočasné paměti (např. registry CPU ), zpracována a poté zapsána zpět do hlavní paměti. Paměť se skládá ze souboru datových hodnot, kódovaných jako čísla a označovaných jejich adresami , také číselné hodnoty. To znamená, že stejné operace aplikované na data lze použít i na samotné adresy. Během práce lze data dočasně uchovávat v registrech procesoru , hodnotách zápisníku, ke kterým lze přistupovat velmi rychle. Registry se používají například při sčítání řetězců čísel do celkového počtu.
Jedna instrukce, jediný operand
V časných počítačích architektura instrukční sady (ISA) často používala jeden registr, v takovém případě byl známý jako akumulátor . Pokyny zahrnovaly adresu operandu. Například instrukce by způsobila, že CPU načte číslo v paměti nalezené na této adrese a poté jej přidá k hodnotě již v akumulátoru. Tento velmi jednoduchý příklad ISA má „formát jedné adresy“, protože každá instrukce obsahuje adresu dat.
ADD address
Jedno-adresové stroje mají tu nevýhodu, že i jednoduché akce, jako je přidání, vyžadují více instrukcí, z nichž každá zabírá omezenou paměť, a vyžaduje čas na přečtení. Uvažujme o jednoduchém úkolu sčítání dvou čísel, 5 + 4. V tomto případě by program musel načíst hodnotu 5 do akumulátoru s instrukcí, použít instrukci směřující na adresu pro 4 a nakonec uložit výsledek , 9, zpět na jiné místo v paměti.
LOAD address
ADD address
SAVE address
Jedna instrukce, více operandů
Další vylepšení lze nalézt například zadáním adresy obou operandů v jedné instrukci . Takové ISA „ve dvou adresách“ jsou velmi běžné. Jeden může dále rozšířit koncept na "formát tří adres", kde je také složen do rozšířeného .
ADD address 1, address 2
SAVE
ADD address 1, address 2, address of result
Často se stává, že základní počítačové slovo je mnohem větší, než je potřeba k uložení pouze instrukce a adresy, a ve většině systémů existují zbylé bity, které lze použít k udržení konstanty místo adresy. Pokyny lze dále vylepšit, pokud umožňují nahradit některý z operandů konstantou. Například eliminuje jeden paměťový cyklus a další.
ADD address 1, constant 1
ADD constant 1, constant 2
Více dat
Další složitost nastává, když vezmeme v úvahu běžné vzorce, ve kterých se přistupuje k paměti. Jeden velmi běžný vzor je ten, že lze použít jednu operaci na velké množství podobných dat. Například je možné přidat 1000 čísel. V jednoduchém dvouadresovém formátu instrukcí neexistuje způsob, jak adresu změnit, takže musí být v strojovém jazyce napsáno 1 000 dodatků . ISA tento problém řeší konceptem nepřímého adresování , kdy adresa dalšího datového bodu není konstantní, ale sama se drží v paměti. To znamená, že programátor může změnit adresu provedením přidání na tomto paměťovém místě. ISA také často zahrnují schopnost kompenzovat adresu z počátečního umístění přidáním hodnoty uchovávané v jednom z jejích registrů, v některých případech speciálního rejstříku . Ostatní provádějí toto přidání automaticky jako součást pokynů, které jej používají.
Rozmanitost režimů adresování vede k hojnosti mírně odlišných pokynů. Když vezmeme v úvahu ISA s jednou adresou ADD
, máme pro jedinou instrukci nyní mnoho možných „režimů adresování“:
- Okamžitá (konstanta): - přidá konstantní hodnotu k výsledku v akumulátoru
ADD.C constant 1
- Přímá adresa: - přidejte hodnotu uloženou na adrese 1
ADD.A address 1
- Paměť nepřímá: - načtěte hodnotu na adrese 1, použijte tuto hodnotu jako jinou adresu a přidejte tuto hodnotu
ADD.M address 1
Mnoho ISA má také registry, které lze použít pro adresování i matematické úlohy. To lze použít ve formátu jedné adresy, pokud je použit jeden registr adres. V takovém případě bude k dispozici řada nových režimů:
- Registrovat přímo: - přidejte hodnotu uloženou na adrese uložené v registru jedna
ADD.R register 1
- Posunutí: - přidejte konstantu do registru adres a poté přidejte hodnotu nalezenou v paměti na výsledném místě
ADD.D constant 1
- Rejstřík: - přidejte hodnotu v registru 1 do registru adres, abyste vytvořili novou adresu, a poté přidejte hodnotu v tomto umístění do akumulátoru
ADD.I register 1
- Autoindex: - jako v případě indexu, ale automaticky zvýší adresu
ADD.AI register 1
Ortogonalita
Ortogonalita je zásada, že každá instrukce by měla být schopna používat jakýkoli podporovaný režim adresování. V tomto příkladu, pokud ADD
je k dispozici verze s přímým adresováním , by měly být také všechny ostatní. Důvod tohoto návrhu není estetický, cílem je zmenšit celkovou velikost objektového kódu programu . Poskytnutím různých režimů adresování umožňuje ISA programátorovi zvolit ten, který přesně odpovídá potřebě jejich programu v daném okamžiku, a tím snížit potřebu používat více instrukcí k dosažení stejného cíle. To znamená, že je snížen celkový počet instrukcí, což šetří paměť i zlepšuje výkon. Ortogonalita byla často popisována jako vysoce „bitově efektivní“.
Jelikož konečným koncem ortogonálního designu je jednoduše umožnit jakékoli instrukci použít jakýkoli typ adresy, implementace ortogonality je často jednoduše případem přidání více kabelů mezi části procesoru. Přidává však také na složitosti dekodéru instrukcí, obvodů, které načtou instrukci z paměti v místě, na které ukazuje čítač programu, a poté se rozhodnou, jak ji zpracovat.
Ve výše uvedeném příkladu ISA má ADD.C
instrukce používající přímé kódování již data potřebná ke spuštění instrukce a není potřeba žádné další zpracování, dekodér jednoduše pošle hodnotu do aritmetické logické jednotky (ALU). Pokud ADD.A
je však použita instrukce, musí být načtena adresa, načtena hodnota na tomto paměťovém místě a pak může ALU pokračovat. Dokončení této série událostí bude trvat mnohem déle a vyžaduje více interních kroků.
Výsledkem je, že čas potřebný k dokončení různých variací instrukce se může značně lišit, což zvyšuje složitost celkového designu CPU. Proto ortogonalita představuje kompromis v designu; návrhář počítače se může rozhodnout nabídnout programátorovi více režimů adresování, aby zlepšil hustotu kódu za cenu, že samotný CPU bude složitější.
Když byla paměť malá a drahá, zejména v době paměti bubnu nebo jádrové paměti , byla ortogonalita velmi žádoucí. Složitost však často přesahovala to, čeho lze dosáhnout pomocí současné technologie. Z tohoto důvodu většina strojů ze šedesátých let nabízela jen částečnou ortogonalitu, kolik si designéři mohli dovolit. Bylo to v 70. letech, kdy zavedení rozsáhlé integrace významně snížilo složitost počítačových návrhů a začaly se objevovat plně ortogonální návrhy. V 80. letech bylo možné takové designy implementovat na jednočipovém CPU.
Na konci 70. let, kdy se objevily první vysoce výkonné plně ortogonální designy, se cíl rozšířil a stal se počítačovou architekturou na vysoké úrovni , zkráceně HLLCA. Stejně jako byla požadována ortogonalita ke zlepšení bitové hustoty jazyka stroje, cílem HLLCA bylo zlepšit bitovou hustotu jazyků na vysoké úrovni, jako je ALGOL 68 . Tyto jazyky obecně používaly aktivační záznam , typ komplexního zásobníku, který ukládal dočasné hodnoty, které standardy ISA obecně nepodporovaly přímo a musely být implementovány pomocí mnoha individuálních pokynů ze základního standardu ISA. Přidání podpory pro tyto struktury by umožnilo přímější překlad programu do ISA.
Ortogonalita v praxi
PDP-11
PDP-11 byl v podstatě ortogonální (primárně s výjimkou instrukcí s plovoucí desetinnou čárkou). Většina celočíselných instrukcí mohla fungovat na 1bajtových nebo 2bajtových hodnotách a mohla přistupovat k datům uloženým v registrech, uloženým jako součást instrukce, uloženým v paměti nebo uloženým v paměti a odkazovaným na adresy v registrech. Běžné instrukce využívající všechny běžné datové režimy mohou ovlivnit dokonce i PC a ukazatel zásobníku . Režim „Okamžitý“ (pevně zakódovaná čísla v instrukci, například ADD # 4, R1 (R1 = R1 + 4) byl implementován jako režim „nepřímý registr, autoincrement“ a specifikování počitadla programu (R7) jako registru pro použití odkazu pro indirection a autoincrement.
PDP-11 používal 3bitová pole pro režimy adresování (0-7) a registry (R0 – R5, SP, PC), takže bylo (elektronicky) 8 režimů adresování. Okamžité a absolutní adresové operandy aplikující dva režimy automatického zvyšování na čítač programu (R7), poskytly celkem 10 režimů koncepčního adresování.
VAX-11
VAX-11 rozšířen na PDP-11 je ortogonalita na všechny datové typy, včetně čísel s plovoucí desetinnou čárkou. Pokyny jako „ADD“ byly rozděleny do variant závislých na velikosti dat, jako jsou ADDB, ADDW, ADDL, ADDP, ADDF pro přidání bajtu, slova, dlouhého slova, zabaleného BCD a plovoucí desetinné čárky s přesnou přesností. Stejně jako PDP-11 byly Stack Pointer a Program Counter v souboru obecného registru (R14 a R15).
Obecná forma instrukce VAX-11 by byla:
opcode [ operand ] [ operand ] ...
Každá složka je jeden bajt , operační kód má hodnotu v rozsahu 0–255 a každý operand se skládá ze dvou křivek , přičemž horní 4 bity specifikují režim adresování a spodní 4 bity (obvykle) specifikují číslo registru (R0 – R15 ).
Na rozdíl od 3bitových polí PDP-11 vedly 4bitové dílčí bajty VAX-11 k 16 režimům logického adresování (0–15). Režimy adresování 0–3 však byly „krátké okamžité“ pro okamžitá data 6 bitů nebo méně (2 bity nízkého řádu režimu adresování jsou 2 bity vyššího řádu okamžitých dat, pokud jsou přidány ke zbývajícím 4 bitům v tomto bajtu adresování dat). Vzhledem k tomu, že režimy adresování 0-3 byly identické, bylo vyrobeno 13 (elektronických) režimů adresování, ale stejně jako v PDP-11, použití Stack Pointer (R14) a Program Counter (R15) vytvořilo celkem více než 15 koncepčních režimů adresování (s tím, že program assembleru převádí zdrojový kód do skutečného režimu adresování zásobníku nebo ukazatele programu založeného na čítači programu).
MC68000 a podobné
Designéři společnosti Motorola se pokusili vytvořit montážní jazyk ortogonální, zatímco základní strojový jazyk byl o něco méně. Na rozdíl od PDP-11 používal MC68000 (68k) samostatné registry k ukládání dat a adres dat v paměti. ISA byl ortogonální do té míry, že adresy mohly být použity pouze v těchto registrech, ale neexistovalo žádné omezení, který z registrů lze použít různými pokyny. Podobně byly datové registry napříč instrukcemi také ortogonální.
Naproti tomu řada NS320xx byla původně navržena jako jednočipové implementace modelu VAX-11 ISA. I když se to muselo změnit kvůli právním problémům, výsledný systém si zachoval většinu celkové filozofie designu VAX-11 a zůstal zcela ortogonální. To zahrnovalo odstranění samostatných datových a adresních registrů nalezených v 68k.
8080 a následují designy
8bitový mikroprocesor Intel 8080 (stejně jako 8085 a 8051) byl v podstatě mírně rozšířený design založený na akumulátoru, a proto nebyl ortogonální. Programátor nebo spisovatel kompilátoru musel mít na paměti, jaké operace jsou v každém registru možné: Většina 8bitových operací mohla být provedena pouze na 8bitovém akumulátoru (A-registr), zatímco 16bitové operace mohly být prováděny pouze na 16bitovém ukazateli / akumulátoru (dvojice registrů HL), zatímco jednoduché operace, jako je přírůstek, byly možné na všech sedmi 8bitových registrech. To bylo z velké části způsobeno touhou udržovat všechny operační kódy jeden bajt dlouhý.
Tyto binární kompatibilní Z80 později přidány předpony kódy uniknout z tohoto limitu 1 bajt a umožňují výkonnější instrukční sady. Stejná základní myšlenka byla použita pro Intel 8086 , ačkoli, aby bylo možné radikálnější rozšíření, zde se nepokusil o binární kompatibilitu s 8080. Zachovala určitý stupeň neortogonality kvůli vysoké hustotě kódu v té době. 32bitové rozšíření této architektury, které bylo představeno s 80386 , bylo poněkud ortogonální navzdory zachování všech pokynů 8086 a jejich rozšířených protějšků. Nicméně, kódování-strategie používá stále ukazuje mnoho stopy z 8008 a 8080 (a Z80). Například jednobajtové kódování zůstává pro určité časté operace, jako je push a pop registrů a konstant; a primární akumulátor, registr EAX , používá u určitých typů operací kratší kódování než ostatní registry. Pozorování jako tato jsou někdy využívána pro optimalizaci kódu v kompilátorech i v ručně psaném kódu.
RISC
Řada studií v 70. letech prokázala, že flexibilita nabízená ortogonálními režimy byla ve skutečných problémech používána jen zřídka nebo nikdy. Zejména úsilí společnosti IBM studovalo stopy kódu běžícího na systému System / 370 a prokázalo, že ve skutečných programech byl použit pouze zlomek dostupných režimů. Podobné studie, často o VAX, prokázaly stejný vzorec. V některých případech se ukázalo, že složitost instrukcí znamenala, že jejich provedení trvalo déle než sekvence menších instrukcí, přičemž kanonickým příkladem byla INDEX
instrukce VAX .
Během stejného období polovodičové paměti rychle rostly a snižovaly náklady. Rychlost se však nezlepšovala stejnou rychlostí. To znamenalo, že čas potřebný pro přístup k datům z paměti rostl v relativním vyjádření ve srovnání s rychlostí CPU. To argumentovalo pro zahrnutí více registrů, což dalo CPU dočasnější hodnoty pro práci. Větší počet registrů znamenal, že ke kódování čísla registru bude zapotřebí více bitů v počítačovém slově, což naznačuje, že počet samotných pokynů bude snížen, aby se uvolnilo místo.
Nakonec článek Andrewa Tanenbauma ukázal, že 97% všech konstant v programu je mezi 0 a 10, přičemž 0 představuje mezi 20 a 30% z celkového počtu. Mezi 30 a 40% všech hodnot v programu jsou navíc konstanty, s jednoduchými proměnnými (na rozdíl od polí apod.) Dalších 35 až 40%. Pokud procesor používá větší instrukční slovo, například 32 bitů, lze v jedné instrukci zakódovat dvě konstanty a číslo registru, pokud samotná instrukce nepoužívá příliš mnoho bitů.
Tato pozorování vedla k upuštění od ortogonálního designu jako primárního cíle návrhu procesoru ak vzestupu filozofie RISC v 80. letech. Procesory RISC mají obecně pouze dva režimy adresování, přímý (konstantní) a registr. Všechny ostatní režimy nalezené ve starších procesorech jsou zpracovány explicitně pomocí instrukcí pro načítání a ukládání, které přesouvají data do az registrů. Může být k dispozici pouze několik režimů adresování a tyto režimy se mohou lišit v závislosti na tom, zda instrukce odkazuje na data nebo zahrnuje přenos řízení .
Poznámky
Reference
- ^ Null, Linda; Lobur, Julia (2010). Základy počítačové organizace a architektury . Vydavatelé Jones & Bartlett. 287–288. ISBN 978-1449600068 .
- ^ Tariq, Jamil (1995), „RISC vs CISC: Why less is more“ , IEEE Potentials (srpen / září) , vyvoláno 7. května 2019
- ^ „Základní organizace a design počítače“ (PDF) . Laboratoř výpočetních senzoricko-motorických systémů.
- ^ a b c d e Tullsen, Deane. „Architektura sady instrukcí“ (PDF) . UCSD.
- ^ a b c d e f g Hennessy, John; Patterson, David (2002-05-29). Počítačová architektura: kvantitativní přístup . str. 151. ISBN 9780080502526 .
- ^ „Úvod do PDP-11“ . University of Sydney .
- ^ a b „Návod k použití PDP-11“ (PDF) . University of Toronto .
- ^ a b c „Další přístup k architektuře instrukčních sad - VAX“ (PDF) . University of Bremen .
- ^ Veronis, Andrew (06.12.2012). Mikroprocesor 68000 . str. 54. ISBN 9781468466478 .
- ^ Tilson, Michael (říjen 1983). "Přesun Unixu na nové stroje" . BYTE . str. 266 . Vyvolány 31 January 2015 .
- ^ „NS32532“ . Datormuseum .
- ^ Patterson, DA ; Ditzel, DR (1980). Msgstr "Případ počítače se sníženou instrukční sadou". Zprávy počítačové architektury ACM SIGARCH . 8 (6): 25–33. CiteSeerX 10.1.1.68.9623 . doi : 10,1145 / 641914.641917 . S2CID 12034303 .
- ^ Tanenbaum, Andrew (1978). "Dopady strukturovaného programování na architekturu strojů" . Komunikace ACM . 21 (3): 237–246. doi : 10,1145 / 359361,359454 . hdl : 1871/2610 . S2CID 3261560 .