Käskyjen putkitus on tekniikka, jota käytetään nykyaikaisten mikroprosessoreiden, mikrokontrollerien ja suorittimien suunnittelussa niiden käskykapasiteetin (aikayksikössä suoritettavien ohjeiden määrä) lisäämiseksi. Putkitus kasvattaa läpimenoa ottamalla useita käskyjä samanaikaisesti eri käsittelyvaiheisiin siten, että jokainen vaihe tekee oman osansa ja välittää tuloksen seuraavalle.

Perusajatuksena on jakaa (ns. jakaa) suorittimen käskyn käsittely käskyn mikrokoodin määrittelemänä sarjaksi itsenäisiä mikrooperaatioiden vaiheita (joita kutsutaan myös "mikroohjeiksi", "mikro-opiksi" tai "µopiksi"), ja kunkin vaiheen lopussa on varastointi. Näin suorittimen ohjauslogiikka voi käsitellä ohjeita hitaimman vaiheen käsittelynopeudella, joka on paljon nopeampi kuin aika, joka tarvitaan käskyn käsittelyyn yksittäisenä vaiheena. Huomaa, että kaikki arkkitehtuurit eivät käytä mikrokoodia; monissa RISC-toteutuksissa vaiheet ovat kiinteästi johdettuja, kun taas monissa CISC-toteutuksissa käskyt muunnetaan sisäisiksi µopeiksi.

Termi "putki" viittaa siihen, että jokainen askel sisältää yhden mikroinstruktion (kuten vesipisara) ja jokainen askel on yhteydessä toiseen askeleeseen (analogia; kuten vesiputket). Kun putki on “täynnä”, jokaisella kellosykillä valmistuu yksi käsky, vaikka yksittäisen käskyn kokonaisviive koostuu useista vaiheista.

Useimpia nykyaikaisia suorittimia ohjaa kello. Keskusyksikkö koostuu sisäisesti logiikasta ja muistista (flip flopeista). Kun kellosignaali saapuu, fläppiflopit tallentavat uuden arvonsa, minkä jälkeen logiikka tarvitsee ajan purkaakseen fläppien uudet arvot. Seuraavan kellopulssin saapuessa fläppiflopit tallentavat uuden arvon ja niin edelleen. Jakamalla logiikka pienempiin osiin ja lisäämällä flip‑flop‑rekistereitä (putkirekistereitä) logiikan osien väliin logiikan tarvitsema aika (arvojen dekoodaamiseen ja arvojen perusteella kelvollisten ulostulojen tuottamiseen) lyhenee. Tällä tavoin voidaan lyhentää kellojaksoa ja kasvattaa kellotaajuutta.

Esimerkki: 5-vaiheinen RISC-putki

Esimerkiksi RISC-putki jaetaan viiteen vaiheeseen, joiden välissä on joukko flip-floppeja seuraavasti:

  1. Käskyn nouto
  2. Käskyn dekoodaus ja rekisterin haku
  3. Suorita
  4. Muistin käyttö
  5. Rekisterin kirjoitus takaisin

Prosessorit, joissa on putkijohdotus, koostuvat sisäisesti vaiheista (moduuleista), jotka voivat työskennellä puoliksi itsenäisesti erillisten mikroohjeiden parissa. Kukin vaihe on flip-flopeilla kytketty seuraavaan vaiheeseen ("ketju") siten, että vaiheen ulostulo on tulo toiselle vaiheelle, kunnes käskyjen käsittely on suoritettu. Tällainen prosessorin sisäisten moduulien organisointi lyhentää ohjeen kokonaiskäsittelyaikaa ja ennen kaikkea kasvattaa läpimenoa, koska useita käskyjä on työn alla yhtä aikaa.

Ei-pipeline-arkkitehtuuri ei ole yhtä tehokas, koska jotkin suorittimen moduulit ovat käyttämättömiä, kun taas toinen moduuli on aktiivinen käskysyklin aikana. Putkijohdotus ei poista kokonaan tyhjäkäyntiä putkijohdotetussa suorittimessa, mutta suorittimen moduulien rinnakkaistoiminta lisää käskyjen läpimenoa merkittävästi verrattuna yksivaiheiseen toteutukseen.

Komentoputken sanotaan olevan täysin putkitettu, jos se voi ottaa vastaan uuden komennon joka kellojaksolla. Putkilinjassa, joka ei ole täysin putkitettu, on odotusjaksoja, jotka viivästyttävät putken etenemistä. Tyypillisiä syitä ovat pitkät muistitapahtumat, monisykliset toiminnalliset yksiköt (esim. kertoja) tai jaettujen resurssien konfliktit.

Suorituskyky: läpimeno vs. viive

Putkitus parantaa läpimenoa (käskyä per sykli, IPC), mutta yhden käskyn viive ei lyhene; se on usein jopa pidempi putkirekisterien ja vaiheiden lukumäärän vuoksi. Ihannetilanteessa, kun vaiheajat on tasapainotettu ja häiriöitä ei esiinny, N-vaiheinen putki voi valmistaa yhden käskyn per sykli, jolloin teoreettinen nopeutus verrattuna ei-putkitetuun toteutukseen lähestyy N:ää. Käytännössä nopeutusta rajoittavat epätasapainoiset vaiheajat, muistiviiveet ja haarojen aiheuttamat katkokset.

