Branchevoorspelling - vragen over doelvoorspelling en gebruik van de pc

Dus ik begrijp de basistechnieken die worden gebruikt in vertakkingsvoorspelling voor gepijplijnde processors - zaken als 2-bit verzadigde tellers, adaptieve voorspellers op twee niveaus, enz.

Dit zijn mijn vragen:

1) Branch target voorspelling: waarom is dit belangrijk en wat zijn enkele van de hier gebruikte mechanismen? Als ik aan een filiaal denk, denk ik dat "bne r2, r3, LABEL" zegt dat als r2! = R3 vertakt naar LABEL wat betekent dat PC (programmateller) = PC + LABEL is. Wat is er zo mysterieus aan het voorspellen van het doelwit hier? U weet wat het gaat worden op basis van de gecompileerde waarde van LABEL. Ik mis hier waarschijnlijk het punt op de een of andere manier.

2) Waarom is de programmatellerwaarde zelf (bijvoorbeeld 0x4001000C), of op zijn minst de laatste paar bits, gebruikt als onderdeel van het vertakkingsvoorspellingsschema? Ik zag een schema waarbij de laatste 4 bits van de pc werden samengevoegd in het (4-bit) vertakkingshistoriekregister en die 8-bitswaarde werd gebruikt om toegang te krijgen tot de patroongeschiedenistabel. Ik zou denken dat de pc behoorlijk willekeurig is!

Bedankt voor alle hulp bij het begrijpen van deze problemen

2

2 antwoord

Wat is er zo mysterieus aan het voorspellen van het doelwit hier? U weet wat het gaat worden op basis van de gecompileerde waarde van LABEL.

Vanwege de CPU-pijplijndiepte en de cachetratentie, duurt het vele cycli tussen het ophalen van een instructie, het volledig decoderen om het filiaaldoel te identificeren en het kunnen ophalen van die instructie. Dus je voorspelt het doel om preventief de volgende instructie op te halen.

Waarom is de tellerwaarde van het programma zelf (bijvoorbeeld 0x4001000C), of op zijn minst de laatste paar bits, gebruikt als onderdeel van het vertakkingsvoorspellingsschema?

Omdat de pc een unieke branchinstructie uniek identificeert! Hoe ga je anders de vertakkingsvoorspellingstabel indexeren?

6
toegevoegd
Hé man hartelijk bedankt!
toegevoegd de auteur JDS, de bron

Om een ​​beetje meer kleur toe te voegen

1) Branch Target Prediction is niet zozeer voor het voorbeeld dat u gaf. Het is veel belangrijker voor virtuele functies en dingen zoals computertakken (voor switchstatements en dergelijke). In beide gevallen is het vertakkingsdoel onbekend tijdens het compileren. In het geval van de virtuele functie moet het worden geladen vanaf een geheugenlocatie (de virtuele-functietabel) en in het geval van de switch-opdracht gebeurt dit meestal door de filiaaloffset in een tabel op te zoeken. Hoewel het geval van de virtuele functie onvoorwaardelijk is, gebruikt het nog steeds de BTB zwaar.

2) Er zijn in principe twee algemene klassen van voorspellers, die globaal zijn en die welke per adres zijn. Globale voorspellers hebben het voordeel dat ze kunnen werken met veel langere patroonhistories (geschiedenis van genomen/niet-ingenomen). Per-adres-voorspellers hebben het voordeel dat ze specifiek kunnen zijn voor bepaalde filiaallocaties, maar hebben over het algemeen een kortere geschiedenis (omdat ze per adres zijn en dus veel ruimte innemen). Veel processors gebruiken wat vaak een toernooitak-voorspeller wordt genoemd, waarbij er zowel een globale voorspeller als een per-adresvoorspeller is en dan is er een voorspeller (betrouwbaarheidsschatter) om de voorspeller te kiezen die naar verwachting een beter antwoord zal geven.

4
toegevoegd