• No results found

De complexere werkelijkheid

In document Voorwoord bij de eerste uitgave (pagina 95-99)

2.12 Pipelining

2.12.3 De complexere werkelijkheid

Pipelining is niet zo eenvoudig als het op het eerste zicht lijkt. De volgende problemen kunnen optreden:

• een instructie kan afhankelijk zijn van een vorige instructie, bijvoorbeeld het adres van een operand kan bepaald worden door een indexregister die in een andere instructie een nieuwe waarde krijgt;

• na elk sprongbevel zullen op de lopende band een aantal instructies staan die eigenlijk niet meer moeten uitgevoerd worden, omdat het programma verdergezet wordt op een andere plaats.

Afhankelijkheden tussen instructies

Figuur 2-77 toont een C-programma en de overeenkomstige vertaling naar DRAMA-assembler (de symbolische adressen zijn reeds omgezet naar absolute adressen).

Voer dit programma eerst sequentieel uit (dus zonder pipelining). Welk geheugenregister wordt opgehaald en toegekend aan de variabelea? Wat loopt er verkeerd indien ditzelfde programma uitgevoerd wordt m.b.v. de lopende band die hierboven werd geschetst? Wat is het adres van het geheugenregister dat opgehaald wordt en toegekend wordt aana?

Ophalen

FIGUUR 2-76. Uitvoering van bevelen met pipelining.

2.12 Pipelining

88 Het probleem doet zich voor op het moment dat het adres berekend wordt voor de derde instructie: HIA R0,0(R1+). Op dat ogenblik wordt de eerste instructie uitgevoerd. Bijge-volg zalR1nog niet de waarde100 bevatten, laat staan de waarde108die nodig is voor een correcte adresberekening.

Er bestaan hiervoor verschillende oplossingen:

• De hardware detecteert deze afhankelijkheid en het betreffende station wordt stilgelegd tot de nodige gegevens beschikbaar zijn; dit brengt met zich mee dat er lege plaatsen op de band ontstaan.

• Afhankelijkheden tussen instructies worden niet toegestaan; de vertaler moet ervoor zorgen dat dit probleem zich niet kan voordoen. Hij kan bijvoorbeeld de volgorde van instructies veranderen of als dat niet voldoende is, lege instructies (NOP of No-Operation) inlassen.

In ons voorbeeld kan het vijfde bevel gerust voor het derde worden geplaatst. Dit zal echter niet volstaan, bijgevolg zal de vertaler een extraNOP-bevel tussenlassen:

int a, b;

FIGUUR 2-77. C-programma en DRAMA-vertaling

HIA.a R1,100

FIGUUR 2-78. Herordenen en inlassen van NOP-bevelen.

2.12 Pipelining

Sprongbevelen

Sprongbevelen vormen een probleem. Na de uitvoering van een sprongbevel gaat het pro-gramma verder op een andere plaats. De bevelen die ten gevolge van de pipeliningtechniek reeds zijn opgehaald (en al gedeeltelijk geanalyseerd) zijn overbodig, en mogen niet meer uit-gevoerd worden. De lopende band moet dus leeggemaakt worden1. Het zal opnieuw een tijdje duren vooraleer de band opnieuw gevuld is. Merk echter op dat we in dit geval niet beter maar ook niet slechter af zijn dan wanneer er geen pipelining voorzien zou zijn.

Er bestaan verschillende oplossingen om dit tijdverlies in te korten:

• alle instructies die zich na een sprongbevel op de lopende band bevinden worden nog uitge-voerd; de vertaler zal dus het (onvoorwaardelijk) sprongbevel enkele instructies naar voren schuiven; indien dit niet kan, dan moet de vertaler een of meerdere NOP-bevelen inlassen na het sprongbevel;

• zodra geweten is dat het om een sprongbevel gaat (d.w.z. na de analyse) worden geen beve-len meer opgehaald tot het adres berekend is. Van dan af worden de volgende bevebeve-len opge-haald vanaf het nieuwe adres. Concreet betekent dit voor de lopende band zoals hierboven beschreven, dat er nog één instructie na het sprongbevel wordt opgehaald, en dat dan het ophalen stopt tot het adres bekend is2.

Bij een voorwaardelijke sprong is het probleem nog erger: zelfs als de adresoperand snel berekend kan worden, dan nog weet de processor niet of de sprong al dan niet zal uitgevoerd worden.

Een eerste oplossing hiervoor is een tweede lopende band in gebruik te nemen. Op de hoofdband worden de bevelen verder opgehaald alsof het sprongbevel niet uitgevoerd zal worden. Op de tweede band worden dan de bevelen opgehaald indien de sprong wel uitge-voerd wordt. Wanneer het laatste station deVSPuitvoert, zal het bepalen met welke lopende band verdergewerkt wordt. Merk op dat dit het probleem niet volledig oplost: wanneer twee of meer voorwaardelijke sprongen heel dicht op elkaar volgen, zouden meer dan twee lopende banden nodig zijn!

Een andere mogelijkheid bestaat erin dat de processor probeert te voorspellen of de sprong al dan niet zal uitgevoerd worden:

- vaak wordt de volgende eenvoudige regel gebruikt: een sprong terug wordt verondersteld uitgevoerd te worden, terwijl van een voorwaartse sprong verwacht wordt dat ze meestal niet uitgevoerd zal worden (dit zal bij een lus inderdaad meestal het geval zijn);

- soms houdt de processor in een speciale tabel bij wat het resultaat was van elk voorwaar-delijk sprongbevel; indien het bevel later nog een keer wordt uitgevoerd, zal de processor zijn voorspelling baseren op de vorige uitkomst.

1. Merk op dat soms meer moet gebeuren dan het leegmaken van de lopende band. Wanneer indexatie met autoincrement wordt gebruikt bij de adresberekening, zullen deze indexregisters opnieuw hun oorspronkelijke waarde moeten krijgen. De verschillende stations zullen dus een goede boekhouding moeten bijhouden zodat ze het annuleren van vroegere acties kunnen realiseren.

2. Dit is na de volgende stap (bijSPR.d) of na twee stappen (bijSPR.i); in het laatste geval moet het adres

2.12 Pipelining

90

Opgaven

1. Wat is pipelining?

2. Bespreek de prestatieverbetering door pipelining.

3. Welke problemen kunnen er ontstaan bij pipelining? Hoe kunnen ze worden opgelost?

4. Wanneer kan een tweede lopende band nuttig zijn?

5. Hoe kan de processor proberen te voorspellen of een voorwaardelijke sprong al dan niet uitgevoerd zal worden?

6. Waarom zijn NOP-bevel (no operation) nodig?

7. Is pipelining transparant voor de vertaler of niet? Verklaar je antwoord.

In document Voorwoord bij de eerste uitgave (pagina 95-99)