Käskude pipelining
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õhiidee on jagada (nn jagada) protsessori käsu töötlemine, nagu on määratletud käsu mikrokoodis, mitmeks sõltumatuks mikrooperatsioonide (mida nimetatakse ka "mikrokäsudeks", "mikro-op" või "µop") etapiks, kusjuures iga etapi lõpus toimub salvestamine. See võimaldab protsessori kontroll-logikal käske töödelda kõige aeglasema sammu töötluskiirusega, mis on palju kiirem kui käsu ühe sammuna töötlemiseks vajalik aeg.
Mõiste torujuhtme viitab sellele, et iga samm kannab ühte mikroinstruktsiooni (nagu veetilk) ja iga samm on seotud teise sammuga (analoogia; sarnane veetorudele).
Enamik kaasaegseid protsessoreid juhitakse taktiga. Protsessor koosneb sisemiselt loogikast ja mälust (flip flops). Kui taktsignaal saabub, salvestavad flip flops oma uue väärtuse, seejärel vajab loogika aega, et dekodeerida flip flopide uued väärtused. Seejärel saabub järgmine taktsignaal ja flip flopid salvestavad teise väärtuse jne. Loogika jaotamine väiksemateks osadeks ja flip floppide lisamine loogika osade vahele vähendab loogika ajakulu (väärtuste dekodeerimiseks kuni nende väärtuste alusel kehtivate väljundite genereerimiseni). Sel viisil saab vähendada taktsagedusperioodi.
Näiteks RISC-putk on jaotatud viieks etapiks, mille vahel on flip-flopid järgmiselt:
- Käskude hankimine
- Käskude dekodeerimine ja registrite hankimine
- Täita
- Juurdepääs mälule
- Registreeri tagasi kirjutada
Pipelininguga protsessorid koosnevad sisemiselt etappidest (moodulitest), mis võivad pooleldi sõltumatult töötada eraldi mikrokäskude kallal. Iga etapp on flip floppide abil seotud järgmise etapiga (nagu "ahel"), nii et etapi väljund on sisendiks teisele etapile, kuni käskude töötlemise töö on lõpetatud. Selline protsessori sisemiste moodulite korraldus vähendab käsu üldist töötlemisaega.
Mitte-pipeline'i arhitektuur ei ole nii tõhus, sest mõned protsessorimoodulid on käsutsükli ajal tühikäigul, samal ajal kui mõni teine moodul on aktiivne. Pipelining ei kõrvalda täielikult tühikäiguaega, kuid protsessorimoodulite paralleelne töötamine suurendab käskude läbilaskevõimet.
Käskude torujuhtme kohta öeldakse, et see on täielikult torujuhtmega, kui see suudab võtta vastu uue käsu iga taktsükli järel. Täielikult torustikuga mitte varustatud torujuhtmes on ootetsüklid, mis aeglustavad torujuhtme edenemist.
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.