Pipelining

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Pipelining neboli zřetězené zpracování, či překrývání strojových 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:

  1. Načtení a dekódování instrukce
  2. 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).

Běžná riscová pipeline[editovat | editovat zdroj]

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ě:

  1. Instruction fetch - vyzvednutí instrukce
  2. Decode - dekódování instrukce, zároveň se načítají registry
  3. Execute - provedení instrukce
  4. Access - čtení z paměti
  5. Writeback - zápis výsledku do paměti

Predikce skoku[editovat | editovat zdroj]

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í.

Pipeline v x86[editovat | editovat zdroj]

Na architektuře x86 se pipeline objevila u procesoru Intel 80286, kde měla tři stupně (Bus Unit, Instruction Unit, Execution Unit). Procesor Intel Pentium má jako první dvě pipeline (U-pipe a V-pipe a obě používají zřetězené zpracování instrukcí). Zde se poprvé objevuje pojem superskalární procesor - tzn. zřetězené zpracování instrukcí se provádí ve více než jedné frontě (konkrétně u Pentia se provádí v U-pipe i V-pipe, tzn. obě nejprve vyberou instrukci (prefetch), obě ji pak předají k dekódování (decode) atd.). 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é. 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í 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.

Pipeline u GPU[editovat | editovat zdroj]

V 3D počítačové grafice, podmínka grafické pipeline nebo renderovacích pipeline se často vztahuje na současný stav metody rasterization-based rendering.

Implementace[editovat | editovat zdroj]

S vyrovnávací pamětí, synchronní řetězení[editovat | editovat zdroj]

Konvenční mikroprocesory jsou synchronní obvody využívající synchronní jednotky zřetězení s vyrovnávací pamětí. V těchto řetězících jednotkách, "pipeline registry" jsou vloženy mezi fáze pipeline a jsou řízeny hodinovým taktem. Čas mezi každým hodinovým taktem je nastaven na vyšší hodnotu než je hodnota nejdelší prodlevy mezi fázemi pipeline, aby při řízení registrů hodinovým taktem byla data do nich zapsána jako výsledek předchozí fáze.

S vyrovnávací pamětí, asynchronní řetězení[editovat | editovat zdroj]

Asynchronní pipeline jsou použity v asynchronních obvodech a jejich jednotky řetězení jsou časovány asynchronně. Obecně řečeno, využívají systém typu žádost/potvrzení, v němž každá fáze může detekovat, zda je hotovo. Jako ukázka této implementace je procesor AMULET.

Řetězení bez vyrovnávací paměti[editovat | editovat zdroj]

Toto zřetězené zpracování, často zvané "vlnové zpracování" neobsahuje registry jako mezičlánek fází. Namísto toho, zpoždění ve zpracování je vyváženo. Pro každou fázi je minimalizována diference mezi prvním a posledním stabilizovaným výstupem dat.