CISC

CISC () označuje v informatice skupinu procesorů vyznačujících se podobným návrhem sady strojových instrukcí. Označení complex vyjadřuje skutečnost, že strojové instrukce pokrývají velmi široký okruh funkcí, které by jinak šly naprogramovat pomocí jednodušších již obsažených strojových instrukcí (například násobení je možné nahradit sčítáním a bitovými posuny). Opakem procesorů CISC jsou procesory RISC, které obsahují redukovanou instrukční sadu.

Charakteristika 
Procesory CISC jsou charakteristické velmi košatou instrukční sadou strojových instrukcí, instrukce mají proměnlivou délku i dobu vykonání a procesor obsahuje relativně nízký počet registrů. Paradoxně se tak může stát, že operace provedená složenou instrukcí (například násobení) může být nahrazena sledem jednodušších strojových instrukcí (sčítání a bitové posuvy), které mohou být ve výsledku vykonány rychleji, než hardwarově implementovaná složená varianta.

Označení CISC bylo zavedeno jako protiklad až poté, co se prosadily procesory RISC, které mají instrukční sadu naopak  redukovanou (pouze jednoduché operace, tj. žádné složené, jsou stejně dlouhé a jejich vykonání trvá stejnou dobu).

Obvyklou chybou je domněnka, že procesory CISC mají více strojových instrukcí, než procesory RISC. Ve skutečnosti nejde o absolutní počet, ale o počet různých druhů operací, které procesor sám přímo umí vykonat na hardwarové úrovni (tj. již z výroby). Procesor CISC tak může například paradoxně obsahovat pouze jednu strojovou instrukci pro danou operaci (např. logická operace), zatímco procesor RISC může tuto operaci obsahovat jako několik strojových instrukcí, které stejnou operaci umí provést nad různými registry.

Historický kontext 
Předtím než se v procesorech prosadila architektura RISC, se designéři počítačů snažili o překonání tzv. sémantické mezery – navrhnout sady instrukcí tak, aby přímo podporovaly konstrukce vysokoúrovňových jazyků, např.: volání procedury, kontrola smyček. Tyto nové instrukce umožňovaly kombinovat data a přístupy k poli. Nové a kompaktní instrukce usnadnily tvorbu menších programů a zmenšení počtu přístupů do hlavní paměti, které byly značně pomalé. Zejména v 60. letech se užitím těchto instrukcí zrychlilo vykonávání operací a došlo i k šetření výdajů na počítačové paměti a disková úložiště. Kompaktnost nových instrukcí značně zvýšila produktivitu programování v jazyce symbolických adres i ve vysokoúrovňových jazycích (Fortran, nebo Algol).

Nové instrukce 
V 70. letech 20. století se analýzou vysokoúrovňových jazyků ukázala nutnost implementovat některé části strojového kódu – cílem bylo vytvořit nové instrukce, které zlepší výpočetní výkon. Byly vytvořeny a přidány některé instrukce, které nebyly pro jazyk symbolických adres původně zamýšleny, ale které velmi dobře pracovaly s vysokoúrovňovými jazyky. Kompilátory byly aktualizovány pro použití těchto nových instrukcí. Výhody sémanticky košatých instrukcí s kompaktním kódováním jsou využity v moderních procesorech, zejména v jejich cache, protože jejich kód je kratší a snadněji se do cache vejde.

Stránka designu 
Některé návrhy se vyznačují vysokou programovou propustností, nízkou cenou a také tím, že umožňují vyjádření vysokoúrovňových konstrukcí menším počtem instrukcí - tento přístup však není vždy vhodný. Jako ilustraci lze uvést užití nenáročné verze architektury, která je charakteristická malým množstvím hardwaru. U této architektury bylo možné dostat se do situace, kdy se výkon dal zvýšit použitím sekvence jednodušších instrukcí. Takový přístup však měl jeden hlavní nedostatek - návrháři navrhli některé instrukce jazyka symbolických adres tak, že jejich funkce nebylo možné implementovat na základním hardwaru, který byl k tomu k dispozici. Příkladem bylo provedení nastavení registru, nebo místa v paměti, jež bylo zřídka užíváno, přes vnitřní, nebo vnější sběrnici. Takováto činnost by vždy vyžadovala zvláštní cykly navíc.

I ve vyvážených high-performance návrzích s vysokoúrovňovými instrukcemi je komplikované dekódování a efektivní vykonávání v omezeném souboru tranzistorů. Takové architektury tedy vyžadují velké množství práce v návrhu procesoru zejména v případě, že nejde užít jednodušší, ale také typicky pomalejší řešení založené na dekódovací tabulce, nebo mikrokódu.

