EECS 470 Branch Prediction Lecture 6 Coverage: Chapter 3
Parts of the predictor Direction Predictor –For conditional branches Predicts whether the branch will be taken –Examples: Always taken; backwards taken Address Predictor –Predicts the target address (use if predicted taken) –Examples : BTB; Return Address Stack; Precomputed Branch Recovery logic Ref: The Precomputed Branch Architecture
Characteristics of branches Individual branches differ –Loops tend not to exit Unoptimized code: not-taken Optimized code: taken –If-statements: Tend to be less predictable –Unconditional branches Still need address prediction
Example gzip: gzip: loop branch 0x d8 Executed: times Taken: times Not-taken:10 times % time taken: 99% - 100% Easy to predict (direction and address)
Example gzip: gzip: if branch 0x12000fa04 Executed: times Taken:71480 times Not-taken:79929 times % time taken: ~49% Easy to predict? (maybe not/ maybe dynamically)
Example: gzip Direction prediction: always taken Accuracy: ~73 % Easy to predict A B
Branch Backwards Most backward branches are heavily NOT-TAKEN Forward branches slightly more likely to be TAKEN Ref: The Effects of Predicated Execution on Branch Prediction
Using history 1-bit history (direction predictor) –Remember the last direction for a branch branchPC NT T Branch History Table How big is the BHT?
Example: gzip Direction prediction: always taken Accuracy: ~73 % A B How many times will branch A mispredict? How many times will branch B mispredict?
Using history 2-bit history (direction predictor) branchPC SN NT Branch History Table T ST How big is the BHT?
Example: gzip Direction prediction: always taken Accuracy: ~73 % A B How many times will branch A mispredict? How many times will branch B mispredict?
Using History Patterns ~80 percent of branches are either heavily TAKEN or heavily NOT-TAKEN For the other 20%, we need to look a patterns of reference to see if they are predictable using a more complex predictor Example: gcc has a branch that flips each time T(1) NT(0)
Local history branchPC NT T Pattern History Table Branch History Table What is the prediction for this BHT ? When do I update the tables?
Local history branchPC NT T Pattern History Table Branch History Table On the next execution of this branch instruction, the branch history table is , pointing to a different pattern What is the accuracy of a flip/flop branch …?
Global history Pattern History Table Branch History Register if (aa == 2) aa = 0; if (bb == 2) bb = 0; if (aa != bb) { … How can branches interfere with each other?
Gshare predictor Ref: Combining Branch Predictors branchPC Pattern History Table Branch History Register xor Must read!
Bimod predictor Choice predictor PHT skewed taken PHT skewed Not-taken Global history regbranchPC xor mux
Hybrid predictors Local predictor (e.g. 2-bit) Global/gshare predictor (much more state) Prediction 1 Prediction 2 Selection table (2-bit state machine) How do you select which predictor to use? How do you update the various predictor/selector? Prediction
Overriding Predictors Big predictors are slow, but more accurate Use a single cycle predictor in fetch Start the multi-cycle predictor –When it completes, compare it to the fast prediction. If same, do nothing If different, assume the slow predictor is right and flush pipline. Advantage: reduced branch penalty for those branches mispredicted by the fast predictor and correctly predicted by the slow predictor
Pipelined Gshare Predictor How can we get a pipelined global prediction by stage 1? –Start in stage –2 –Don’t have the most recent branch history… Access multiple entries –E.g. if we are missing last three branches, get 8 histories and pick between them during fetch stage. Ref: Reconsidering Complex Branch Predictors coming soon (to be published Feb 2003)