If a write happens to a cache line with the modified bit, the write just completes without consulting the protocol table at all. The protocol tables are only used when a miss happens and the cache needs to know what kind of request to send, or when a response or snoop packet comes in from the bus.
Steve On 10/2/07, Paul West <[EMAIL PROTECTED]> wrote: > > I'm trying to add a cache coherence protocol to add write-update to > an existing once. (IE, When a shared cache line recieves a write from a > cpu, it broadcasts the write to other shared caches lined, instead of > invalidating them.) > > I added a packet to packet.hh and packet.cc: > /* WriteUpdateReq */ > { SET4(IsWrite, IsRequest, IsWriteUpdate, HasData), > InvalidCmd, "WriteUpdateReq" } > added 'WriteUpdate' to Commands enum and 'IsWriteUpdate' to Attribute > enum in MemCmd class. > > So in coherence_protocol.cc in the constructor at the end I added: > if(<doing the write-update protocol>){ > tt[Shared][MC::WriteReq].onRequest(MC::WriteUpdate); > tt[Modified][MC::WriteReq].onRequest(MC::WriteUpdate); > tt[Owned][MC::WriteReq].onRequest(MC::WriteUpdate); > > tt[Shared][MC::WriteUpdate].onResponse(Modified); > tt[Modified][MC::WriteUpdate].onResponse(Modified); > tt[Owned][MC::WriteUpdate].onResponse(Modified); > > tt[Shared][MC::WriteUpdate].onSnoop(updateTrans); > tt[Modified][MC::WriteUpdate].onSnoop(updateTrans); > tt[Owned][MC::WriteUpdate].onSnoop(updateTrans); > } > > Which I think will send a WriteUpdate when a Shared, Modified, or Owned > block recieves a write and then goto modified state. Then any cache that > snoops the WriteUpdate calls updateTrans which reads the packet into the > block: > if(blk){ > std::memcpy(blk->data + offset, pkt->getPtr<uint8_t>(), pkt->getSize()); > new_state = blk->status; > } > > With just that, Alpha Full system runs, but I don't recieve any more/less > l1 cache hits/misses/access when running some Splash2 with pthreads > benchmarks. Here is my command line: > build/ALPHA_FS/m5.fast configs/example/fs.py --caches --l2cache -n 2 > --firefly > The '--firefly' is my tag to tell the simulator to use a 'mosi' base > protocol with the additions I'm discussing about. I do get speed-ups with > more cpus in my benchmarks. > > I put a printf in updateTrans and it does get called quite a bit in my > benchmarks. Furthermore, these benchmarks each last about a second (in > sim_seconds stat context) which is long enough for speed-ups. > > Now, if I replace the setting of new_state in updateTrans with: > 'new_state = (blk->status) | Modified;' > so the block will go to modified state, the m5term console only gets this > far: > ==== m5 slave console: Console 0 ==== > M5 console: m5AlphaAccess @ 0xFFFFFD0200000000 > Got Configuration 623 > memsize 8000000 pages 4000 > First free page after ROM 0xFFFFFC0000018000 > > > Any thoughts or advice? Am I forgetting/suppose to copy the data into the > packet somewhere? > > Thanks, > > ~Paul West > _______________________________________________ > m5-users mailing list > m5-users@m5sim.org > http://m5sim.org/cgi-bin/mailman/listinfo/m5-users >
_______________________________________________ m5-users mailing list m5-users@m5sim.org http://m5sim.org/cgi-bin/mailman/listinfo/m5-users