Hey Ali,

No, I havent tried running it to completion. I thought I might be missing
something here. I shall try that

Thanks

On Sat, Mar 26, 2011 at 4:05 PM, reena panda <[email protected]> wrote:

> Hi Korey,
>
>   Following is the trace dump. You can check the instruction with sequence
> number 2.
>
>   *Following trace corresponds to when the instruction was fetched and
> passed through the branch predictor.*
>
> *  34000: system.cpu.fetch: [tid:0]: Adding instructions to queue to
> decode.
>   34000: system.cpu.fetch: In fetch() function, fetch PC = 0x4001, fetch
> NPC = 0x4005, next PC = 0x4001, next NPC = 0x4005
>   34000: system.cpu.fetch: In lookupAndUpdateNextPC function, Seq_Num = 1,
> Instruction = nop        (bis        r31,r31,r31), PC = 0x4001
>   34000: system.cpu.fetch: In fetch function,while loop, fetch PC = 0x4005,
> fetch NPC = 0x4009, next PC = 0x4005, next NPC = 0x4009
>   34000: system.cpu.fetch: In lookupAndUpdateNextPC function, Seq_Num = 2,
> Instruction = br         r1,0x8c41, PC = 0x4005
>   34000: system.cpu.BPredUnit: BranchPred: [tid:0]: Unconditional control.
>   34000: system.cpu.BPredUnit: BranchPred: [tid:0]: [sn:2] Creating
> prediction history for PC 0x4005
>   34000: system.cpu.BPredUnit: BranchPred: [tid:0]: BTB doesn't have a
> valid entry.
>   34000: system.cpu.BPredUnit: BranchPred: [tid:0]: [sn:2]: History entry
> added.predHist.size(): 1
>   34000: system.cpu.fetch: [tid:0]: [sn:2]:Branch predicted to be not taken
> or no valid BTB entry found.
>   34000: system.cpu.fetch: [tid:0]: [sn:2] Branch predicted to go to
> 0x4009 and then 0x400d.*
> *
> The instruction sequence that I am having difficulty following is:
> *
>
>     toFetch->decodeInfo[tid].nextPC      = inst->branchTarget();
>     toFetch->decodeInfo[tid].nextNPC     = inst->branchTarget() +
> sizeof(TheISA::MachInst);
>
> toFetch->decodeInfo[tid].branchTaken     = inst->readNextPC() !=
> (inst->readPC() + sizeof(TheISA::MachInst));
>
>    DPRINTF(Decode, "In Decode squash,inst->branchTarget()= 
> %#x,inst->branchTarget()
> + machInst = %#x, inst->readnextPC = %#x, inst->readPC = %#x, seq num =
> %i\n",inst->branchTarget(), toFetch->decodeInfo[tid].nextNPC,
> inst->readNextPC(), inst->readPC(), inst->seqNum);  *
> //Added this DPRINTF
>
> **  When the instruction(sn = 2) reaches decode, following trace is
> collected:- *
>
>   34500: system.cpu.decode: In decode Insts, branchtarget = 0x8c41, predPC
> = 0x4009
>   34500: system.cpu.decode: In Decode squash, inst->branchTarget()= 0x8c41,
> inst->branchTarget() + machInst = 0x8c45, inst->readnextPC = 0x4009,
> inst->readPC = 0x4005, seq num = 2
>
> *As a result, when the squash reaches back the fetch stage,
> "actually_taken" variable is set to 0, when it should be 1.*
>
>   35000: system.cpu.fetch: [tid:0]: Squashing instructions due to squash
> from decode.
>   35000: system.cpu.BPredUnit: BranchPred: [tid:0]: Squashing from sequence
> number 2, setting target to 0x8c41.
>   35000: system.cpu.BPredUnit: Squashing BranchPred: [tid:0]: Squashing
> branches until [sn:2].
>   35000: system.cpu.BPredUnit: BranchPred: [tid:0]: Removing history for
> [sn:16] PC 0x403d.
>   35000: system.cpu.BPredUnit: BranchPred: [tid:0]: Removing history for
> [sn:2] PC 0x4005., correct target = 0x8c41, Actually taken = 0
>   35000: system.cpu.BPredUnit: [tid:0]: predHist.size(): 0
>   35000: system.cpu.fetch: Squashing from decode with PC = 0x8c41, NPC =
> 0x8c45
>   35000: system.cpu.fetch: [tid:0]: Squashing from decode.
>   35000: system.cpu.fetch: [tid:0]: Squashing, setting PC to: 0x8c41, NPC
> to: 0x8c45.
>   35000: system.cpu.fetch: Running stage.
>
>
> What I am interested in looking at is the actual taken/not taken
> path/directions of each branch instruction as they . I thought I could
> capture it at the fetch stage, when a branch commits or when a squash signal
> gets generated for the branch. Is there any other way I can capture them?
>
> Thanks,
> Reena
>
> On Sat, Mar 26, 2011 at 3:41 PM, Ali Saidi <[email protected]> wrote:
>
>>
>> On Mar 26, 2011, at 3:17 PM, reena panda wrote:
>>
>> Hi,
>>
>> I am using m5 in ALPHA FS mode, with O3 CPU model. I was going through the
>> fetch/decode stage implementation in m5. But I can't understand properly,
>> the way branch misprediction is handled in the decode/fetch stage of
>> pipeline. Please correct me if I am wrong, but the way it is currently
>> implemented in m5 is as follows:-
>>
>> Suppose an unconditional branch(PC = x, say) is fetched in the fetch
>> cycle, its branch prediction history is immediately updated as a "taken
>> branch". Now lets say, its actual target is "Y". But suppose the entry
>> corresponding to the branch PC (x) is not found in the BTB, then the next PC
>> and nextNPC are still updated to x+4, x+8 respectively. Since unconditional
>> branches can be resolved in the decode stage, the following check is
>> correctly performed in decodeInsts function (in decode_impl.hh):-
>>
>>     if (inst->branchTarget() != inst->readPredPC()) {
>>                 ++decodeBranchMispred;
>>                 squash(inst, inst->threadNumber);
>>     }
>>
>> But what is odd is that in squash function, the following information is
>> sent back to fetch stage:-
>>
>>     toFetch->decodeInfo[tid].nextPC      = inst->branchTarget();
>>     toFetch->decodeInfo[tid].nextNPC     = inst->branchTarget() +
>> sizeof(TheISA::MachInst);
>>     *toFetch->decodeInfo[tid].branchTaken     = inst->readNextPC() !=
>> (inst->readPC() + sizeof(TheISA::MachInst));*
>>
>> The third statement is odd because it compares nextPC with PC( i.e, x+4
>> with x+4) yields branch direction as "not-taken", Which is wrong and would
>> update the branch predictors incorrectly. Branch is actually an
>> "unconditional taken branch" in the example. Then, should not the last line
>> be something like this:-
>>     *toFetch->decodeInfo[tid].branchTaken     =  inst->branchTarget() !=
>> (inst->readPC() + sizeof(TheISA::MachInst));*
>>
>> Please point if I am missing something here? I can't understand the
>> working correctly. Also, can some one give me pointers on how to infer total
>> branch misprediction statistics from the stats.txt file, the stats seem to
>> be scattered across the different pipeline stages. Are they all disjoint/or
>> is there any degree of overlap between them?
>>
>> This might be a bug, but it might be that nextPc gets updated along the
>> way. Without diving into the code I don't really know, however have you
>> tried your fix? Does it work? Do branch predictions go down when running
>> code after you make the fix?
>>
>> Ali
>>
>>
>>
>> _______________________________________________
>> 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

Reply via email to