I tried to increase the writeBuffer size??and my code works like what I want.
It put all dirty cache-blk to writebuffer and will send writeBackDirty to
memory controller.But it crash after perfroming several times flush all
cache-blk.
The error report is below.
panic: panic condition (sf_item.holder & req_port).none() occurred:
requester
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010
is not a holder :( SF value
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
It seems like I flush some cache-blk that shouldn??t be flush.
My code :
BaseCache::recvTimingReq(pkt){ //some instr will trigger this code
section if(trigger){ wb_pkts.clear();
dirty_blk_count = my_memWriteback(wb_pkts);
//doWritebacks(wb_pkts, clockEdge(lat+forwardLatency));
while(!wb_pkts.empty()){ PacketPtr wbPkt =
wb_pkts.front(); allocateWriteBuffer(wbPkt,
clockEdge(lat + forwardLatency)); wb_pkts.pop_front();
} }
bool satisfied = false; { PacketList writebacks;
satisfied = access(pkt, blk, lat, writebacks); ..... }
BaseCache::my_memWriteback(PacketList &wb_pkts) { int count = 0;
tags->forEachBlk([this,&count,&wb_pkts](CacheBlk &blk) mutable{
if(blk.isDirty()){
if(blk.isValid()){ count++;
} }
my_writebackVisitor(blk,wb_pkts); });
//printf("NmemWriteback count:%d\n",count); return count; }
BaseCache::my_writebackVisitor(CacheBlk &blk,PacketList &writebacks) {
if (blk.isDirty()) { assert(blk.isValid()); /* do make request in
writebackBlk() * RequestPtr request = std::make_shared(
regenerateBlkAddr(&blk), blkSize, 0, Request::funcMasterId);
request->taskId(blk.task_id); if (blk.isSecure()) {
request->setFlags(Request::SECURE); } //will not send request to
memory controller when MemCmd::WriteClean PacketPtr packet = new
Packet(request, MemCmd::WriteClean); packet->allocate();
std::memcpy(packet->getPtr, blk.data, blkSize); * */
PacketPtr packet = writebackBlk(&blk);
//invalidateBlock(&blk) writebacks.push_back(packet);
//blk.status &= ~BlkDirty; } }
And I am confuse on what is the difference among
MemCmd::WritebackDirty,MemCmd::WritebackClean,and MemCmd::WriteClean.Because I
run a process which execute _mm_clflush and the gem5 behavior is
4658583000: system.l2cache: sendMSHRQueuePacket: MSHR CleanInvalidReq
[448760:448760] PoC
4658583000: system.l2cache: Create WriteClean [448740:44877f] PoC writable: 1,
dirty: 1
4658583000: global: handleSnoop for WriteClean [448740:44877f] ES PoC
4658583001: system.l2cache: sendWriteQueuePacket: write WriteClean
[448740:44877f] PoC
4658584000: system.l2cache: sendWriteQueuePacket: write WriteClean
[448740:44877f] PoC
4658584000: system.mem_ctrl: recvTimingReq: request WriteClean addr 4491072
size 64
4658584000: system.mem_ctrl: Write queue limit 64, current size 3, entries
needed 1
4658584000: system.mem_ctrl: Address: 4491072 Rank 0 Bank 4 Row 34
4658584000: system.mem_ctrl: Adding to write queue
4658584000: system.mem_ctrl: Responding to Address 4491072.. 4658584000:
system.mem_ctrl: Done
4658591000: system.l2cache: recvTimingResp: Handling response CleanInvalidResp
[448760:448760] PoC
So I try to make a WriteClean for each dirty cache-blk
"PacketPtr packet = new Packet(request, MemCmd::WriteClean); "
But it will not send req to memory controller which make me confused. Instead
WritebackDirty will send req to memory controller.
_______________________________________________
gem5-users mailing list
gem5-users@gem5.org
http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users