Instruktsioonide torujuhtme (pipelining) mõiste ja tööpõhimõte
Avasta käskude pipeliningu mõiste ja tööpõhimõte: kuidas etapiline protsessoridisain (IF, ID, EX, MEM, WB) tõstab läbilaskevõimet ja vähendab latentsust.
Käskude pipelining on tehnika, mida kasutatakse kaasaegsete mikroprotsessorite, mikrokontrollerite ja protsessorite projekteerimisel, et suurendada nende käskude läbilaskevõimet (ajaühikus täidetavate käskude arv). Põhimõte võimaldab töötada mitme käsuga samaaegselt, viies ühe käskude töötlemise erinevates etappides paralleelselt.
Põhiidee on jagada protsessori käsu töötlemine, nagu see on määratletud mikrokoodis, mitmeks sõltumatuks mikrooperatsioonide etapiks (tavaliselt nimetatakse neid ka mikrokäskudeks, "mikro-op" või "µop"). Iga etapi lõpus salvestatakse etapi vahe-olek, mis võimaldab järgmise takti jooksul etappidel tööd edasi kanda. Selle jagamisega saab iga osa loogikast töötada lihtsama ja kiirendatuna — ühe sammuna läbiviimiseks vajalik aeg väheneb ning protsessor võib töötada lühema taktsükli tingimustes.
Mõiste „torujuhtme” (pipeline) tuleb kujundlikust võrdlusest: iga etapp kannab oma osa infot edasi nagu veetilk ja etapid on omavahel järjestikku seotud — analoogia veetorudega. Kui süsteem on hästi kihistatud, saab iga taktsükli järel võtta vastu uue käsu ja liigendada varem alustatud käske järgmistele etappidele.
Enamik kaasaegseid protsessoreid juhitakse taktiga. Protsessori siseehitus koosneb loogikast ja salvestusrakkudest (flip flops). Iga taktsignaaliga salvestavad flip flops oma uued väärtused; seejärel töötab loogika välja järgmise väljundi kuni järgmise taktsignaalini. Kui loogikat jagada väiksemateks etappideks ja paigaldada nende lõppudele flip flops, väheneb ühe etapi loogika viide ning protsessor saab töötada kõrgema taktsagedusega ehk lühema taktsagedusperioodiga.
- Käskude hankimine (IF — instruction fetch)
- Dekodeerimine ja registrite lugemine (ID — instruction decode / register fetch)
- Arvutus / täideviimine (EX — execute)
- Mälule juurdepääs (MEM — memory access)
- Tulemus registritesse kirjutamine (WB — write back)
Pipelininguga protsessor koosneb sisemistest moodulitest (etappidest), mis töötavad osaliselt sõltumatult eri mikrokäskude kallal. Iga etapi ja järgmise etapi vahele on tavaliselt paigutatud flip flops, nii et ühe etapi väljund muutub järgmise etapi sisendiks järgmises taktsüklis. See ahelne ülesehitus vähendab ühe käsu lõpp-to-end latentsust, kuna mitme käsu eri osad töötavad samaaegselt.
Mitte-pipeline’i arhitektuur on vähem tõhus, sest mõni moodul võib käsutsükli ajal seista tühikäigul, samal ajal kui teised on aktiivsed. Pipelining ei kõrvalda tühikäigu aega täielikult, kuid paralleelne töötamine suurendab märgatavalt käskude läbilaskevõimet.
Käskude torujuhet nimetatakse täielikult torujuhtmega, kui protsessor suudab vastu võtta uue käsu iga taktsükli järel. Kui torujuhtmes esineb ootetsükleid (st ullukohti või „bubbles”), ei ole see täielikult torujuhtmega ja torujuhtme edenemine aeglustub.
Olulised mõisted ja probleemid
Pipelining suurendab läbilaskevõimet, kuid toob kaasa ka mitmeid väljakutseid, mida tuleb arhitektuuri disainis käsitleda:
- Andmehädad (data hazards) — tekivad siis, kui üks käsk vajab teise käsu poolt tootetud tulemust enne, kui see on registrisse kirjutatud. Näiteks sõltuvus registrist R1: käsk 2 loeb R1, mida värskendas käsk 1, mis on veel torujuhtme varasemates etappides. Levinud lahendused: edastamine (forwarding/ bypassing), mis edastab tulemi otse ühest etapist teise ilma registrisse kirjutamata; aga vajadusel kasutatakse ka taktiseisu (stall / bubble).
- Struktuurilised hädad (structural hazards) — tulenevad riistvaralistest konfliktidest, näiteks kui mitu etappi tahavad samaaegselt kasutada sama mäluliidest või ALU-d. Lahenduseks on riistvara duplitseerimine või ajastusmuudatused.
- Hargnemiskahjad (control hazards) — tekkivad haru- ja tingimuskäskude puhul, kui järgmist käsku ei saa kindlalt ette teada, kuni haruotsus on tehtud. See põhjustab torujuhtme tühjendamise (flush) või ajutise ootamise. Leevendame seda haruprognoosi (branch prediction), harude etteotsustamist (branch target buffer, BTB) ja mõnikord ka harude viivituskohad (delay slots).
- Flush ja spekulatiivne täitmine — kui prognoos osutub valeks, tuleb torujuhe puhastada ja spekuleeritud käsud tagasi pöörata, mis vähendab jõudlust. Parema prognoosi ja väiksema torujuhtme sügavusega on valesti-prognoositud kahjude mõju väiksem.
Pipeliningu disainis tuleb tasakaalustada mitu aspekti: torujuhtme sügavus (rohkem etappe võimaldab kõrgemat takti, kuid suurendab latentsust ja prognoosi vigade kulu), vajalikud edastusskeemid, harude prognoosimise keerukus ja riistvara ressursid. Mitmed moodsa protsessori täiustused — nagu andmete edastamine, mitmeastmeline haruprognoosimine, spekulatiivne täitmine ja väljaspool järjestust täitmine — on loodud selleks, et vähendada pipeline’i poolt tekitatud viivitusi ja maksimeerida läbilaskevõime.
Lühikokkuvõte
Käskude torujuhtme (pipelining) eesmärk on jagada käsu täitmine etappideks, et töödelda samaaegselt mitut käsku ja seeläbi tõsta protsessori läbilaskevõimet. See vähendab iga etapi loogikaaja ning võimaldab kõrgemat taktsagedust, kuid tekitab andme-, struktuuri- ja hargnemishädasid, mida tuleb arhitektuuriga leevendada (edastamine, stallid, haruprognoos jne). Torujuhtme kavandamisel on oluline leida kompromiss jõudluse, keerukuse ja riistvararessursside vahel.

