Instruction pipelining je technika používaná pri návrhu moderných mikroprocesorov, mikrokontrolérov a CPU na zvýšenie ich inštrukčnej priepustnosti (počet inštrukcií, ktoré možno vykonať za jednotku času). Táto technika nezvyšuje rýchlosť vykonania jednej konkrétnej inštrukcie, ale umožňuje súbežné spracovanie viacerých inštrukcií tak, aby celkový počet dokončených inštrukcií za sekundu narastal.

Hlavnou myšlienkou je rozdeliť (tzv. "rozdeliť") spracovanie inštrukcie procesora, ako je definované v mikrokóde inštrukcie, na sériu nezávislých krokov mikrooperácií (nazývaných aj "mikroinštrukcie", "mikrooperácie" alebo "µop") s uložením na konci každého kroku. To umožňuje riadiacej logike CPU spracovať inštrukcie rýchlosťou spracovania najpomalšieho kroku, ktorý je oveľa rýchlejší ako čas potrebný na spracovanie inštrukcie ako jedného kroku. Výsledkom je kratší taktovací interval (clock period) a vyššia frekvencia hodinového signálu.

Termín pipeline odkazuje na skutočnosť, že každý krok nesie jednu mikroinštrukciu (ako kvapka vody) a každý krok je prepojený s iným krokom (analógia; podobne ako vodovodné potrubie). Každý stupeň potrubia vykonáva svoju časť práce a potom odovzdá výsledok ďalej do nasledujúceho stupňa.

Väčšina moderných procesorov je riadená taktom. CPU sa vnútorne skladá z logiky a pamäte (flip flopov). Keď príde hodinový signál, flip flopy uložia svoju novú hodnotu, potom logika potrebuje určitý čas na dekódovanie nových hodnôt flip flopov. Potom príde ďalší hodinový impulz a flip flopy uložia ďalšie hodnoty atď. Rozdelením logiky na menšie časti a vložením flip flopov medzi časti logiky sa skráti čas, ktorý logika potrebuje (na dekódovanie hodnôt až po generovanie platných výstupov v závislosti od týchto hodnôt). Týmto spôsobom možno skrátiť taktovaciu periódu a zvýšiť frekvenciu hodinového signálu.

Napríklad, RISC pipeline je rozdelená na päť stupňov so sadou flip flopov medzi každým stupňom takto:

  1. Získavanie pokynov (Instruction Fetch, IF)
  2. Dekódovanie inštrukcií a načítanie registrov (Instruction Decode / Register Fetch, ID)
  3. Vykonanie (Execute, EX)
  4. Prístup do pamäte (Memory Access, MEM)
  5. Zápis do registra (Write Back, WB)

Procesory s pipeliningom sa vnútorne skladajú zo stupňov (modulov), ktoré môžu čiastočne nezávisle pracovať na samostatných mikroinštrukciách. Každý stupeň je prepojený flip flopmi s ďalším stupňom (ako "reťaz"), takže výstup stupňa je vstupom pre ďalší stupeň, kým sa neskončí práca na spracovaní inštrukcií. Takáto organizácia vnútorných modulov procesora skracuje celkový čas spracovania inštrukcie a zvyšuje priepustnosť.

Prečo pipelining zvyšuje výkon

Pipelining zvyšuje priepustnosť (throughput): namiesto čakania, kým sa jedna inštrukcia úplne dokončí, každý takt môže nastúpiť nová inštrukcia do potrubia. Výsledkom je, že po zaplnení potrubia sa v každom takte dokončuje približne jedna inštrukcia (v ideálnom prípade). Tým sa dosiahne výrazné zlepšenie celkového počtu inštrukcií za sekundu pri znížení latencie jednotlivých stupňov.

Obmedzenia a problémy (hazardy)

