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.
Detailnější popis pěti stupňů RISC pipeline
Každý z pěti základních stupňů RISC pipeline má specifickou roli:
- Načtení instrukcí (IF) – procesor čte instrukci z paměti instrukcí (cache nebo hlavní paměť) podle hodnoty programového čítače (PC). Tento stupeň řeší i inkrementaci PC nebo výběr cíle větvení.
- Dekódování instrukcí a načítání registrů (ID) – instrukce je dekódována, určí se typ operace a čtou se zdrojové registry. Zde může kompilátor nebo hardware provést i detekci závislostí mezi instrukcemi.
- Provést (EX) – vlastní výpočet (aritmeticko-logická jednotka, ALU), adresování paměti pro load/store nebo vyhodnocení podmínky pro větvení.
- Přístup do paměti (MEM) – provádí se čtení/zápis operandů v datové paměti (dále zde probíhá komunikace s cache).
- Zápis do registru (WB) – výsledek operace (z ALU nebo z paměti) je zapsán do cílového registru.
Druhy konfliktů (hazards)
Při pipeliningu se objevují tři základní typy problémů, které mohou způsobit zpoždění:
- Datové hazardy – jedna instrukce potřebuje výsledek jiné instrukce (např. RAW: Read After Write). Bez prevence musí pipeline čekat, až bude výsledek k dispozici.
- Kontrolní (řídicí) hazardy – větvení a skoky mění tok instrukcí. Dokud není rozhodnuto, která instrukce bude spuštěna dál, pipeline může číst špatné instrukce (mussí se vyprázdnit nebo spekulativně pokračovat).
- Strukturální hazardy – dva nebo více stupňů potřebuje současně ten samý hardwarový zdroj (např. jediná paměť pro instrukce i data bez harwardového oddělení).
Techniky pro řešení hazardů
Architekti procesorů používají více technik ke zmírnění dopadů hazardů:
- Přeposílání (forwarding / bypassing) – výsledky z pozdějších stupňů jsou vráceny přímo do ALU v dřívějším stupni bez čekání na zápis do registru.
- Pipeline interlocky a čekací (stall) cykly – řízení pipeline vloží "bubliny" (NOPy), takže závislé instrukce počkají bezpečně.
- Predikce větvení – statická (např. předpoklad „skoky neprovádět“) nebo dynamická (tabulky historii větvení) predikce s následným spekulativním vykonáváním. Při chybném odhadu se pipeline vyčistí (flush) a načtou se správné instrukce – to má náklady v cyklech.
- Rename registrů (register renaming) – eliminuje falešné závislosti typu WAR/WAW přidělováním fyzických registrů dynamicky (používá se v out-of-order návrzích).
- Out-of-order execution a Tomasuloův algoritmus – instrukce se provádějí ve většině dostupném pořadí podle dostupnosti operandů a funkčních jednotek, což zvyšuje paralelismus a využití zdrojů.
- Kompliační optimalizace – kompilátor přeskupuje instrukce (scheduling), aby snížil počet nutných stallů nebo aby lépe využil pipeline.
- Superscalar a vícekřížové dekodéry – provádění více instrukcí za takt (vícevérové pipeline) vyžaduje další mechanizmy pro rozpoznání a řešení kolizí.
Důsledky pipeliningu: latence versus propustnost
Pipelining snižuje dobu mezi dokončením po sobě jdoucích instrukcí (zvyšuje propustnost), ale zpravidla nemění latenci jedné jednotlivé instrukce (pokud nepřidáme více logiky pro rychlejší EX atd.). Ideální plně pipelined design může dosáhnout průměrného CPI (cycles per instruction) blízko 1, ale skutečná CPI bývá vyšší kvůli hazardům, cache missům, míspredikcím větvení a dalším faktorům.
Návrhové kompromisy a hloubka pipeline
Hlubší pipeline (více stupňů) obvykle dovoluje vyšší taktovací frekvenci, protože jednotlivé stupně jsou jednodušší a rychlejší. Nevýhodou je vyšší cena za míspredikce větvení (více instrukcí musí být vyčištěno) a složitější řízení (více mezistupňových registrů, větší spotřeba energie). Například některé starší vysokofrekvenční procesory měly velmi hluboké pipeline (desítky stupňů), zatímco moderní návrhy často hledají kompromis mezi šířkou (superscalar) a hloubkou kvůli spotřebě energie a latenci.
Pokročilé techniky v moderních procesorech
Současné výkonné CPU kombinují pipelining s dalšími metodami pro zvýšení výkonu:
- Spekulativní provádění – procesor pokračuje ve vykonávání instrukcí založených na predikci větvení, výsledky se poté zcommitují nebo zahodí.
- Víceúrovňové cache a oddělení instrukční a datové cesty – snižují strukturální hazardy a zkracují průměrné latence paměti.
- Simultaneous Multithreading (SMT) – více vláken sdílí pipeline tak, aby byly vyplněny cykly, které by jinak byly nečinné kvůli čekání (např. Intel Hyper-Threading).
- Speciální jednotky a vektorové rozšíření – SIMD jednotky (SSE, AVX apod.) a akcelerátory pro určité typy operací mění profil využití pipeline.
Příklady a reálné dopady
V mikrořadičích a jednoduchých embedded jádrech bývá pipeline krátká (např. 3–5 stupňů), což usnadňuje predikovatelnost a nízkou spotřebu. U high-end CPU se používají hlubší a složitější pipeline s predikcí větvení a out-of-order vykonáváním, aby se dosáhlo co nejvyšší propustnosti. Implementace pipeliningu má významný vliv na výkon programu, ale také na spotřebu energie, složitost návrhu a cenu čipu.
Shrnutí
Pipelining je klíčová technika pro zvýšení propustnosti procesoru tím, že rozkládá zpracování instrukce do nezávislých stupňů pracujících paralelně. Efektivity pipeliningu brání různé druhy hazardů, které se řeší hardwarovými i softwarovými metodami (forwarding, predikce větvení, out-of-order, kompilátorové techniky atd.). Volba hloubky pipeline a doprovodných mechanismů je kompromisem mezi taktem, latencí, energetickou efektivitou a složitostí návrhu.



