Basically, it's predicting the pc of the next instruction.
Less basically, the PC is like a vector (which I mentioned before) because
it describes where you are now (where the current instruction should be
fetched from) and where you're going next. If you're currently executing an
instruction at address 4, the full PC would be 4=>8 because the current
instruction is at 4 and the PC is headed to 8. It's like the tail and head
of a vector. After the instruction executes, the PC will still be a vector,
but it will have moved. If the instruction doesn't change it, it's new tail
will be the old head (8) and the new head will be the next pc (12). So the
PC will be 4=>8 before the instruction and 8=>12 after it.
If the instruction is a branch and wants execution to redirect to address
24, for instance, the PC would be 4=>8 going into the instruction but would
be 24=>28 going out of it. If the predictor thought the branch would not be
taken, it would predict the PC to be 8=>12. If it thought it would be taken
and it got the destination right, it would predict 24=>28.
For Alpha which has a fairly simple PC scheme, this all seems like a bunch
of unnecessary complication. For other ISAs, however, this
actually captures
their behavior too without having to add any new mechanisms. SPARC and MIPS
have branch delay slots, for instance. Before you execute an instruction in
SPARC at address 4, the PC could be 4=>8=>12. After the instruction
executes, it would become 8=>12=>16, or if it was a branch as described
earlier, 8=>24=>28. Branches which skip the delay slot also work. In our
example, the PC would become 24=>28=>32.
Then there are even more complicated schemes like in ARM where extra
speculative state is tracked with the PC. There are various
reasons for this
which I won't get into, but because the values all look like they're just
part of the PC, the branch predictor can predict them and
mispredictions are
caught without special handling.
Gabe
Quoting reena panda <[email protected]>:
Hi Gabe,
Thanks for replying. I am sorry but I dont think I understand that fully.
Doesn't this 0x120002ac4=>0x120002ac8 mean that the current instruction
being for which the branch prediction(say) is being initiated is
0x120002ac4
and next instruction is supposed to be 0x120002ac8. If that's the case,
one
of those PCs would be a branch instruction and needs to be predicted to
know
the next flow of instruction. So, why was the branch predicted for
address
0x120002ac8(the predict function in branch predictor takes scalar
addresses)
even if inst->instAddr() was pointing to 0x120002ac4? Can you please
explain
it once more?
Thanks,
Reena
On Sun, May 8, 2011 at 5:29 PM, Gabriel Michael Black <
[email protected]
wrote:
Think of the PCs as vectors, not as scalar values. The pc when the
instruction starts would be 0x120002ac4=>0x120002ac8, and it's predicted
to
be 0x120002ac8=>0x120002acc after the instruction executes.
Gabe
Quoting reena panda <[email protected]>:
Hi Korey,
In the inorder model, why is the branch predicted for next predicted PC
at
the branch instruction? Like here, in the trace below:- The instruction
has
PC
0x120002ac4, but the prediction is made for
0x120002ac8(predPC.instAddr()).
Thanks,
Reena
On Sun, May 8, 2011 at 2:58 PM, reena panda <[email protected]>
wrote:
Hi,
I was checking out the branch prediction implementation in InorderCPU
of
M5. I am modeling ALPHA in the SE mode.
I am seeing the following sequence of operations, which seems odd to
me.
Like, the sequence num 33 was predcited taken initially, but later it
was
predicted as not taken( as the PC was not present in the BTB). This
was a
misprediction implies, the initial taken prediction was correct. But
the
squash updates the predictor with a not taken direction(see actually
taken
below). Or am I missing something here?
648500: BranchPredictor_unit: [tid:0] [sn:33] beq
r1,0x120002ac4
... PC (0x120002ab4=>0x120002ab8) doing branch prediction
648500: BranchPredictor_unit: [tid:0]: *Branch predictor predicted 1
for
PC* (0x120002ab4=>0x120002ab8)
648500: BranchPredictor_unit: [tid:0]: *BTB doesn't have a valid
entry.*
648500: BranchPredictor_unit: [tid:0] [sn:33] pushed onto front of
predHist ...predHist.size(): 1
648500: system.cpu.Branch-Predictor: [tid:0]: [sn:33]: *Branch
predicted
false.*
648500: system.cpu.Branch-Predictor: [tid:0]: [sn:33]: Predicted PC
is
(0x120002ab8=>0x120002abc).
666500: system.cpu.Execution-Unit: [tid:0] Executing [sn:33]
[PC:(0x120002ab4=>0x120002ab8)] beq.
666500: system.cpu.Execution-Unit: [tid:0]: Misprediction detected at
[sn:33] PC (0x120002ab4=>0x120002ac4),
squashing after delay slot instruction [sn:33].
666500: system.cpu.Execution-Unit: [tid:0] Redirecting fetch to
(0x120002ac4=>0x120002ac8).
666500: system.cpu.Execution-Unit: [tid:0] Squashing will start from
stage
2.
666500: system.cpu.Execution-Unit: [tid:0] [sn:33] beq
r1,0x120002ac4 ...PC (0x120002ab4=>0x120002ac4) ... Mispredicts! (Not
Taken)
666500: system.cpu.Execution-Unit: [tid:0] Executing [sn:34]
[PC:(0x120002ab8=>0x120002abc)] lda.
666500: system.cpu.Execution-Unit: [tid:0]: [sn:34]: The result of
execution is 0x0.
666500: system.cpu.Branch-Predictor: [tid:0][sn:33] Squashing...
666500: BranchPredictor_unit: [tid:0]: Squashing from sequence number
33,
setting target to (0x120002ac4=>0x120002ac8).
666500: BranchPredictor_unit: BranchPred: [tid:0]: Squashing branch
sequence number 33 , PC = 0x120002ab8, *actually_taken = 0*
666500: BranchPredictor_unit: [tid:0]: Removing history for [sn:33]
PC
(0x120002ab8=>0x120002abc).
666500: BranchPredictor_unit: BranchPred: [tid:0]: Removing history
for
[sn:33] PC (0x120002ab8=>0x120002abc), Actually Taken = 0
666500: BranchPredictor_unit: [tid:0]: predHist.size(): 0
Actually_taken value is passed on from branch_predictor.cc, in the
squash
function.
bool taken = inst->predTaken();
branchPred->squash(squash_seq_num, inst->readPredTarg(), taken,
tid);
Where should this inst->predTaken updated now?
Thanks,
Reena
_______________________________________________
m5-users mailing list
[email protected]
http://m5sim.org/cgi-bin/mailman/listinfo/m5-users
_______________________________________________
m5-users mailing list
[email protected]
http://m5sim.org/cgi-bin/mailman/listinfo/m5-users