Pipelining prináša aj komplikácie — tzv. hazardy, ktoré môžu spôsobiť, že nie každý stupeň bude v každom cykle užitočne pracovať. Hlavné typy hazardov sú:

  • Dátové hazardy (Data hazards) — keď inštrukcia závisí na výsledku predchádzajúcej inštrukcie. Napríklad RAW (Read After Write) nastane, keď neskoršia inštrukcia chce čítať register, ktorý ešte nebol zapísaný.
  • Riadiace (kontrolné) hazardy (Control hazards) — spôsobené vetvením (branch), keď nie je okamžite známe, ktorá inštrukcia bude nasledovať. To vyžaduje buď zastavenie pipeline, alebo predikciu vetiev a prípadné vyprázdnenie (flush) v prípade chyby.
  • Štrukturálne hazardy (Structural hazards) — ak dva stupne potrebujú v tom istom čase rovnaký hardvérový zdroj (napr. pamäť alebo ALU), vzniká konflikt.

Riešenia hazardov

  • Stall (zastavenie) / bubliny — vloženie jedného alebo viacerých prázdnych cyklov do pipeline, ktoré zabránia poškodeniu dát integrity. Nevýhodou je zníženie priepustnosti.
  • Forwarding / bypassing — priamo prenáša výsledky z jedného stupňa do iného bez čakania na zápis a následné čítanie z registra, čím sa znižuje počet potrebných stallov.
  • Predikcia vetiev (branch prediction) — štatistické alebo historické metódy na odhad smerovania vetiev; pri správnej predikcii sa minimalizuje penalizácia za vetvenie. V prípade nesprávnej predikcie sa pipeline vyprázdni a nastáva penalizácia.
  • Dynamické plánovanie inštrukcií a out-of-order vykonávanie — pokročilé techniky používané v moderných CPU na preklenutie závislostí a maximalizovanie využitia výpočtových jednotiek.

Vplyv na výkon a praktické poznámky

Hoci pipelining zvyšuje priepustnosť, existujú trade-offy:

  • Deeper (hlbšia) pipeline umožňuje vyššiu frekvenciu hodinového signálu, ale zvyšuje náklady pri chybe predikcie vetvy (penalizácia pri flush), pretože viac inštrukcií musí byť zrušených.
  • Hlboké potrubie môže tiež zvýšiť zložitosť správy dátových závislostí a zvýšiť spotrebu energie a latenciu pri jednotlivých inštrukciách kvôli častejším registráciám medzi stupňami.
  • Skutočná rýchlostná výhoda závisí od percenta inštrukcií postihnutých hazardmi, účinnosti predikcie vetiev a použitia techník ako forwarding alebo out-of-order execution.

Jednoduché približné pravidlo pre ideálny výkon: ak má pipeline d stupňov a žiadne hazardy, maximálny teoretický nárast priepustnosti je približne d‑krát v porovnaní s nepipelined implementáciou. V praxi je však reálny zisk menší kvôli režijným nákladom medzi stupňami (registrácia, synchronizácia) a vyššie uvedeným hazardom.

Súčasné trendy

Moderné procesory kombinujú pipelining s ďalšími technikami: superskalárne vykonávanie (viac inštrukcií za cyklus), out-of-order execution, široké jednotky pre predikciu vetiev a mikrokódové dekódovanie do µop (mikrooperácií). Tieto prvky spoločne umožňujú vysokú priepustnosť a robustnú toleranciu voči klasickým problémom pipeliningu.

Nepotrubná architektúra nie je taká efektívna, pretože niektoré moduly CPU sú nečinné, zatiaľ čo iný modul je aktívny počas inštrukčného cyklu. Pipelining úplne neodstraňuje čas nečinnosti v pipeliningovom CPU, ale paralelná práca modulov CPU zvyšuje priepustnosť inštrukcií.

O inštrukčnej pipeline sa hovorí, že je plne pipelined, ak môže prijať novú inštrukciu každý takt. Potrubie, ktoré nie je plne pipelined, má čakacie cykly, ktoré oneskorujú postup potrubia. Dôležité je teda kombinovať návrh pipeline s technikami na minimalizáciu hazardov, aby sa dosiahol čo najvyšší reálny výkon.