It completely depends on what consistency model you're going for.
The current code doesn't support sequential consistency, but the
load-load ordering that is enforced is inline with ARMs ordering
requirements. 

Ali 

On 21.06.2012 17:09, Dibakar Gope wrote: 

> Hi
All,
> 
> I was skimming through the O3+Ruby portion of the current dev
repository code, that attempts to support load-load ordering for a
stronger consistency model. In existing code, L1 cache controller sends
a forward_eviction_to_cpu, which in turn set the hitExternalSnoop flag
of a load instruction (provided the load has not committed yet) through
checksnoop() function. The checkViolation() portion of the code says
that in order to be squashed and re-executed, that particular load
instruction has to see another supposedly older load that maps to the
same cache block (the first if () block). The code snippet is shown
below:
> 
> lsq_unit_impl.hh
> checkViolations()
> ------------
> if
(inst_eff_addr2 >= ld_eff_addr1 && inst_eff_addr1 isLoad()) {
> // If
this load is to the same block as an external snoop
> // invalidate that
we've observed then the load needs to be
> // squashed as it could have
newer data
> if (ld_inst->hitExternalSnoop) {
> if (!memDepViolator ||
>
ld_inst->seqNum < memDepViolator->seqNum) {
> DPRINTF(LSQUnit, "Detected
fault with inst [sn:%lli] "
> "and [sn:%lli] at address %#xn",
>
inst->seqNum, ld_inst->seqNum, ld_eff_addr1);
> memDepViolator =
ld_inst;
> ++lsqMemOrderViolation;
> return new
GenericISA::M5PanicFault(
> "Detected fault with inst [sn:%lli] and "
>
"[sn:%lli] at address %#xn",
> inst->seqNum, ld_inst->seqNum,
ld_eff_addr1);
> }
> }
> // Otherwise, mark the load has a possible load
violation
> // and if we see a snoop before it's commited, we need to
squash
> ld_inst->possibleLoadViolation = true;
> DPRINTF(LSQUnit,
"Found possible load violaiton at addr: %#x"
> " between instructions
[sn:%lli] and [sn:%lli]n",
> inst_eff_addr1, inst->seqNum,
ld_inst->seqNum);
> } else {
> ---------------
> --------------- 
> 
>
In my understanding, if a snoop hits a younger load in lsq before it is
committed, it need to be re-executed without any constraints from
checkViolation() function to maintain stronger consistency. I was
talking about the following simple example:
> c0 c1
> 
> St B Ld A
> St
A Ld B
> 
> if Ld B in core1 is executed out-of-order and later sees a
snoop before commit, should not we re-execute Ld B without any
constraints from checkViolations() function? Am I missing something
completely over here?
> 
> Regards,
> Dibakar
>
_______________________________________________
> 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

Reply via email to