Superskalár 
V moderním kontextu se pro komplikované, ale proveditelné sestavení superskalární implementace CISC programovacího modelu (Pentium, nebo Cyrix 6x86) užívá kódování s proměnnou délkou instrukcí. Úroveň paralelismu instrukcí, jež jsou vytěžovány z kódu, může být limitována častými přístupy do paměti pro operandy, přestože je to prováděno rychlou cache. Zásluhou "kompaktních" a sémanticky bohatých instrukcí je průměrný počet operací vykonaných na kódovou jednotku (na byte, nebo bit) pro CISC vyšší, než RISC procesor, což může být značnou výhodou v implementaci založené na moderní cache.

Tranzistory logiky a mikrokódu jsou nyní běžně dostupné, pouze velké a rychlé cache paměti jsou limitovány maximálním počet tranzistorů. Počet tranzistorů CISC dekodérů neroste exponenciálně jako počet tranzistorů na procesoru. Vzrůstající počet tranzistorů spolu s novými nástroji a technologiemi, vedou k implementaci návrhů s proměnnou délkou bez omezení load-store (mají ho RISC procesory). Těmito prostředky je na jedné straně umožněna opětovná aplikace starších architektur (například všudypřítomný x86), na druhé straně užití nových návrhů mikrokontrolerů pro embedded systémy. Superskalár je v případě moderní x86 řešen dynamicky vydávanými a bufferovanými mikrooperacemi (Pentium Pro a AMD K5).

Označení CISC a RISC 
Označení CISC a RISC přestalo mít význam s pokračujícím vývojem obou typů procesorů. První implementací typu x86 s vysokým pipeliningem byl 486 od Intelu, AMD, Cyrixu a IBM, který podporoval každou instrukci, jenž podporoval jeho preprocesor. Maximální výkonnosti dosahoval pouze s velmi jednoduchým x86 subsetem, který byl jen o něco více než typická RISC instrukční sada (bez typických RISC load-store omezení). Generace procesorů Intel P5 Pentium byla superskalární verzí založenou na těchto principech. Moderní x86 procesory dekódují a rozdělují instrukce do dynamických sekvencí mikrooperací, které nejen pomáhají vykonávat větší skupiny instrukcí metodou pipeliningu, ale také podporují pokročilejší paralelismus kódového streamu, pro ještě větší výkon.

Rozdíl CISC a RISC 
Široká instrukční sada procesorů CISC usnadňuje jejich programování, protože není některé operace nutné rozepisovat (například násobení), avšak ve strojovém kódu (nebo v jazyce symbolických adres) se dnes programuje jen minimálně. Složitost CISC procesorů vede k problémům při výrobě (velká spotřeba materiálu, větší pravděpodobnost vady, komplikovaný návrh, problémy s vysokými frekvencemi, pipelining, cache atd).

Typickými zástupci koncepce CISC jsou procesory rodiny Motorola 68000 a procesory postavené na architektuře Intel x86.

CISC s mikrokódem 
V současné době jsou některé CISC procesory konstruovány interně jako procesor RISC (jehož hardwarová výroba je jednodušší, snadněji se implementuje pipelining atd.). Tento interní mikroprocesor operuje s tzv. mikroinstrukcemi, pomocí nichž jsou interpretovány běžné strojové CISC instrukce (tzv. mikrokód). Jedna CISC instrukce je tak provedena jako několik elementárních RISC mikroinstrukcí. Takové CISC procesory jsou tak vlastně malé počítače řízené vlastním programem.

Aktualizace mikrokódu 
Mikrokód je u procesorů Intel (Pentium Pro a novějších) možné nahrazovat, čehož využívají výrobci procesorů k opravě chyb. Nový mikrokód se musí po každém zapnutí nahrávat znovu, protože je uložen ve volatilní paměti a mikroprocesor se po vypnutí vrací ke svému původnímu mikrokódu. K aktualizaci mikrokódu může být použit BIOS (v rámci POST testů po zapnutí počítače) nebo je možné ho nahradit i později (ovladač CPU v Microsoft Windows, nástroj microcode_ctl v Linuxu).

Literatura 
 Tanenbaum, Andrew S. (2006) Structured Computer Organization, Fifth Edition, Pearson Education, Inc. Upper Saddle River, NJ.

Reference

Související články 
 RISC

Externí odkazy 
 RISC vs. CISC comparison 

Procesory
Zkratky