Ali, that it is correct. I will keep track of these changes to post a review in a few days. Turns out that the TLB in X86 does not support SMT either, so I am working on fixing that too.
-Andrea On Wed, Jun 27, 2012 at 11:26 AM, Ali Saidi <sa...@umich.edu> wrote: > ** > > Hmm.. I think that must be happening when there is a mispredict and a > return to architected state. If you don't run into problems with this fix > over the next few days could you post a patch to the review board ( > reviews.gem5.org)? > > > > Thanks, > > Ali > > > > On 27.06.2012 11:20, Andrea Pellegrini wrote: > > It turned out that in some bizarre cases a non-zero value was forwarded to > instructions using a remapped zero register: everything is fine for thread > 0 (as register 16 is considered the zeroReg throughout the simulator), but > it crashes and burns when a different "zero register" is assigned to > threads 1, 2, and 3. > In my case, I fixed it always associating the intZeroReg to the mapped > register (16 for X86): > > --------------------------------------------------------------------------------------------------- > In rename_map.cc, line 147: > > --------------------------------------------------------------------------------------------------- > > if (arch_reg < numLogicalIntRegs) { > > // Record the current physical register that is renamed to the > > // requested architected register. > > prev_reg = intRenameMap[arch_reg].physical_reg; > > // If it's not referencing the zero register, then rename the > > // register. > > if (arch_reg != intZeroReg) { > > renamed_reg = freeList->getIntReg(); > > intRenameMap[arch_reg].physical_reg = renamed_reg; > > assert(renamed_reg >= 0 && renamed_reg < numPhysicalIntRegs);\ > > } else { > > // Otherwise return the zero register so nothing bad happens. > > renamed_reg = intZeroReg; > > ----> prev_reg = intZeroReg; // apell...@umich.edu : fix > problem in multithreading > > } > > > > --------------------------------------------------------------------------------------------------- > > > > On Sun, Jun 24, 2012 at 10:13 AM, Steve Reinhardt <ste...@gmail.com>wrote: > >> In Alpha, instructions that write the zero reg are generally decoded >> explicitly into no-ops or prefetches, so I'm not too surprised that this >> generally worked (though I also would not be surprised if there were some >> corner cases that don't work that we never identified). Ideally all ISAs >> would decode instructions with zero-reg targets like this, so that the zero >> reg would never be written and never need to be checked by the CPU model, >> but that never came to pass. >> Steve >> >> >> On Sun, Jun 24, 2012 at 6:21 AM, Ali Saidi <sa...@umich.edu> wrote: >> >>> Hi Andrea, >>> Yes that sounds like a bug. All threads need to share a zero reg, or the >>> zero reg needs to be checked for each thread. I'm curious how that worked >>> with alpha. >>> Thanks, >>> Ali >>> >>> Sent from my ARM powered mobile device >>> >>> On Jun 22, 2012, at 6:22 PM, Andrea Pellegrini < >>> andrea.pellegr...@gmail.com> wrote: >>> >>> >>> >>> Hi all, >>> >>> I am doing some experiments w/ SMT and X86 in SE mode. I found something >>> funny happening w/ the register file, that I wanted to clarify. >>> >>> Arch register 16 seems to be assigned always to the zeroRegister in the >>> rename phase. In the renaming logic, reg 16 is always renamed to the same >>> physical register (16 for thread0, 55 for thread1, 94 for thread2 and 133 >>> for thread3). However, the logic in the rename and in the regfile does not >>> match - and this creates some problems. In particular, in the regfile, the >>> simulator does not seem to recognize that the register is a zeroReg (as >>> determined instead from the rename stage). Is that a bug? >>> >>> Thanks, >>> >>> -Andrea >>> >>> >>> >>> --------------------------- >>> >>> rename_map.cc >>> >>> if (arch_reg < numLogicalIntRegs) { >>> >>> // Record the current physical register that is renamed to the >>> >>> // requested architected register. >>> >>> prev_reg = intRenameMap[arch_reg].physical_reg; >>> >>> // If it's not referencing the zero register, then rename the >>> >>> // register. >>> >>> if (arch_reg != intZeroReg) { >>> >>> renamed_reg = freeList->getIntReg(); >>> >>> intRenameMap[arch_reg].physical_reg = renamed_reg; >>> >>> assert(renamed_reg >= 0 && renamed_reg < numPhysicalIntRegs >>> ); >>> >>> >>> >>> --------------------------- >>> >>> regfile.hh: >>> >>> ... >>> >>> if (reg_idx != TheISA::ZeroReg) >>> >>> intRegFile[reg_idx] = val; >>> >>> ... >>> >>> --------------------------- >>> >>> Looking at the definition of TheISA::ZeroReg I get: >>> >>> >>> >>> // semantically meaningful register indices >>> >>> //There is no such register in X86 >>> >>> const int ZeroReg = NUM_INTREGS; >>> >>> >>> >>> _______________________________________________ >>> >>> gem5-users mailing list >>> gem5-users@gem5.org >>> http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users >>> >>> >>> _______________________________________________ >>> gem5-users mailing list >>> gem5-users@gem5.org >>> http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users >> >> >> _______________________________________________ >> gem5-users mailing list >> gem5-users@gem5.org >> http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users > > > > > _______________________________________________ > gem5-users mailing list > gem5-users@gem5.org > http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users >
_______________________________________________ gem5-users mailing list gem5-users@gem5.org http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users