Utasítás-Pipelining
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.
Alapvető ötlépcsős pipeline egy RISC-gépben (IF = Instruction Fetch, ID = Instruction Decode, EX = Execute, MEM = Memory access, WB = Register write back). A függőleges tengely az egymást követő utasítások, a vízszintes tengely az idő. Tehát a zöld oszlopban a legkorábbi utasítás a WB szakaszban van, és a legkésőbbi utasítás az utasításbehíváson megy keresztül.
A pipelining előnyei és hátrányai
A pipelining előnyei:
- A processzor ciklusideje csökken; nő az utasítások átviteli sebessége. A csővezetés nem csökkenti az egy utasítás befejezéséhez szükséges időt; ehelyett növeli az egyidejűleg ("egyszerre") feldolgozható utasítások számát, és csökkenti a befejezett utasítások közötti késleltetést (az úgynevezett "átbocsátási teljesítményt").
Minél több pipeline-szakasza van egy processzornak, annál több utasítást tud "egyszerre" feldolgozni, és annál kisebb a késleltetés a befejezett utasítások között. Minden ma gyártott
általános célú mikroprocesszor legalább 2, de akár 30 vagy 40 fokozatú pipeline-t használ. - Pipelining használata esetén a CPU aritmetikai logikai egysége gyorsabban tervezhető, de összetettebb lesz.
- A csővezetés elméletileg a szakaszok számának a szorzatával növeli a teljesítményt a csővezeték nélküli maghoz képest (feltételezve, hogy az órajelfrekvencia is ugyanennyivel nő), és a kód ideális a csővezetékes végrehajtáshoz.
- A csővezetékes CPU-k általában magasabb órajelen dolgoznak, mint a RAM órajel frekvenciája (a 2008-as technológiáktól kezdve a RAM-ok a CPU-k frekvenciájához képest alacsony frekvencián dolgoznak), ami növeli a számítógépek általános teljesítményét.
A pipelining hátrányai:
A pipeliningnek számos hátránya van, bár a CPU-k és a fordítóprogramok tervezői számos technikát alkalmaznak a legtöbbjük leküzdésére; az alábbiakban felsoroljuk a leggyakoribb hátrányokat:
- A nem-pipelines processzorok kialakítása egyszerűbb és olcsóbb a gyártásuk, a nem-pipelines processzor egyszerre csak egyetlen utasítást hajt végre. Ez megakadályozza az elágazási késedelmeket (a pipeliningben minden elágazás késik), valamint az egyidejűleg végrehajtott soros utasításoknál fellépő problémákat.
- A pipelines processzorban a flip flopok modulok közötti beillesztése növeli az utasítás késleltetését a nem pipelines processzorhoz képest.
- Egy nem pipeline-olt processzornak meghatározott utasítás-teljesítménye van. Egy pipelines processzor teljesítményét sokkal nehezebb megjósolni, és a különböző programok esetében nagymértékben eltérhet.
- Sok terv tartalmaz 7, 10, 20, 31 és még több fokozatú csővezetéket; a hosszú csővezeték hátránya, hogy amikor egy program elágazik, a teljes csővezetéket ki kell üríteni (törölni). A csővezetékek nagyobb áteresztőképessége elmarad, ha a végrehajtott kód sok elágazást tartalmaz: a processzor nem tudhatja előre, hogy honnan olvassa be a következő utasítást, és meg kell várnia, amíg az elágazási utasítás befejeződik, így a mögötte lévő csővezeték üresen marad. Ez a hátrány csökkenthető azzal, hogy a korábbi tevékenység alapján megjósolható, hogy a feltételes elágazási utasítás el fog-e ágazni. Az elágazás megoldása után a következő utasításnak végig kell haladnia a csővezetéken, mielőtt annak eredménye elérhetővé válik, és a processzor ismét "dolgozik". Ilyen szélsőséges esetekben a csővezetékes processzor teljesítménye rosszabb lehet, mint a nem csővezetékes processzoré.
- Sajnos nem minden utasítás független. Egy egyszerű csővezetékben egy utasítás befejezése 5 lépést is igényelhet. A teljes teljesítményű működéshez ennek a csővezetéknek 4 egymást követő független utasítást kell lefuttatnia, miközben az első befejeződik. E 4 utasítás bármelyike függhet az első utasítás kimenetétől, ami a csővezeték vezérlő logikájának várakozását és egy időhúzást vagy egy elvesztegetett órajelciklust okozhat a csővezetékben, amíg a függőséget fel nem oldják. Szerencsére az olyan technikák, mint a továbbítás, jelentősen csökkenthetik az olyan eseteket, amikor az időhúzásra szükség van.
- Az önmódosító programok nem feltétlenül hajtódnak végre megfelelően egy csővezetékes architektúrán, ha a módosítandó utasítások a végrehajtandó utasítások közelében vannak. Ennek oka lehet, hogy az utasítások már a Prefetch Input Queue-ben vannak, így a módosítás nem biztos, hogy a következő utasításvégrehajtásnál érvényesül. Az utasítás gyorsítótárak tovább rontják a problémát.
- Veszélyek: Amikor a programozó (vagy a fordító) assembly kódot ír, általában feltételezi, hogy minden utasítás a következő utasítás végrehajtása előtt végrehajtásra kerül. Ha ezt a feltételezést nem igazolja a pipelining, akkor a program helytelenül viselkedik, ezt a helyzetet nevezzük veszélynek. A veszélyek megoldására vagy áthidalására
különböző technikák léteznek, mint például a továbbítás és a késleltetés (egy időhúzás vagy egy elvesztegetett órajelciklus beiktatásával).
Példák
Általános csővezeték
A jobb oldalon egy általános csővezeték látható négy lépcsővel:
- Hozd le a
- Decode
- Végrehajtás
- Visszaírás
A felső szürke doboz a végrehajtásra váró utasítások listája; az alsó szürke doboz a már befejezett utasítások listája; a középső fehér doboz pedig a csővezeték.
A végrehajtás a következőképpen történik:
Idő | Végrehajtás |
0 | Négy utasítás vár végrehajtásra |
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | Minden utasítás végrehajtásra kerül |
Buborék
Ha a végrehajtásban "csuklás" (megszakítás) történik, a csővezetékben egy "buborék" keletkezik, amelyben semmi hasznos nem történik. A 2. ciklusban a lila utasítás lehívása késik, és a 3. ciklusban a dekódolási szakaszban már egy buborék van. Minden, ami a lila utasítás mögött van, szintén késik, de minden, ami a lila utasítás előtt van, folytatja a végrehajtást.
A fenti végrehajtással összehasonlítva a buborék 7 helyett 8 órajeles teljes végrehajtási időt eredményez.
A buborékok olyanok, mint a késleltetések (késleltetések), amelyekben semmi hasznos nem történik a lekérdezés, dekódolás, végrehajtás és visszaírás során. Ez olyan, mint egy NOP (No OPeration, azaz nincs művelet) kód.
Példa 1
Egy tipikus utasítás két szám összeadására lehet az ADD A, B, C
, amely összeadja az A és B memóriahelyeken található értékeket, majd az eredményt a C memóriahelyre helyezi:
Az 'R1' és 'R2' helyek a CPU-ban lévő regiszterek. Az 'A' és 'B' feliratú memóriahelyeken tárolt értékeket betöltjük (másoljuk) ezekbe a regiszterekbe, majd összeadjuk, és az eredményt a 'C' feliratú memóriahelyen tároljuk.
Ebben a példában a csővezeték három szakaszból áll: hosszú betöltés, végrehajtás és tárolás. Az egyes lépéseket csővezetékszakaszoknak nevezzük.
Egy nem pipelined processzoron egyszerre csak egy szakasz dolgozhat, így a teljes utasításnak be kell fejeződnie, mielőtt a következő utasítás elkezdődhet. Pipelines processzoron az összes fokozat egyszerre dolgozhat különböző utasításokon. Tehát amikor ez az utasítás a végrehajtási szakaszban van, egy második utasítás a dekódolási szakaszban, egy harmadik utasítás pedig a lekérdezési szakaszban lesz.
Példa 2
Hogy jobban megértsük a koncepciót, nézzünk meg egy elméleti 3 lépcsős csővezetéket:
Színpad | Leírás |
Terhelés | Utasítás olvasása a memóriából |
Végrehajtás | Utasítás végrehajtása |
Áruház | Az eredmény tárolása a memóriában és/vagy a regiszterekben |
és egy végrehajtandó pszeudokód assembly listát:
Ezt így hajtanák végre:
Óra 1 | ||
Terhelés | Végrehajtás | Áruház |
LOAD |
|
|
A LOAD utasítás a memóriából kerül előhívásra.
Óra 2 | ||
Terhelés | Végrehajtás | Áruház |
MOVE | LOAD |
|
A LOAD utasítás végrehajtásra kerül, míg a MOVE utasítás a memóriából kerül előhívásra.
Óra 3 | ||
Terhelés | Végrehajtás | Áruház |
ADD | MOVE | LOAD |
A LOAD utasítás a Store fázisban van, ahol az eredmény (a 40-es szám) az A regiszterbe kerül. Eközben a MOVE utasítás végrehajtása folyamatban van. Mivel az A tartalmát B-be kell áthelyeznie, meg kell várnia a LOAD utasítás befejezését.
Óra 4 | ||
Terhelés | Végrehajtás | Áruház |
STORE | ADD | MOVE |
A STORE utasítás betöltődik, miközben a MOVE utasítás befejeződik, az ADD pedig számol.
És így tovább. Vegyük észre, hogy néha egy utasítás egy másik utasítás eredményétől függ (mint a MOVE példánkban). Ha egynél több utasítás hivatkozik egy operandus egy adott helyre, akár olvasva (bemenetként), akár írva (kimenetként), akkor ezen utasítások az eredeti program sorrendjétől eltérő sorrendben történő végrehajtása a (fent említett) veszélyhelyzethez vezethet.
Általános 4 lépcsős csővezeték; a színes dobozok egymástól független utasításokat jelölnek
Egy buborék a 3. ciklusban késlelteti a végrehajtást
Kapcsolódó oldalak
- Csővezeték (számítástechnika)
- Párhuzamos számítástechnika
- Utasításszintű párhuzamosság
Kérdések és válaszok
K: Mi az az utasítás pipelining?
V: Az utasítás-pipelining a modern mikroprocesszorok, mikrokontrollerek és CPU-k tervezésénél alkalmazott technika, amely az utasítások átviteli sebességének növelésére szolgál azáltal, hogy a CPU-utasítás feldolgozását független lépések sorozatára osztja fel, minden lépés végén tárolással.
K: Hogyan működik a pipelining?
V: A pipelining úgy működik, hogy a logikát kisebb darabokra bontja, és a logikai darabok közé flip flopokat illeszt, ami csökkenti a logikának az értékek dekódolásához szükséges időt, amíg ezen értékek függvényében érvényes kimeneteket generál. Ez gyorsabb órajel-periódusokat tesz lehetővé.
K: Milyen példák vannak a csővezetékekre?
V: Egy példa a pipeline-ra a RISC pipeline, amely öt szakaszra van bontva, az egyes szakaszok között pedig flip flopok sorozata található.
K: Hogyan növeli a pipelining az utasítások áteresztőképességét?
V: A csővezetés növeli az utasítások áteresztőképességét azáltal, hogy lehetővé teszi a CPU-modulok párhuzamos működését, ami csökkenti az utasítási ciklus alatti üresjárati időt és növeli a teljes feldolgozási időt.
K: Minden csővezeték teljesen pipelines?
V: Nem, nem minden csővezeték teljesen csővezetékes; egyes csővezetékek várakozási ciklusokkal rendelkeznek, amelyek késleltetik a csővezetékben való haladást.