# Pipeline-architectuur

Een pipeline-architectuur is een methode in de digitale logica waarbij een operatie die meerdere losse bewerkingen vereist op een instructie (of een ander gegeven) zodanig te construeren dat elke losse bewerking niet hoeft te wachten op de vorige bewerking, maar dat elke losse bewerking onafhankelijk kan werken op een instructie, zodat alle andere bewerkingen niet werkeloos hoeven te wachten. Dit is te vergelijken met een lopende band, waar elke keer iets aan een product (bijvoorbeeld een auto) wordt toegevoegd, de plaats waar de motor wordt gemonteerd plaatst een motor in auto 56 en hoeft niet te wachten tot de deuren gemonteerd zijn aan auto 72. Een lopende band is volledig bezet met auto's, aan het begin alleen een paar losse carrosseriedelen, aan het einde een complete auto, met daartussenin auto's in verschillende assemblagefases.

## Pipeline in een microprocessor

Het bekendste voorbeeld van een pipeline is in een microprocessor waarbij een instructie eerst wordt gedecodeerd, dan wordt uitgevoerd, en waarna de resultaten van de instructie worden weggeschreven. Zonder pipeline zou het uitvoeren van de instructie pas kunnen worden uitgevoerd nadat deze is gedecodeerd, en moet deze unit dus wachten. Door de pipelineconstructie decodeert de decoderingsunit alvast de volgende instructie, terwijl de uitvoerunit de huidige instructie uitvoert, en de wegschrijfunit de resultaten van de vorige instructie wegschrijft. Op deze manier zijn alle units altijd bezig en wordt dus de effectieve doorvoersnelheid verhoogd; als nadeel geldt dat de latency toeneemt (een verandering aan de ingang heeft een aantal klokcycli nodig voordat deze ook aan de uitgang is aangekomen). Ook treden er problemen op wanneer de volgende instructie afhangt van resultaten van de vorige instructie, de pipeline moet dan wachten (pipeline stall); of in het geval dat er een jump naar een ander uitvoeradres gemaakt moet worden, moet zelfs de pipeline worden geleegd (pipeline flush).
Bij sommige processors is het onder bepaalde condities mogelijk geen flush bij een jump uit te voeren: de instructie (na de jumpinstructie) die normaal zou worden weggegooid, wordt gewoon uitgevoerd. Door de instructie die normaal voor de jump geplaatst wordt, na de jump te plaatsen en pipeline-flush uit te schakelen kan dit een klein tijdwinst opleveren. Op deze manier kost een jump effectief maar 1 klokcyclus in plaats van de 2 onder normale omstandigheden. (Voorbeeld van een processor die dit ondersteunt is de Altera Nios II processor)

## Andere toepassingen

Pipelining wordt niet alleen gebruikt in microprocessors maar kan in velerlei omstandigheden gebruikt worden; bijvoorbeeld wanneer een logische bewerking te langzaam is om in 1 klokcyclus klaar te zijn (bijvoorbeeld een vermenigvuldiging heeft veel logica, dus een lange propagatietijd), kan deze opgedeeld worden in kleinere bewerkingen; tussen elke bewerking wordt een register geplaatst. Uiteraard neemt de latency dan wel toe met elke opgebroken stap, wat in sommige applicaties problemen met zich mee kan brengen.

## Voorbeelden van processors die geen pipelining gebruiken

* Intel 8051
* Intel 8080
* Zilog Z80

## Externe link

* (en) Jack Ganssle: Pipelines and prefetches