Putkihäiriöt (hazardit)

  • Rakenteellinen häiriö: kaksi tai useampia vaiheita tarvitsee samaa resurssia yhtä aikaa (esim. yksi muistiväylä sekä käskyille että datoille). Seurauksena on odotus tai kupla putkessa.
  • Datahäiriö: käsky tarvitsee operandin, jota edellinen käsky ei ole vielä tuottanut. Alalajit: RAW (read after write), WAR (write after read) ja WAW (write after write).
  • Ohjaushäiriö: ehdolliset hypyt ja haarat muuttavat suorituksen suuntaa; jos suuntaa ei tiedetä ajoissa, väärin haetut käskyt täytyy hylätä (flush), mikä aiheuttaa viiveen.

Häiriöiden hallinta

  • Edelleenohjaus / bypass: välitetään juuri laskettu tulos suoraan seuraaville vaiheille ilman, että odotetaan rekisterikirjoitusta.
  • Putkilukko (stall) ja NOP-kuplat: pysäytetään vaiheita, kunnes tarvittava data tai resurssi on saatavilla.
  • Haaran ennustus ja spekulointi: ennustetaan haaran suunta ja kohde (esim. kohdepuskurit, paluupinot); väärä ennuste tyhjentää putken ja aiheuttaa rangaistuksen, joka kasvaa putken syventyessä.
  • Dynaaminen ajoitus ja rekisterien uudelleennimeäminen: vähennetään WAR/WAW-konflikteja ja mahdollistetaan out-of-order-suoritus, joka pitää putken täytenä, vaikka osa käskyistä odottaa operandia.
  • Kääntäjän ajoitukset: käskyjen uudelleenjärjestely ja latenssien piilottaminen (esim. delay slot -tekniikat joissakin arkkitehtuureissa).

Syvempi ja leveämpi putki

Putkea voi syventää (lisää vaiheita) taajuuden kasvattamiseksi, mutta silloin vaiheiden tasapainotus vaikeutuu ja haaravirheen rangaistus kasvaa. Putkea voi myös leventää (superskalaari): dekoodataan ja käynnistetään useita käskyjä per sykli useisiin rinnakkaisiin toiminnallisiin yksiköihin. Leveät putket vaativat monimutkaista välittäjälogiikkaa ja rekisteritiedoston moninkertaisia portteja.

Muisti ja välimuistit

Muistivaiheeseen liittyy usein suurin vaihtelu. Välimuistit lyhentävät keskimääräistä latenssia, mutta välimuistihutit voivat pysäyttää useita vaiheita. Yleisiä tekniikoita ovat kuorman/esihakuputket, myymäläpuskuri (store buffer), muistin riippumattomuuden analyysi (memory disambiguation) ja erilliset käsky-/datapolut rakenteellisten häiriöiden vähentämiseksi.

Mikrokoodi ja µopit

Monimutkaiset käskyt voidaan suorittaa mikrokoodatun mikrosekvensserin avulla tai purkaa yhden tai useamman µopin jonoiksi. Nämä µopit kulkevat putken läpi kuten RISC-tyyppiset operaatiot. Joissakin toteutuksissa µopeja voidaan yhdistää (fusion) vähentämään dekoodin ja ajoituksen kuormaa.

Esimerkkikulku 5-vaiheisessa putkessa

Kun ensimmäinen käsky on noudettu (sykli 1), toinen käsky voidaan noutaa heti seuraavassa syklissä samalla, kun ensimmäinen dekoodataan. Sykleissä 3–5 ensimmäinen etenee suoritus-, muisti- ja kirjoitusvaiheisiin, ja samalla toinen, kolmas, neljäs ja viides käsky ovat eri vaiheissa. Syklistä 5 eteenpäin putki tuottaa yhden valmiin käskyn per sykli, kunnes tulee häiriö (esim. haaran virhe-ennuste tai välimuistihuti), joka tyhjentää tai pysäyttää joitakin vaiheita.

Osittain putkitetut yksiköt ja erikoistoiminnot

Kaikki yksiköt eivät välttämättä ole täysin putkitetut. Esimerkiksi kertolaskin tai liukulukuyksikkö voi olla monisyklinen: se voi aloittaa uuden operaation vain joka n:s sykli tai sen tulos valmistuu usean syklin jälkeen. Tällöin ajoituslogiikka huolehtii kuplien lisäämisestä tai ohjaa käskyjä vaihtoehtoisiin yksiköihin, kun mahdollista.

Suunnittelukompromissit

  • Taajuus vs. virrankulutus: syvemmät putket nostavat taajuutta mutta lisäävät kulutusta ja lämpöä.
  • Monimutkaisuus vs. hyöty: haaran ennustus, dynaaminen ajoitus ja rename parantavat läpimenoa mutta kasvattavat pinta-alaa ja verifiointityötä.
  • Tarkat keskeytykset: arkkitehtuurin tila on palautettava johdonmukaiseksi häiriöiden ja poikkeusten sattuessa; tämä vaatii sitoumusvaiheen (retire/commit), joka säilyttää ohjelmallisen järjestyksen.

Yhteenvetona putkitus on keskeinen tekniikka, jolla kasvatetaan suorittimien tehokkuutta: se mahdollistaa useiden käskyjen samanaikaisen käsittelyn, maksimoi resurssien käyttöasteen ja skaalautuu sekä korkeampiin kellotaajuuksiin että laajempiin rinnakkaisiin toteutuksiin, kunhan häiriöt hallitaan tehokkaasti.