Static

  • always not taken

  • always taken

  • BTFN (backward taken, forward not taken)

    • predict T when the branch goes backward (loops for ex)
    • predict N when the branch goes forward (jump to section further in the code)
  • FTBN (forwards taken, backwards not taken)

    • opposite of BTFN
  • Profile based (likely direction)

  • program analysis based (likely direction)

The compiler can optimise for this if it’s architecture aware.

Dynamic Branch Prediction

we can either have a GHR (global history) that indexes into a PHT

  • so if we globally last saw TT index into PHT with that and get 01 or something back

or we can have local branch history, with a PHT for each branch index

2-bit Counter


This means that we just take the last branch outcome and use it as the FSM input. No PHT needed.

Two-level Global Branch Prediction

Instead of only indexing into the PHT via two last seen states, we instead use the previous branch direction as well.

Example of what a table in use looks like:

  • TT 01 means that when it sees TT prev access, it’s weakly not taken.

The architecture of this looks like:

Example:

Adding more Context


We can also index using branch address as well, to add more “context”.

Local Branch History


Implementation:

Aside - Taxonomy

Hybrid Predictors

There is heterogeneity ifs, loops, etc…
so we use multiple predictors and predict which predictor to use.

More Advanced

Perceptron

TAGE

Different History lengths for different branches, chosen dynamically.