Az utasítás-pipelining a modern mikroprocesszorok, mikrokontrollerek és CPU-k tervezésénél alkalmazott technika, amelynek célja az utasításátviteli teljesítmény (az egy időegység alatt végrehajtható utasítások száma) növelése.
Az alapötlet az, hogy a CPU utasítás feldolgozását, ahogyan azt az utasítás mikrokódja meghatározza, mikroműveletek (más néven "mikroutasítások", "mikro-op" vagy "µop") független lépéseinek sorozatára osztják (úgynevezett "split"), az egyes lépések végén tárolással. Ez lehetővé teszi a CPU vezérlő logikája számára, hogy az utasításokat a leglassabb lépés feldolgozási sebességével kezelje, ami sokkal gyorsabb, mint az utasítás egyetlen lépésként történő feldolgozásához szükséges idő.
A csővezeték kifejezés arra utal, hogy minden lépés egyetlen mikroutasítást hordoz (mint egy vízcsepp), és minden lépés egy másik lépéshez kapcsolódik (analógia; hasonló a vízvezetékhez).
A legtöbb modern CPU-t órajel vezérli. A CPU belsőleg logikából és memóriából (flip flopok) áll. Amikor az órajel megérkezik, a flip flopok tárolják az új értéket, majd a logikának időre van szüksége ahhoz, hogy dekódolja a flip flopok új értékeit. Ezután megérkezik a következő órajel, és a flip flopok újabb értékeket tárolnak, és így tovább. A logika kisebb darabokra bontásával és a flip flopok logikai darabok közötti beillesztésével a logika által igényelt idő (az értékek dekódolásához az ezen értékektől függő érvényes kimenetek létrehozásáig) csökken. Ily módon az óraperiódus csökkenthető.
Például a RISC-csővezeték öt szakaszra van bontva, az egyes szakaszok között pedig flip flopok vannak a következőképpen:
- Utasítás lehívása
- Utasításdekódolás és regiszterbehívás
- Végrehajtás
- Memória-hozzáférés
- Visszaírás a regiszterbe
A pipelininggel ellátott processzorok belsőleg olyan szakaszokból (modulokból) állnak, amelyek félig függetlenül képesek külön mikroutasításokon dolgozni. Minden egyes fokozat flip flopok segítségével kapcsolódik a következő fokozathoz (mint egy "lánc"), így a fokozat kimenete egy másik fokozat bemenete, amíg az utasítások feldolgozása be nem fejeződik. A processzor belső moduljainak ilyen szervezése csökkenti az utasítás teljes feldolgozási idejét.
A nem-csatornás architektúra nem olyan hatékony, mivel néhány CPU-modul üresjáratban van, míg egy másik modul aktív az utasítási ciklus alatt. A csővezetékes CPU-ban a pipelining nem szünteti meg teljesen az üresjárati időt, de a CPU-modulok párhuzamos működése növeli az utasítás-átbocsátási teljesítményt.
Egy utasításcsővezeték akkor tekinthető teljesen csővezetékesnek, ha minden órajelciklusban képes új utasítást fogadni. A nem teljesen csővezetékes pipeline várakozási ciklusokkal rendelkezik, amelyek késleltetik a pipeline előrehaladását.
Miért hasznos a pipelining?
A pipelining fő előnye, hogy megnöveli a processzor átbocsátóképességét (throughput). Míg egyetlen utasítás végrehajtási ideje (latencia) nagyjából ugyanannyi marad vagy csak mérsékelten csökken, a pipeline lehetővé teszi, hogy több utasítás legyen egyidejűleg feldolgozás alatt, így rövidebb idő alatt több utasítást lehet végrehajtani.
Tipikus pipeline-hibák (hazardok) és megoldások
- Szerkezeti (structural) hazard: amikor két vagy több pipeline-fokozat ugyanazt a hardvererőforrást akarja egyszerre használni. Megoldások: erőforrások duplikálása, időzítések áttervezése vagy stall (várakoztatás) bevezetése.
- Adat (data) hazard: az egyik utasítás eredményére egy közvetlenül utána következő utasításnak szüksége van, még mielőtt az eredmény visszaíródna. Megoldások: forwarding (adatbypass), pipeline stall, out-of-order végrehajtás.
- Vezérlési (control) hazard: elágazások és ugrások esetén a következő végrehajtandó utasítás címe nem ismert biztosan. Megoldások: elágazás-előrejelzés (branch prediction), spekulatív végrehajtás, pipeline flush (törlés) rossz előrejelzés esetén.
Technikák a veszteségek csökkentésére
- Forwarding / Bypassing: az eredményt nem várják meg a regiszterbe írással, hanem közvetlenül a következő fokozathoz továbbítják.
- Stall / Bubble: ha nincs más megoldás, a pipeline betesz egy üres ciklust, amíg az adatok elérhetők lesznek.
- Branch prediction: az elágazások valószínűsége alapján megpróbálják kitalálni a következő utasítást, és előre végrehajtják; rossz találatnál flush történik.
- Out-of-order execution és renaming: modern CPU-k képesek a független utasításokat más sorrendben végrehajtani, és regiszterátnevezéssel elkerülni a hamis adatfüggőségeket.
- Superscalar végrehajtás: több utasítás fogadása és párhuzamos végrehajtása egy órajelciklus alatt (több végrehajtóegység).
Teljesítmény-mutatók és kompromisszumok
Fontos megkülönböztetni a throughput-ot és a latency-t. A pipelining jelentősen növeli az átbocsátást (több utasítást/s), de egyetlen utasítás latenciája általában nem csökken arányosan. A pipeline mélységének növelése gyakran magasabb órafrekvenciát tesz lehetővé, de növeli az elágazási büntetést és a vezérlési spekuláció költségeit. Mély pipeline-okban a rossz elágazásból eredő flush költsége nagyobb lehet.
Gyakorlati példák
- RISC 5-szakaszú pipeline: a cikk elején ismertetett tipikus felosztás (IF, ID, EX, MEM, WB) egyszerű és jól szemlélteti a pipelining működését. Sok klasszikus RISC-processzor ezzel a felépítéssel dolgozik.
- Modern x86 és ARM processzorok: jellemzően sokkal mélyebb és összetettebb pipeline-okat használnak (elágazás-előrejelzés, spekulatív és out-of-order végrehajtás, több végrehajtóegység), valamint µop-dekompozíciót (bonyolult utasítások mikro-operációkra bontása).
- Beágyazott rendszerek / mikrokontrollerek: egyszerűbb pipeline-okkal (gyakran 2–5 szakasz) dolgoznak; itt fontos a determinisztikus viselkedés és az alacsony késleltetés.
Előnyök és hátrányok
- Előnyök: nagyobb átbocsátás, jobb órajel-szemléltetés (rövidebb kritikus utak), hatékonyabb felhasználás a hardvererőforrásoknak.
- Hátrányok: bonyolultabb vezérlés, pipeline-hibák miatti késleltetések (stallok, flushok), nagyobb tervezési és verifikációs költségek, elágazásoknál előforduló nagyobb büntetés mély pipeline esetén.
Összefoglalás
A pipelining alapvető technika a modern processzorok tervezésében: növeli az utasítások átbocsátását azáltal, hogy a feldolgozási lépéseket párhuzamosítja. Ugyanakkor a hatékonyság növelésével együtt járnak a pipeline-specifikus kihívások (hazardok), amelyeket különböző hardver- és szoftvermegoldásokkal próbálnak kezelni. A tervezők a pipeline mélységében, az elágazás-előrejelzés pontosságában és a párhuzamos végrehajtóegységek számában keresik az optimális kompromisszumot a teljesítmény és a költségek között.



