Pipeline (datorhårdvara)

Instruktionspipelining är en teknik som används vid utformningen av moderna mikroprocessorer, mikrokontroller och CPU:er för att öka deras instruktionsgenomströmning (antalet instruktioner som kan utföras på en tidsenhet).

Huvudidén är att dela upp (så kallad "split") behandlingen av en CPU-instruktion, enligt definitionen i instruktionsmikrokoden, i en serie oberoende steg av mikrooperationer (även kallade "mikroinstruktioner", "micro-op" eller "µop"), med lagring i slutet av varje steg. Detta gör det möjligt för processorns styrlogik att hantera instruktioner med den bearbetningshastighet som gäller för det långsammaste steget, vilket är mycket snabbare än den tid som krävs för att bearbeta instruktionen som ett enskilt steg.

Termen pipeline syftar på det faktum att varje steg innehåller en enda mikroinstruktion (som en vattendroppe) och att varje steg är kopplat till ett annat steg (analogi; liknar vattenledningar).

De flesta moderna processorer drivs av en klocka. CPU:n består internt av logik och minne (flipflops). När klocksignalen anländer lagrar flipflopsen sitt nya värde, varefter logiken behöver en viss tid för att avkoda flipflopsen nya värden. Därefter kommer nästa klockpuls och flip-flopsen lagrar ytterligare ett värde, och så vidare. Genom att dela upp logiken i mindre delar och sätta in flipflops mellan logikdelarna minskas den tid som logiken behöver (för att avkoda värden till dess att giltiga utgångar genereras beroende på dessa värden). På detta sätt kan klockperioden minskas. RISC-pipeline delas till
exempel upp i fem steg med en uppsättning flipflops mellan varje steg enligt följande:

  1. Hämtning av instruktioner
  2. Instruktionsavkodning och registerhämtning
  3. Utför
  4. Tillgång till minnet
  5. Registrera tillbaka

Processorer med pipelining består internt av steg (moduler) som halvt oberoende av varandra kan arbeta med separata mikroinstruktioner. Varje steg är kopplat till nästa steg genom flip-flops (som en "kedja") så att stegets utgång är en ingång till ett annat steg tills arbetet med att bearbeta instruktionerna är klart. En sådan organisation av processorns interna moduler minskar instruktionens totala behandlingstid.

En arkitektur utan pipeline är inte lika effektiv eftersom vissa CPU-moduler är inaktiva medan en annan modul är aktiv under instruktionscykeln. Pipelineringen tar inte helt bort den tid då CPU:n är ledig i en pipelinerad CPU, men genom att CPU-modulerna arbetar parallellt ökar instruktionsgenomströmningen.

En instruktionspipeline sägs vara helt pipelinerad om den kan ta emot en ny instruktion varje klockcykel. En pipeline som inte är helt pipelinerad har väntecykler som fördröjer pipelinjens framskridande.

Grundläggande pipeline i fem steg i en RISC-maskin (IF = hämta instruktioner, ID = avkoda instruktioner, EX = utföra, MEM = minnesåtkomst, WB = skriva tillbaka register). Den vertikala axeln är successiva instruktioner, den horisontella axeln är tid. I den gröna kolumnen befinner sig den tidigaste instruktionen i WB-stadiet och den senaste instruktionen är i färd med att hämta instruktioner.Zoom
Grundläggande pipeline i fem steg i en RISC-maskin (IF = hämta instruktioner, ID = avkoda instruktioner, EX = utföra, MEM = minnesåtkomst, WB = skriva tillbaka register). Den vertikala axeln är successiva instruktioner, den horisontella axeln är tid. I den gröna kolumnen befinner sig den tidigaste instruktionen i WB-stadiet och den senaste instruktionen är i färd med att hämta instruktioner.

Fördelar och nackdelar med pipelining

Fördelar med pipelining:

  1. Processorns cykeltid minskas, vilket ökar genomströmningen av instruktioner. Pipelining minskar inte den tid det tar att slutföra en instruktion, utan ökar antalet instruktioner som kan behandlas samtidigt ("på en gång") och minskar fördröjningen mellan avslutade instruktioner (kallas "genomströmning").
    Ju fler pipeline-steg en processor har, desto fler instruktioner kan den bearbeta "samtidigt" och desto mindre är fördröjningen mellan avslutade instruktioner. Varje vanlig mikroprocessor för
    allmänt bruk som tillverkas idag använder minst två pipeline-steg och upp till 30 eller 40 steg.
  2. Om pipelining används kan CPU:s aritmetiska logikenhet utformas snabbare, men den blir mer komplex.
  3. Pipelining ökar i teorin prestandan jämfört med en kärnan utan pipelining med en faktor som motsvarar antalet steg (om man antar att klockfrekvensen ökar med samma faktor) och koden är idealisk för pipeline-utförande.
  4. Processorer med pipeliner arbetar i allmänhet med en högre klockfrekvens än RAM-frekvensen (från och med 2008 års teknik arbetar RAM med låga frekvenser jämfört med CPU-frekvenser), vilket ökar datorns totala prestanda.

Nackdelar med pipelining:

