Pipelining
Z Wikipedie, otevřené encyklopedie
Pipelining nebo-li zřetězené zpracování, či překrývání instrukcí. Základní myšlenkou je rozdělení zpracování jedné instrukce mezi různé části procesoru a tím i dosažení možnosti zpracovávat více instrukcí najednou. Fáze zpracování je rozdělena minimálně na 2 úseky:
- Načtení a dekódování instrukce
- Provedení instrukce a případné uložení výsledku
To vedlo k vytvoření procesoru složeného ze dvou spolupracujících subprocesorů (skalární architektura), kdy každá část realizuje danou fázi zpracování. Procesor má části – EU (Execution Unit) a BIU (Bus Interface Unit). Zřetězení se stále vylepšuje a u novějších procesorů se již můžeme setkat stále s více řetězci rozpracovaných informací (více pipelines). Z toho vyplývá, že je možno dokončit více, než 1 instrukci za 1 hodinový cyklus (takt procesoru).
[editovat] Běžná RISCová pipeline
Za jakýsi standard je považována pipeline s pěti stupni, implementována například v prvních procesorech MIPS, SPARC a Motorola 88000. Jedná se o následující stupně:
- Instruction fetch - vyzvednutí instrukce
- Decode - dekódování instrukce, zároveň se načítají registry
- Execute - provedení instrukce
- Access - čtení z paměti
- Writeback - zápis výsledku do registrů
[editovat] Predikce skoku
Jedním z problémů pipeliningu je fakt, že instrukce následující po skoku se vyzvedává dřív než je skok dokončen. Primitivní implementace vyzvedává vždy následující instrukci, což vede k tomu že se vždy mýlí, pokud je skok nepodmíněný. Pozdější implementace mají jednotku předpovídání skoku, která vždy správně předpoví (tedy předem dekóduje) nepodmíněný skok a s použitím cache se záznamem předchozího chování programu se pokusí předpovědět i cíl podmíněných skoků nebo skoků s adresou v registru nebo paměti.
V případě, že se predikce nepovede, bývá nutné vyprázdnit celou pipeline a začít vyzvedávat instrukce ze správné adresy, což znamená relativně velké zdržení.
Souvisejícím problémem je přerušení. Softwarová přerušení a výjimky jsou z hlediska procesoru skoky a je možné je predikovat, i když složitěji než obyčejné skoky. Hardwarová přerušení mohou oproti tomu dorazit kdykoliv bez předchozího upozornění, na druhou stranu v mnoha případech je možné „podvádět“ tak, že se přerušení nezačne provádět okamžitě, ale zařadí se na konec fronty, jakoby přišlo o několik instrukcí později. Znamená to ale další komplikaci při selhání predikce skoku - musí se totiž zrušit instrukce mezi skokem a přerušením, ale ne samotné přerušení, a cílovou adresu skoku uložit na zásobník pro návrat z přerušení.
[editovat] Pipeline v x86
Na architektuře x86 se pipeline objevila u procesoru Intel 80486, kde měla tři stupně. Procesor Intel Pentium měl dokonce dvě pipeline. Další procesory se dále komplikovaly: Intel Pentium 4 má pipeline s 31 stupni, ale je otázkou, zda toto číslo má smysl. Hlavním rozdílem totiž je, že od Pentium Pro (a AMD K5) fungují procesory x86 na principu překladu CISCových instrukcí na RISCové. Kromě toho jsou procesory superskalární, tedy dokáží v jednom stupni pipeline zpracovávat paralelně více instrukcí. První fáze tedy spočívají ve vyzvednutí instrukcí z paměti a jejich překladu na RISCové, které se pak provádějí mimo pořadí a paralelně. Může se stát i to, že jedna CISCová instrukce se rozdělí na dvě RISCové, z nichž jedna je již dokončena, zatímco druhá čeká na výkonnou jednotku.
I nejmodernější 64bitové procesory navazující na x86 ovšem zaručují, že z pohledu programátora se instrukce vykonávají sekvenčně a přerušení jsou doručena tak, že všechny instrukce před přerušením jsou dokončeny a žádná instrukce po přerušení následující neovlivnila stav procesoru. Co při vylepšování procesorů padlo jsou tabulky „ceny“ (tedy času trvání) instrukcí: spočítat, jak rychle se na moderním procesoru vykoná nějaká sekvence instrukcí je velmi obtížné a závisí na příliš mnoha parametrech, které se navíc v každém modelu procesoru liší. V dnešních procesorech jsou možná i paradoxní chování typu funkce, která trvá déle pokud z ní smažete část kódu.

