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
