Vyšlo v týdeníku Computerworld č. 6/94,
Vytištěno z adresy: http://www.earchiv.cz/a94/a406c503.php3

..až do dnešních dní

Tento článek vyšel v tzv. tématu týdne v CW 6/94, jako třetí ze série článků věnované prvopočátkům výpočetní techniky.

Na vývoji von Neumannovy architektury je zajímavé i to, že k největšímu počtu jejích vylepšení došlo poměrně brzy po jejím vzniku (zhruba do roku 1960). Poté následovalo určité období "klidu", a teprve později, v souvislosti s vývojem v oblasti polovodičových a jiných technologií, se zase objevují další zajímavá vylepšení původní von Neumannovy architektury.

Proudové zpracování (pipelining)

Ve snaze co možná nejvíce zvýšit výpočetní výkon svých procesorů, začali výrobci hledat nejrůznější cesty, cestičky, nové myšlenky, ale také skryté rezervy. A právě zde se ukázalo, že je možné ještě mnohé vylepšit, a současně s tím i mnohé získat.

Jedním ze zajímavých pozorování bylo, že provádění jednotlivých strojových instrukcí probíhá v určitých fázích: nejprve musí dojít k načtení instrukce z operační paměti, pak k jejímu dekódování, přípravě jejích operandů, pak může následovat výkonná fáze (která teprve dělá "to", co má strojová instrukce vykonat užitečného), načež může ještě následovat fáze ukládání cílových operandů (výsledků). Konkrétní počet fází přitom není příliš podstatný (navíc je na každém počítači různý). Podstatná je spíše skutečnost, že různé fáze obvykle provádí různé části procesoru. Jednotlivé fáze jedné a téže instrukce přitom na sebe sekvenčně navazují - to ale současně znamená, že v každém okamžiku se užitečné činnosti věnuje jen jedna v více částí procesoru, zatímco ty ostatní neúčelně zahálí! No a to přeci nebylo možné nechat jen tak!

Jak ale trvale vytížit všechny části procesoru? Provádět souběžně více různých fází jedné a téže instrukce není dost dobře možné, protože tyto na sebe příčinně navazují: není například možné současně načítat instrukci z paměti, a současně s tím i zapisovat někam výsledek jejího provedení. Tvůrci počítačů ovšem přišli na zajímavé řešení: nemohou-li současně prováděné fáze patřit jedné a téže instrukci, ať patří různým instrukcím!

Tato myšlenka znamená, že v procesoru se v každém okamžiku bude nacházet více strojových instrukcí v různém stádiu rozpracovanosti. Například: současně s výkonnou fází jedné instrukce se budou připravovat operandy následující instrukce, a současně s tím bude z paměti načítána ještě jedna další instrukce. Provádění jednotlivých instrukcí se tak bude v čase překrývat. Doba, potřebná k provedení jedné strojové instrukce, se tím sice vůbec nezkrátí, ale za jednotku času bude dokončeno několikanásobně víc strojových instrukcí (tolikrát víc, kolik instrukcí se bude najednou překrývat). Naráží to sice na některé zajímavé problémy (jak se zachovat v případě skoků, volání apod.), ale ty se dají uspokojivě řešit. Výsledný efekt, který právě naznačený mechanismus proudového zpracování (pipelining) nabízí, za jejich překonání určitě stojí. Svědčí o tom i skutečnost, že tento mechanismus je v nějaké podobě implementován snad v každém dnešním procesoru (resp. mikroprocesoru).

Samotná myšlenka překrývání instrukcí v procesoru (tj. proudového zpracování) je relativně starého data. Poprvé byl tento mechanismus použit již v 60. letech, v počítačích UNIVAC a IBM 7030-STRETCH.

Vyrovnávací paměť (paměť cache)

Prvotní motivací pro implementaci virtuální paměti bylo předstírání větší operační paměti, než jaká je doopravdy k dispozici (doplnit odkaz na článek: Od von Neumanna ...). Tím se podařilo vyjít vstříc uživatelům, volajícím po větší paměti, a uspokojit jejich požadavky s únosnými náklady.

Ovšem ne nadarmo se říká, že s jídlem roste chuť. Když uživatelé dostali k dispozici dostatečně velké objemy operační paměti (i když jen předstírané), začali požadovat stále rychlejší a rychlejší počítače. Jejich požadavky byly do značné míry motivovány pokroky ve výrobě procesorů, které začaly být opravdu velmi rychlé. Tak rychlé, že jim náhle přestala stačit operační paměť (ta reálně existující), a rychlý procesor se musel přizpůsobovat její rychlosti (či spíše pomalosti). Dostatečně rychlá paměť v té době sice také již existovala, ale v požadovaném objemu stále ještě vycházela příliš drahá. A tak se znovu opakovala situace, která zhruba deset let dříve vedla ke vzniku virtuální paměti, jen s poněkud pozměněnou motivací: bylo potřeba vymyslet nějaký trik, který by dokázal předstírat větší rychlost operační paměti.

