Pipelining
Pipelining instrukcí je technika používaná při návrhu moderních mikroprocesorů, mikrokontrolérů a CPU ke zvýšení jejich instrukční propustnosti (počet instrukcí, které lze vykonat za jednotku času).
Hlavní myšlenkou je rozdělení (tzv. "rozdělení") zpracování instrukce procesoru, jak je definováno mikrokódem instrukce, na řadu nezávislých kroků mikrooperací (nazývaných také "mikroinstrukce", "mikroop" nebo "µop") s uložením na konci každého kroku. To umožňuje řídicí logice procesoru zpracovávat instrukce rychlostí zpracování nejpomalejšího kroku, která je mnohem rychlejší než čas potřebný ke zpracování instrukce jako jediného kroku.
Termín pipeline odkazuje na skutečnost, že každý krok nese jednu mikroinstrukci (jako kapka vody) a každý krok je spojen s jiným krokem (analogie; podobně jako vodovodní potrubí).
Většina moderních procesorů je řízena taktem. Procesor se vnitřně skládá z logiky a paměti (flip flopů). Když přijde hodinový signál, flip flopy uloží svou novou hodnotu a logika potřebuje určitý čas na dekódování nových hodnot flip flopů. Pak přijde další hodinový impuls a flip flopy uloží další hodnoty atd. Rozdělením logiky na menší části a vložením flip flopů mezi části logiky se zkrátí doba, kterou logika potřebuje (k dekódování hodnot až po generování platných výstupů v závislosti na těchto hodnotách). Tímto způsobem lze zkrátit taktovací periodu.
Například pipeline RISC je rozdělena do pěti stupňů se sadou flip flopů mezi jednotlivými stupni takto:
- Načtení instrukcí
- Dekódování instrukcí a načítání registrů
- Provést
- Přístup do paměti
- Registrovat zpětný zápis
Procesory s pipeliningem se vnitřně skládají ze stupňů (modulů), které mohou částečně nezávisle pracovat na samostatných mikroinstrukcích. Každý stupeň je propojen pomocí flip flopů s dalším stupněm (jako "řetězec"), takže výstup stupně je vstupem pro další stupeň, dokud není práce na zpracování instrukcí dokončena. Taková organizace vnitřních modulů procesoru zkracuje celkovou dobu zpracování instrukce.
Bezipeline architektura není tak efektivní, protože některé moduly procesoru jsou nečinné, zatímco jiný modul je aktivní během instrukčního cyklu. Pipelining zcela neodstraní dobu nečinnosti v pipelinovaném procesoru, ale paralelní práce modulů procesoru zvyšuje propustnost instrukcí.
O instrukční pipeline se říká, že je plně pipelined, pokud může přijmout novou instrukci každý takt. Neplně pipelined pipeline má čekací cykly, které zpožďují postup pipeline.
Základní pětistupňová pipeline v RISC stroji (IF = Instruction Fetch, ID = Instruction Decode, EX = Execute, MEM = Memory access, WB = Register write back). Svislá osa jsou po sobě jdoucí instrukce, vodorovná osa je čas. V zeleném sloupci je tedy nejstarší instrukce ve fázi WB a nejnovější instrukce prochází načítáním instrukcí.
Výhody a nevýhody pipeliningu
Výhody pipeliningu:
- Zkracuje se doba cyklu procesoru a zvyšuje se propustnost instrukcí. Pipelining nezkracuje dobu potřebnou k dokončení instrukce; místo toho zvyšuje počet instrukcí, které mohou být zpracovány současně ("najednou"), a snižuje prodlevu mezi dokončenými instrukcemi (tzv. "propustnost").
Čím více stupňů pipeline procesor má, tím více instrukcí může zpracovat "najednou" a tím menší je prodleva mezi dokončenými instrukcemi. Každý dnes vyráběný
mikroprocesor pro všeobecné použití používá nejméně 2 stupně pipeline až do 30 nebo 40 stupňů. - Pokud se použije pipelining, může být aritmetická logická jednotka procesoru navržena rychleji, ale bude složitější.
- Pipelining teoreticky zvyšuje výkon oproti nepipelinovému jádru o násobek počtu stupňů (za předpokladu, že se stejným násobkem zvýší i taktovací frekvence) a kód je ideální pro provádění v pipeline.
- Pipelined CPU obecně pracují na vyšší taktovací frekvenci než RAM (od roku 2008 pracují RAM na nižších frekvencích ve srovnání s frekvencemi CPU), což zvyšuje celkový výkon počítačů.
Nevýhody pipeliningu:
Pipelining má mnoho nevýhod, ačkoli existuje mnoho technik, které návrháři procesorů a překladačů používají k překonání většiny z nich; níže je uveden seznam běžných nevýhod:
- Konstrukce nepipelínového procesoru je jednodušší a levnější na výrobu, nepipelínový procesor vykonává vždy jen jednu instrukci. Tím se zabrání zpoždění větvení (v pipeliningu se každé větvení zpožďuje) a také problémům při souběžném provádění sériových instrukcí.
- U pipeliningového procesoru zvyšuje vložení flip flopů mezi moduly latenci instrukcí ve srovnání s nepipeliningovým procesorem.
- Procesor bez pipeline bude mít definovanou propustnost instrukcí. Výkon pipelined procesoru je mnohem obtížnější předvídat a může se u různých programů značně lišit.
- Mnoho návrhů obsahuje pipeline dlouhé 7, 10, 20, 31 a dokonce i více stupňů; nevýhodou dlouhé pipeline je, že když se program větví, musí se celá pipeline propláchnout (vyčistit). Vyšší propustnost pipelines padá, když prováděný kód obsahuje mnoho větví: procesor nemůže předem vědět, kde má načíst další instrukci, a musí čekat, až se instrukce větvení dokončí, a pipeline za ní zůstane prázdná. Tuto nevýhodu lze snížit předvídáním, zda se podmíněná instrukce větvení bude větvit, na základě předchozí činnosti. Po vyřešení větvení musí další instrukce projít celou cestu potrubím, než je k dispozici její výsledek a procesor opět pokračuje v "práci". V takových extrémních případech může být výkon pipelined procesoru horší než nepipelined procesoru.
- Bohužel ne všechny pokyny jsou nezávislé. V jednoduché pipeline může dokončení instrukce vyžadovat 5 fází. Aby tato pipeline pracovala s plným výkonem, bude muset během dokončování první instrukce spustit 4 následující nezávislé instrukce. Kterákoli z těchto 4 instrukcí může záviset na výstupu první instrukce, což způsobí, že logika řízení pipeline bude čekat a vloží do pipeline zdržení nebo zbytečný takt, dokud se závislost nevyřeší. Naštěstí techniky, jako je předávání, mohou výrazně omezit případy, kdy je nutné zdržování.
- Programy, které se samy modifikují, se mohou na pipelinové architektuře neprovádět správně, pokud se modifikované instrukce nacházejí v blízkosti prováděných instrukcí. To může být způsobeno tím, že instrukce již mohou být ve vstupní frontě Prefetch, takže se modifikace nemusí projevit při nadcházejícím provádění instrukcí. Instrukční mezipaměť tento problém ještě zhoršuje.
- Nebezpečí: Když programátor (nebo kompilátor) píše kód v assembleru, obvykle předpokládá, že každá instrukce se provede dříve, než se provede další instrukce. Pokud tento předpoklad není ověřen pipeliningem, způsobí to nesprávné chování programu, situace se nazývá nebezpečí. Existují
různé techniky pro řešení nebezpečí nebo jeho obejití, jako je předávání a zpoždění (vložením zdržení nebo promarněného hodinového cyklu).
Příklady
Obecné potrubí
Vpravo je zobrazeno obecné potrubí se čtyřmi stupni:
- Fetch
- Dekódování
- Provést
- Zpětný zápis
Horní šedý rámeček je seznam instrukcí čekajících na provedení, spodní šedý rámeček je seznam dokončených instrukcí a prostřední bílý rámeček je pipeline.
Provedení je následující:
Čas | Provedení |
0 | Na provedení čekají čtyři instrukce. |
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | Všechny instrukce jsou provedeny |
Bublina
Když dojde k "zádrhelu" (přerušení) v provádění, vytvoří se v potrubí "bublina", ve které se nic užitečného neděje. V cyklu 2 se načtení fialové instrukce zpozdí a fáze dekódování v cyklu 3 nyní obsahuje bublinu. Vše za fialovou instrukcí je rovněž zpožděno, ale vše před fialovou instrukcí pokračuje v provádění.
Je zřejmé, že v porovnání s výše uvedeným provedením bubliny je celkový čas provedení 8 hodinových taktů namísto 7.
Bubliny jsou jako zdržení (delay), kdy se při načítání, dekódování, provádění a zpětném zápisu nic užitečného nestane. Je to jako kód NOP (zkratka pro No OPeration).
Příklad 1
Typickou instrukcí pro sčítání dvou čísel může být ADD A, B, C,
která sečte hodnoty nacházející se v paměťových místech A a B a poté vloží výsledek do paměťového místa C. V pipeline procesoru by řadič pipeline tuto instrukci rozdělil na řadu úloh podobně jako:
Místa 'R1' a 'R2' jsou registry v CPU. Hodnoty uložené v paměťových místech označených 'A' a 'B' se načtou (zkopírují) do těchto registrů, poté se sečtou a výsledek se uloží do paměťového místa označeného 'C'.
V tomto příkladu je pipeline třístupňová - načtení, provedení a uložení. Jednotlivé kroky se nazývají etapy pipeline.
V nepipelinovém procesoru může v jednom okamžiku pracovat pouze jedna fáze, takže celá instrukce musí být dokončena, než může začít další instrukce. V pipelined procesoru mohou všechny fáze pracovat najednou na různých instrukcích. Takže když je tato instrukce ve fázi vykonávání, druhá instrukce bude ve fázi dekódování a třetí instrukce bude ve fázi načítání.
Příklad 2
Pro lepší pochopení tohoto konceptu se můžeme podívat na teoretický třístupňový plynovod:
Fáze | Popis |
Zatížení | Čtení instrukcí z paměti |
Provést | Provedení pokynu |
Obchod | Uložení výsledku do paměti a/nebo registrů |
a výpis pseudokódu sestavy, který se má provést:
Takto by se to provedlo:
Hodiny 1 | ||
Zatížení | Provést | Obchod |
LOAD |
|
|
Instrukce LOAD je načtena z paměti.
Hodiny 2 | ||
Zatížení | Provést | Obchod |
MOVE | LOAD |
|
Provede se instrukce LOAD, zatímco instrukce MOVE se načte z paměti.
Hodiny 3 | ||
Zatížení | Provést | Obchod |
ADD | MOVE | LOAD |
Instrukce LOAD je ve fázi Store, kdy se její výsledek (číslo 40) uloží do registru A. Mezitím se provádí instrukce MOVE. Protože musí přesunout obsah A do B, musí počkat na ukončení instrukce LOAD.
Hodiny 4 | ||
Zatížení | Provést | Obchod |
STORE | ADD | MOVE |
Instrukce STORE se načítá, zatímco instrukce MOVE končí a instrukce ADD se počítá.
A tak dále. Všimněte si, že někdy bude instrukce záviset na výsledku jiné instrukce (jako náš příklad MOVE). Pokud se na určité místo pro operand odkazuje více než jedna instrukce, a to buď pro čtení (jako vstup), nebo pro zápis (jako výstup), může provedení těchto instrukcí v jiném pořadí, než je původní pořadí programu, vést k nebezpečným situacím (zmíněným výše).
Obecná čtyřstupňová potrubní linka; barevné rámečky představují na sobě nezávislé instrukce.
Bublina v cyklu 3 zpožďuje provedení
Související stránky
- Potrubí (výpočetní technika)
- Paralelní výpočty
- Paralelismus na úrovni instrukcí
Otázky a odpovědi
Otázka: Co je to pipelining instrukcí?
A: Pipelining instrukcí je technika používaná při návrhu moderních mikroprocesorů, mikrokontrolérů a CPU ke zvýšení jejich instrukční propustnosti rozdělením zpracování instrukce CPU do řady nezávislých kroků s ukládáním na konci každého kroku.
Otázka: Jak funguje pipelining?
Odpověď: Pipelining funguje tak, že logika se rozdělí na menší části a mezi části logiky se vloží klopné obvody, čímž se zkrátí doba potřebná k dekódování hodnot logikou až do vygenerování platných výstupů v závislosti na těchto hodnotách. To umožňuje zrychlit taktovací periody.
Otázka: Jaké jsou příklady pipeline?
Odpověď: Příkladem pipeline je pipeline RISC, která je rozdělena do pěti stupňů se sadou flip flopů mezi jednotlivými stupni.
Otázka: Jak pipelining zvyšuje propustnost instrukcí?
Odpověď: Pipelining zvyšuje propustnost instrukcí tím, že umožňuje modulům procesoru pracovat paralelně, což zkracuje dobu nečinnosti během instrukčního cyklu a zvyšuje celkovou dobu zpracování.
Otázka: Je každá pipeline plně pipelinová?
Odpověď: Ne, ne každá pipeline je plně pipelined; některé pipeline mají čekací cykly, které zpožďují postup v pipeline.