Pipelining har många nackdelar, även om det finns många tekniker som används av processor- och kompilatorkonstruktörer för att övervinna de flesta av dem; nedan följer en lista över vanliga nackdelar:

  1. En icke-pipelinerad processor är enklare och billigare att tillverka, eftersom den endast utför en enda instruktion åt gången. Detta förhindrar fördröjning av förgreningar (i Pipelining fördröjs varje förgrening) och problem när seriella instruktioner utförs samtidigt.
  2. I en pipelinerad processor ökar instruktionsfördröjningen genom att flipflops sätts in mellan modulerna jämfört med en icke-pipelinerad processor.
  3. En icke-pipelinerad processor kommer att ha en definierad instruktionsgenomströmning. Prestandan hos en pipelinerad processor är mycket svårare att förutsäga och kan variera kraftigt för olika program.
  4. Många konstruktioner innehåller pipelines som är så långa som 7, 10, 20, 31 eller ännu fler steg; en nackdel med en lång pipeline är att när ett program förgrenar sig måste hela pipelinen spolas (rensas). Den högre genomströmningen hos pipelines blir inte tillräcklig när den exekverade koden innehåller många förgreningar: processorn kan inte veta i förväg var nästa instruktion ska läsas och måste vänta på att förgreningsinstruktionen avslutas, vilket gör att pipelinen bakom den blir tom. Denna nackdel kan minskas genom att förutsäga om en villkorlig greninstruktion kommer att grena baserat på tidigare aktivitet. Efter att förgreningen är avklarad måste nästa instruktion resa hela vägen genom pipeline innan dess resultat blir tillgängligt och processorn fortsätter att "arbeta" igen. I sådana extrema fall kan prestandan hos en pipelineprocessor vara sämre än hos en icke-pipelineprocessor.
  5. Tyvärr är inte alla instruktioner oberoende. I en enkel pipeline kan det krävas fem steg för att slutföra en instruktion. För att kunna arbeta med full prestanda måste denna pipeline köra fyra efterföljande oberoende instruktioner medan den första avslutas. Någon av dessa fyra instruktioner kan vara beroende av den första instruktionens resultat, vilket gör att pipelinekontrolllogiken måste vänta och lägga in ett stopp eller en bortkastad klockcykel i pipelinen tills beroendet har lösts. Lyckligtvis kan tekniker som forwarding avsevärt minska antalet fall där det krävs fördröjning.
  6. Självmodifierande program kan misslyckas med att exekvera korrekt på en pipelined-arkitektur när instruktionerna som modifieras ligger nära de instruktioner som utförs. Detta kan orsakas av att instruktionerna kanske redan finns i Prefetch Input Queue, så att ändringen kanske inte får effekt för den kommande exekveringen av instruktionerna. Instruktionscacher gör problemet ännu värre.
  7. Faror: När en programmerare (eller kompilator) skriver assemblerkod utgår de i allmänhet från att varje instruktion utförs innan nästa instruktion utförs. När detta antagande inte bekräftas genom pipelining leder det till att ett program beter sig felaktigt. Det finns
    olika
    tekniker för att lösa faror eller för att kringgå dem, t.ex. forwarding och fördröjning (genom att lägga in ett stopp eller en bortkastad klockcykel).

Exempel

Generisk pipeline

Till höger visas en generisk pipeline med fyra steg:

  1. Hämta
  2. Avkoda
  3. Utför
  4. Återskrivning

Den övre grå rutan är listan över instruktioner som väntar på att utföras, den nedre grå rutan är listan över instruktioner som har slutförts och den mittersta vita rutan är pipelinen.

Utförandet sker på följande sätt:

Tid

Genomförande

0

Fyra instruktioner väntar på att utföras

1

  • den gröna instruktionen hämtas från minnet

2

  • Den gröna instruktionen avkodas.
  • den lila instruktionen hämtas från minnet

3

  • Den gröna instruktionen utförs (den faktiska operationen utförs).
  • Den lila instruktionen avkodas.
  • den blå instruktionen hämtas

4

  • Den gröna instruktionens resultat skrivs tillbaka till registerfilen eller minnet.
  • Den lila instruktionen utförs.
  • den blå instruktionen avkodas
  • den röda instruktionen hämtas

5

  • den gröna instruktionen är slutförd
  • den lila instruktionen skrivs tillbaka
  • den blå instruktionen utförs
  • Den röda instruktionen avkodas.

6

  • Den lila instruktionen är slutförd
  • den blå instruktionen skrivs tillbaka
  • Den röda instruktionen utförs.

7

  • den blå instruktionen är slutförd
  • Den röda instruktionen skrivs tillbaka.

8

  • den röda instruktionen är avslutad

9

Alla instruktioner utförs

Bubbla

När en "hicka" (avbrott) i utförandet inträffar skapas en "bubbla" i pipelinen där inget användbart händer. I cykel 2 försenas hämtningen av den lila instruktionen och avkodningssteget i cykel 3 innehåller nu en bubbla. Allt som ligger bakom den lila instruktionen försenas också, men allt som ligger framför den lila instruktionen fortsätter att utföras.

