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.