Põhiline viieastmeline protsessor RISC-masinas (IF = Instruction Fetch, ID = Instruction Decode, EX = Execute, MEM = Memory access, WB = Register write back). Vertikaalne telg on järjestikused käsud, horisontaalne telg on aeg. Seega on rohelises veerus kõige varasem käsk WB-staadiumis ja kõige hilisem käsk on käsu kättesaamise etapis.
Pipeliningi eelised ja puudused
Pipeliningi eelised:
- Protsessori tsükliaeg väheneb; suureneb käskude läbilaskevõime. Pipelining ei vähenda käsu täitmiseks kuluvat aega; selle asemel suurendab see samaaegselt ("korraga") töödeldavate käskude arvu ja vähendab lõpetatud käskude vahelist viivitust (mida nimetatakse "läbilaskevõimeks").
Mida rohkem on protsessoril torujuhtme etappe, seda rohkem käske saab ta "korraga" töödelda ja seda väiksem on viivitus lõpetatud käskude vahel. Kõik tänapäeval toodetud
üldotstarbelised mikroprotsessorid kasutavad vähemalt 2 kuni 30 või 40 astmelist torujuhtmeahelat. - Kui kasutatakse pipeliningi, saab protsessori aritmeetilise loogikaüksuse kavandada kiiremini, kuid see on keerulisem.
- Pipelining suurendab teoreetiliselt jõudlust võrreldes pipelininguta südamiku jõudlust mitu korda suuremaks (eeldusel, et ka taktsagedus suureneb sama palju) ja kood on ideaalne pipelininguga täitmiseks.
- Pipelined protsessorid töötavad üldiselt kõrgema taktsagedusega kui RAM-i taktsagedus (alates 2008. aasta tehnoloogiatest töötavad RAM-id madalamal sagedusel võrreldes CPU-de sagedusega), mis suurendab arvutite üldist jõudlust.
Pipeliningi puudused:
Pipeliningul on palju puudusi, kuigi protsessorite ja kompilaatorite projekteerijad kasutavad palju tehnikat, et enamik neist ületada; järgnevalt on esitatud loetelu levinumatest puudustest:
- Mitte-pipeliiniga protsessori konstruktsioon on lihtsam ja odavam valmistada, mitte-pipeliiniga protsessor täidab korraga ainult ühe käsu. Sellega välditakse hargnemiste hilinemist (pipeliningi puhul on iga hargnemine hilinenud) ning probleeme, kui järjestikuseid käske täidetakse samaaegselt.
- Pipelined protsessori puhul suurendab flip floppide lisamine moodulite vahele käskude latentsust võrreldes mittepipelined protsessoriga.
- Mitte-pipeliiniga protsessoril on määratletud käskude läbilaskevõime. Pipelined protsessori jõudlust on palju raskem ennustada ja see võib erinevate programmide puhul suuresti varieeruda.
- Paljude disainilahenduste torustikud on 7, 10, 20, 31 ja isegi rohkem astmeid; pika torustiku puuduseks on see, et kui programm hargneb, tuleb kogu torustik loputada (tühjendada). Pipeliinide suurem läbilaskevõime jääb puudulikuks, kui täidetav kood sisaldab palju hargnemisi: protsessor ei saa ette teada, kust lugeda järgmist käsku, ja peab ootama, kuni hargnemiskäsu lõpetatakse, jättes torujuhtme selle taga tühjaks. Seda puudust saab vähendada, kui ennustada, kas tingimuslik hargnemisjuhend hargneb eelneva tegevuse põhjal. Pärast hargnemise lahendamist peab järgmine käsk läbima kogu torujuhtme, enne kui selle tulemus muutub kättesaadavaks ja protsessor jätkab taas "tööd". Sellistel äärmuslikel juhtudel võib torujuhtmega protsessori jõudlus olla halvem kui torujuhtmeta protsessoril.
- Kahjuks ei ole kõik juhised sõltumatud. Lihtsa torujuhtme puhul võib ühe käsu täitmine nõuda 5 etappi. Täieliku jõudluse saavutamiseks peab see torujuhe käivitama 4 järgnevat sõltumatut käsku, samal ajal kui esimene käsk on lõpetatud. Mis tahes neist neljast käsust võib sõltuda esimese käsu väljundist, mille tõttu torujuhtme juhtloogika peab ootama ja lisama torujuhtmesse seisaku või raisku mineva taktsükli, kuni sõltuvus on lahendatud. Õnneks võivad sellised tehnikad nagu edastamine vähendada märkimisväärselt juhtumeid, kus on vaja peatada.
- Isemodifitseeruvad programmid ei pruugi torujuhtmelisel arhitektuuril korralikult käivituda, kui muudetavad käsud asuvad täidetavate käskude lähedal. Selle põhjuseks võib olla see, et käsud võivad juba olla eelvalimisjärjekorras, nii et muudatus ei pruugi mõjuda eelseisva käsu täitmise puhul. Käskude vahemälud muudavad probleemi veelgi hullemaks.
- Ohud: Kui programmeerija (või kompilaator) kirjutab koostekoodi, eeldab ta tavaliselt, et iga käsk täidetakse enne järgmise käsu täitmist. Kui seda eeldust ei kinnitata pipelininguga, põhjustab see programmi ebaõige käitumise, seda olukorda nimetatakse ohuks. Ohtude lahendamiseks või vältimiseks on olemas
mitmesugused tehnikad, näiteks edastamine ja viivitamine (peatamise või taktimõõdutsükli lisamise teel).
Näited
Üldine torujuhe
Paremal on kujutatud nelja etapiga üldine torustik:
- Tooge
- Decodeeri
- Täita
- Tagasi kirjutamine
Ülemine hall kast on nimekiri käskudest, mis ootavad täitmist; alumine hall kast on nimekiri käskudest, mis on juba lõpetatud; ja keskmine valge kast on torujuhtme nimekiri.
Täitmine on järgmine:
| Aeg | Täitmine |
| 0 | Täitmist ootab neli käsku |
| 1 |
|
| 2 |
|
| 3 |
|
| 4 |
|
| 5 |
|
| 6 |
|
| 7 |
|
| 8 |
|
| 9 | Kõik juhised täidetakse |
Bubble
Kui täitmises tekib "luksumine" (katkestus), tekib torujuhtmes "mull", milles ei toimu midagi kasulikku. Tsüklis 2 lükatakse lilla käsu kättesaamine edasi ja tsükli 3 dekodeerimisetapis on nüüd mull. Kõik, mis on lilla käsu taga, viibib samuti, kuid kõik, mis on lilla käsu ees, jätkab täitmist.
On selge, et võrreldes ülaltoodud täitmisega annab mull 7 taktimõõtme asemel 8 taktimõõtme täitmisaja.
Mullid on nagu peatused (viivitused), mille puhul ei toimu midagi kasulikku noppimise, dekodeerimise, täitmise ja tagasikirjutamise ajal. See on nagu NOP-kood (lühend No OPeration).
Näide 1
Tüüpiline käsk kahe arvu liitmiseks võib olla ADD A, B, C, mis liidab mälupunktides A ja B olevad väärtused ja seejärel paigutab tulemuse mälupunkti C. Pipeliiniprotsessoris jaotaks torujuhtmete kontroller selle rea ülesanneteks, mis on sarnased:
Asukohad "R1" ja "R2" on protsessori registrid. Mälukohti "A" ja "B" salvestatud väärtused laaditakse (kopeeritakse) nendesse registritesse, seejärel liidetakse need ja tulemus salvestatakse mälukohti "C".
Selles näites on torujuhe kolmeastmeline - laadimine, täitmine ja salvestamine. Kõiki etappe nimetatakse torujuhtme etappideks.
Mitte-pipeliiniga protsessoril saab korraga töötada ainult üks etapp, nii et kogu käsk peab enne järgmise käsu algust lõpule jõudma. Pipelined protsessoril võivad kõik etapid töötada korraga erinevate käskude kallal. Seega, kui see käsk on täitmisetapis, on teine käsk dekodeerimisetapis ja kolmas käsk on noppimisetapis.
Näide 2
Kontseptsiooni paremaks mõistmiseks võime vaadelda teoreetilist 3-astmelist torujuhtme:
| Etapp | Kirjeldus |
| Koormus | Mälust käsu lugemine |
| Täita | Käskluse täitmine |
| Kauplus | Tulemuse salvestamine mällu ja/või registritesse |
ja pseudokoodi koostelistingut, mida tuleb täita:
See oleks selline, kuidas seda teostatakse:
| Kell 1 | ||
| Koormus | Täita | Kauplus |
| LOAD |
|
|
LOAD-käsklus võetakse mälust.
| Kell 2 | ||
| Koormus | Täita | Kauplus |
| MOVE | LOAD |
|
Käsk LOAD täidetakse, samal ajal kui käsk MOVE võetakse mälust.
| Kell 3 | ||
| Koormus | Täita | Kauplus |
| ADD | MOVE | LOAD |
Käsk LOAD on salvestamise etapis, kus selle tulemus (number 40) salvestatakse registrisse A. Samal ajal täidetakse käsku MOVE. Kuna see peab liigutama A sisu B-sse, peab see ootama LOAD-käsu lõppu.
| Kell 4 | ||
| Koormus | Täita | Kauplus |
| POOD | ADD | MOVE |
Käsk STORE on laetud, samal ajal kui käsk MOVE on lõpetamas ja käsk ADD arvutab.
Ja nii edasi. Pange tähele, et mõnikord sõltub käsk teise käsu tulemusest (nagu meie näide MOVE). Kui rohkem kui üks käsk viitab operandi konkreetsele asukohale, kas lugedes seda (sisendina) või kirjutades seda (väljundina), võib nende käskude täitmine algsest programmijärjestusest erinevas järjekorras viia ohuolukordadeni (mida mainiti eespool).

