Wat is een instructiepijplijn?

click fraud protection

Elke processorinstructie heeft meerdere fasen in zijn werking. Elk van deze fasen duurt een enkele CPU-cyclus om te voltooien. Deze fasen zijn Instructie ophalen, Instructie decoderen, Uitvoeren, Geheugentoegang en Terugschrijven. Deze krijgen respectievelijk de instructie die moet worden voltooid, scheiden de bewerking van de waarden die worden gebruikt aan, voer het proces uit, open het register waarop het resultaat zal worden geschreven en schrijf het resultaat naar de geopende register.

Historisch in orderverwerkers

In vroege computers gebruikte de CPU geen instructiepijplijn. In deze CPU's moest elke bewerking met één cyclus voor elke instructie plaatsvinden. Dit betekende dat het vijf klokcycli duurde voordat de gemiddelde instructie volledig was verwerkt voordat de volgende kon worden gestart. Bij sommige bewerkingen hoeft geen resultaat naar een register te worden weggeschreven, wat betekent dat de fasen van geheugentoegang en terugschrijven kunnen worden overgeslagen.

In een subscalaire processor zonder pijplijn wordt elk deel van elke instructie in volgorde uitgevoerd.

Er is echter een probleem op de loer bij het uitvoeren van een volledige instructie in de juiste volgorde voordat u door kunt gaan naar de volgende instructie. Het probleem is de cachemisser. De CPU slaat gegevens op die hij actief verwerkt in het register. Dit is toegankelijk met een latentie van één cyclus. Het probleem is dat het register klein is omdat het in de processorkern is ingebouwd. De CPU moet naar de grotere maar langzamere L1-cache gaan als de gegevens nog niet zijn geladen. Als het er niet is, moet het opnieuw naar de grotere en langzamere L2-cache gaan. De volgende stap is de L3-cache; de laatste optie is het systeem-RAM. Elk van deze opties kost steeds meer CPU-cycli om te controleren.

Nu kan deze extra toegevoegde latentie een groot probleem zijn in een systeem dat elke instructie in de juiste volgorde moet voltooien voordat de volgende instructie wordt gestart. Wat een processor van 5 cycli per instructie was, kan plotseling tientallen of honderden klokcycli vastlopen op één instructie. Al die tijd kan er niets anders op de computer gebeuren. Technisch gezien kan dit enigszins worden verlicht door twee onafhankelijke kernen te hebben. Niets weerhoudt hen er echter van om hetzelfde te doen, mogelijk tegelijkertijd. Dus het aflopen van de multi-core route lost dit niet op.

De klassieke RISC-pijpleiding

RISC staat voor Reduced Instruction Set Computer. Het is een stijl van processorontwerp die de prestaties optimaliseert door het decoderen van elke instructie gemakkelijker te maken. Dit is in vergelijking met CISC of Complex Instruction Set Computer, die complexere instructiesets ontwerpt waardoor er minder instructies nodig zijn om dezelfde taken uit te voeren.

Het klassieke RISC-ontwerp omvat een instructiepijplijn. In plaats van een van de vijf instructiefasen in een bepaalde cyclus uit te voeren, staat de pijplijn toe dat alle vijf fasen worden uitgevoerd. Natuurlijk kunt u niet alle vijf fasen van één instructie in een cyclus uitvoeren. Maar u kunt vijf opeenvolgende instructies in de wachtrij plaatsen met elk een offset van één fase. Op deze manier kan elke klokcyclus een nieuwe instructie worden voltooid. Biedt een potentiële 5x prestatieverhoging voor een relatief lage stijging van de kerncomplexiteit.

In een scalaire pijplijnprocessor kan elke fase van een instructie-uitvoering eenmaal per klokcyclus worden uitgevoerd. Dit maakt een maximale doorvoer van één voltooide instructie per cyclus mogelijk.

Processors die geen pijplijn hebben, kunnen alleen sub-scalair zijn, omdat ze niet één volledige instructie per cyclus kunnen uitvoeren. Met deze primaire pijplijn met vijf fasen kunt u een scalaire CPU maken die een instructie voor elk proces kan voltooien. Door nog verdergaande pijplijnen te maken, kun je superscalaire CPU's maken die meer dan één instructie per klokcyclus kunnen uitvoeren. Natuurlijk zijn er nog mogelijke problemen.

Nog steeds sequentieel

Niets van dit alles lost het probleem op van vele cycli wachten op een antwoord wanneer de verschillende niveaus van cache en RAM moeten worden opgevraagd. Het introduceert ook een nieuw probleem. Wat als een instructie afhankelijk is van de uitvoer van de vorige instructie? Deze problemen worden zelfstandig opgelost met een geavanceerde dispatcher. Het plant de volgorde van uitvoering zorgvuldig, zodat instructies die afhankelijk zijn van de uitvoer van een ander niet te dicht bij elkaar staan. Het behandelt ook cache-missers door een instructie te parkeren en deze in de pijplijn te vervangen door andere instructies die klaar zijn om te worden uitgevoerd en die het resultaat niet nodig hebben, hervat de instructie wanneer deze is klaar.

Deze oplossingen kunnen werken op processors zonder pijplijn, maar ze zijn vereist voor een superscalaire processor die meer dan één instructie per klok uitvoert. Een vertakkingsvoorspeller is ook zeer nuttig omdat deze kan proberen de uitkomst van een instructie met meer dan één mogelijke uitkomst te voorspellen en door te gaan ervan uit te gaan dat deze correct is, tenzij het tegendeel wordt bewezen.

Conclusie

Een pijplijn zorgt ervoor dat alle verschillende mogelijkheden van de processor in elke cyclus kunnen worden gebruikt. Het doet dit door verschillende fasen van verschillende instructies tegelijkertijd uit te voeren. Dit voegt niet eens veel complexiteit toe aan het CPU-ontwerp. Het maakt ook de weg vrij om meer dan één instructie in staat te stellen een enkele fase per cyclus uit te voeren.