Jämfört med utförandet ovan ger bubblan en sammanlagd utföringstid på 8 klockticks i stället för 7.

Bubblor är som en fördröjning, där inget användbart händer under hämtning, avkodning, exekvering och återskrivning. Det är som en NOP-kod (förkortning för No OPeration).

Exempel 1

En typisk instruktion för att addera två tal kan vara ADD A, B, C, som adderar värdena i minnesplatserna A och B och sedan placerar resultatet i minnesplats C. I en pipelineprocessor skulle pipelinecontrollern dela upp detta i en serie uppgifter som liknar följande:

LOAD A, R1 LOAD B, R2 ADD R1, R2, R3 STORE R3, C LOAD nästa instruktion

Platserna "R1" och "R2" är register i CPU:n. De värden som finns lagrade på minnesplatserna "A" och "B" laddas (kopieras) till dessa register, adderas sedan och resultatet lagras på minnesplatsen "C".

I det här exemplet består pipelinen av tre steg: ladda, utföra och lagra. Varje steg kallas pipeline-steg.

På en icke-pipelinerad processor kan endast ett steg arbeta åt gången, så hela instruktionen måste slutföras innan nästa instruktion kan påbörjas. På en pipelined-processor kan alla steg arbeta samtidigt med olika instruktioner. Så när denna instruktion är i utförandestadiet kommer en andra instruktion att vara i avkodningsstadiet och en tredje instruktion kommer att vara i hämtarstadiet.

Exempel 2

För att bättre förstå konceptet kan vi titta på en teoretisk pipeline i tre steg:

Scen

Beskrivning

Ladda

Läs instruktion från minnet

Utför

Utför instruktion

Butik

Lagra resultatet i minnet och/eller register

och en pseudokod som ska exekveras:

LOAD #40, A ; ladda 40 i A MOVE A, B ; kopiera A i B ADD #20, B ; lägg till 20 i B STORE B, 0x300 ; lagra B i minnescellen 0x300

Så här skulle det genomföras:

Klockan 1

Ladda

Utför

Butik

LOAD

 

 

LOAD-instruktionen hämtas från minnet.

Klockan 2

Ladda

Utför

Butik

MOVE

LOAD

 

LOAD-instruktionen utförs medan MOVE-instruktionen hämtas från minnet.

Klockan 3

Ladda

Utför

Butik

LÄGG TILL

MOVE

LOAD

LOAD-instruktionen befinner sig i Store-stadiet, där dess resultat (siffran 40) kommer att lagras i register A. Under tiden utförs MOVE-instruktionen. Eftersom den måste flytta innehållet i A till B måste den vänta på att LOAD-instruktionen avslutas.

Klockan 4

Ladda

Utför

Butik

STORE

LÄGG TILL

MOVE

STORE-instruktionen laddas, medan MOVE-instruktionen avslutas och ADD beräknas.

Och så vidare. Observera att en instruktion ibland är beroende av resultatet av en annan instruktion (som i vårt exempel MOVE). När mer än en instruktion hänvisar till en viss plats för en operand, antingen genom att läsa den (som en ingång) eller skriva den (som en utgång), kan utförandet av dessa instruktioner i en ordning som skiljer sig från den ursprungliga programordningen leda till den ovan nämnda riskfyllda situationen.

Generisk 4-stegs pipeline; de färgade rutorna representerar instruktioner som är oberoende av varandra.Zoom
Generisk 4-stegs pipeline; de färgade rutorna representerar instruktioner som är oberoende av varandra.

En bubbla i cykel 3 fördröjer utförandetZoom
En bubbla i cykel 3 fördröjer utförandet

Relaterade sidor

  • Pipeline (databehandling)
  • Parallell beräkning
  • Parallellism på instruktionsnivå

Frågor och svar

F: Vad är instruktionspipelining?


S: Instruktions-pipelining är en teknik som används vid utformningen av moderna mikroprocessorer, mikrokontroller och CPU:er för att öka deras instruktionsgenomströmning genom att dela upp behandlingen av en CPU-instruktion i en serie oberoende steg med lagring i slutet av varje steg.

F: Hur fungerar pipelining?


S: Pipelining fungerar genom att logiken delas upp i mindre bitar och genom att flipflops sätts in mellan logikdelarna, vilket minskar den tid som krävs för logiken att avkoda värden tills den genererar giltiga utgångar beroende på dessa värden. Detta möjliggör snabbare klockperioder.

F: Vilka är några exempel på pipelines?


S: Ett exempel på en pipeline är RISC-pipeline, som är uppdelad i fem steg med en uppsättning flipflops mellan varje steg.

F: Hur ökar pipelineringen instruktionsgenomströmningen?


S: Pipelining ökar instruktionsgenomströmningen genom att CPU-moduler kan arbeta parallellt, vilket minskar tomgångstiden under en instruktionscykel och ökar den totala bearbetningstiden.

F: Är varje pipeline helt pipelinerad?


S: Nej, alla pipelines är inte helt pipelinerade. Vissa pipelines har väntecykler som fördröjer framstegen i pipelinen.

AlegsaOnline.com - 2020 / 2023 - License CC3