Potřebný trik se kupodivu nemusel hledat dlouho - stačilo pouze oprášit tutéž myšlenku, která stojí za principem virtuální paměti: obsah té části operační paměti, se kterou právě probíhající program pracuje, se přesune "blíže k procesoru", do tzv. vyrovnávací paměti (též: paměti cache), která bude umístěna mezi procesorem a operační pamětí, bude výrazně menší než operační paměť, ale díky tomu zase bude moci být výrazně rychlejší. Jakmile pak právě probíhající program vysloví nějaký požadavek na přístup do operační paměti, budou se příslušná data hledat nejprve v této malé a rychlé vyrovnávací paměti, a teprve v případě neúspěchu se bude "sahat" až do skutečné operační paměti.

Tento vcelku jednoduchý trik, který byl poprvé použit v roce 1968 v počítači IBM 360/85, dokázal pravé zázraky. Jako příklad je často citován počítač IBM 370/165 z roku 1971, který měl feritovou operační paměť o kapacitě 1 MB a dobou cyklu 2 mikrosekundy, a byl vybaven polovodičovou vyrovnávací pamětí o kapacitě 16 kB, s přístupovou dobou 80 ns. Výsledný efekt tohoto uspořádání byl následující: z pohledu procesoru a probíhajícího programu se rychlost operační paměti zvýšila 8 až 10x (díky tomu, že v 70 až 90% případů se požadovaná data našla již v rychlé vyrovnávací paměti). Přitom náklady na pořízení rychlé vyrovnávací paměti představovaly jen cca 10% nákladů, které by musely být vynaloženy na pořízení stejně rychlé operační paměti.

Mechanismus vyrovnávacích pamětí (pamětí cache) vznikl a slavil velké úspěchy v době, kdy světu vládly právě feritové paměti, které byly poměrně pomalé, a rychlejší polovodičové paměti byly ještě velmi drahé. Cena polovodičových pamětí však rychle klesala, a tak tento druh pamětí záhy zcela vytlačil původní feritové paměti. S tím ovšem do značné míry odezněla i motivace, které vděčí za svůj vznik myšlenka vyrovnávacích pamětí.

Vyrovnávací paměti však nezmizely v propadlišti dějin. Na svou renesanci si ovšem musely chvíli počkat - do doby, než rychlost procesorů znovu vzrostla natolik, že předběhla možnosti polovodičových pamětí. Pak přišly znovu ke slovu vyrovnávací paměti, které se nyní začaly stěhovat také až do samotných procesorů (jako tzv. interní cache paměti)

Počítače s redukovaným souborem instrukcí (architektura RISC)

Výrobci velmi dlouhou dobu zastávali názor, že čím více různých instrukcí dokáží "napěchovat" do svých procesorů, tím lépe. Mysleli si, že uživatelé (resp. ti, kteří píší programy), dokáží plně využít všech schopností používaných procesorů. A tak neustále přidávali nové a stále komplikovanější strojové instrukce, vymýšleli nové a stále složitější způsoby adresování, a jejich procesory se v důsledku toho stávaly stále složitějšími a složitějšími.

Předpoklad výrobců mohl snad být oprávněný v době, kdy se programy psaly pouze v asembleru, a mohly se tak "šít na míru" konkrétním procesorům. Ovšem v době vyšších programovacích jazyků je tomu jinak. Jak ukázaly rozsáhlé testy velkého vzorku programů, nejvíce používána je jen malá skupina poměrně jednoduchých instrukcí, zatímco ostatní, relativně složitější instrukce, jsou používány jen velmi málo, a ty nejsložitější nejsou používány prakticky vůbec.

Samotné výsledky tohoto pozorování by ještě nemusely být argumentem proti procesorům s bohatým repertoárem strojových instrukcí. Skutečnost, že mám k dispozici bohaté prostředky, mne nenutí je používat všechny, a naopak mi nebrání využívat jen jejich malou část. Celá věc má ale jeden technický háček: procesor, který musí "pamatovat" na mnoho komplikovaných instrukcí, je nutně značně složitý (včetně svého řadiče), a tudíž i pomalý. Rozhodně pomalejší, než jaký může být takový procesor, který má jen málo strojových instrukcí, a navíc velmi jednoduchých.

No a právě tomuto pozorování vděčí za svůj vznik architektura RISC, což je zkratka od anglického: Reduced Instruction Set Computer, neboli: počítač s redukovaným souborem instrukcí. Je protipólem k tendenci vybavovat procesory co nejvíce instrukcemi (architektuře CISC, od: Complex Instruction Set Computer, neboli: počítač s úplným souborem instrukcí), a hlásá zcela opačnou zásadu: vybavit procesor jen malým repertoárem jednoduchých a maximálně rychlých strojových instrukcí.

První počítačem, jehož procesor vycházel z architektury RISC, byl minipočítač IBM 801 z roku 1980. Od té doby se objevila celá řada RISC-ových procesorů od nejrůznějších výrobců, a celá řada počítačů, používajících procesory s touto architekturou (například v lednu roku 1986 představila firma IBM svůj RT PC, neboli osobní počítač PC na bázi procesoru RISC).

Výhody architektury RISC oproti architektuře CISC jsou nesporné. Otevřenou otázkou, o které by bylo možné dlouho polemizovat, je ovšem míra těchto výhod, zvláště pak s uvážením technologických možností, které umožňují zrychlovat i procesory s bohatými instrukčními soubory. Pravdou je, že RISC-ové procesory dosud nevytlačily své CISC-ové konkurenty, a nic také příliš nenasvědčuje tomu, že by se tak v blízké době mělo stát.