Mull 3. tsüklis viivitab täitmist

Üldine 4-etapiline torujuhtme; värvilised kastid tähistavad üksteisest sõltumatuid juhiseid.
Seotud leheküljed
- Torustik (arvutamine)
- Paralleelne arvutamine
- Käskude tasandi paralleelsus
Küsimused ja vastused
K: Mis on käskude pipelining?
V: Käskude pipelining on moodsate mikroprotsessorite, mikrokontrollerite ja protsessorite projekteerimisel kasutatav tehnika, mille eesmärk on suurendada nende käskude läbilaskevõimet, jagades protsessori käsu töötlemise mitmeks sõltumatuks etapiks, mille lõpus on salvestusruum.
K: Kuidas toimib pipelining?
V: Pipelining toimib loogika väiksemateks osadeks jaotamise ja loogikatükkide vahele flip flopide lisamise teel, mis vähendab loogika väärtuste dekodeerimiseks kuluvat aega kuni nende väärtustest sõltuvate kehtivate väljundite genereerimiseni. See võimaldab kiiremaid taktimisi.
K: Millised on mõned näited torujuhtmete kohta?
V: Üks näide torujuhtme kohta on RISC-putk, mis on jaotatud viieks etapiks, mille iga etapi vahel on flip-flopide kogum.
K: Kuidas suurendab pipelining käskude läbilaskevõimet?
V: Pipelining suurendab käskude läbilaskevõimet, võimaldades protsessorimoodulitel töötada paralleelselt, mis vähendab tühikäiku käsutsükli ajal ja suurendab üldist töötlemisaega.
K: Kas kõik torujuhtmed on täielikult torustikuga varustatud?
V: Ei, mitte kõik torujuhtmed ei ole täielikult torujuhtmepõhised; mõnes torujuhtmes on ootetsüklid, mis aeglustavad edasiliikumist torujuhtmes.
Otsige