public void recv_req(Req req) { //stats Stat.procs[pid].read_req_served.Collect(); Stat.procs[pid].read_avg_latency.Collect(req.latency); total_read_latency += (ulong)req.latency; Req first_request = req; ulong wb_addr = Proc.NULL_ADDRESS; //free up instruction window and mshr inst_wnd.set_ready(req.block_addr); mshr.RemoveAll(x => x == req.block_addr); if (!cache.has_addr(first_request.block_addr, ReqType.RD)) { wb_addr = cache.cache_add(first_request.block_addr, first_request.proc_req_type, (ulong)pid); if (!l1_cache.has_addr(first_request.block_addr, first_request.type)) { l1_cache.cache_add(first_request.block_addr, first_request.proc_req_type, (ulong)pid); } l1_cache.cache_remove(wb_addr, ReqType.RD); } //add to cache; returns the address of evicted block; returns null if empty block has been populated //if there is an evicted block, writeback; another memory request is generated if (Config.proc.wb == false) { wb_addr = Proc.NULL_ADDRESS; } if (wb_addr != Proc.NULL_ADDRESS) { Req wb_req = RequestPool.depool(); wb_req.set(pid, ReqType.WR, ReqType.NULL, wb_addr); bool wb_merge = wb_q.Exists(x => x.block_addr == wb_req.block_addr); if (!wb_merge) { wb_q.Add(wb_req); } else { RequestPool.enpool(wb_req); } } //destory req RequestPool.enpool(req); out_read_req--; }
public void recv_req(Req req) { //stats Stat.procs[pid].read_req_served.Collect(); Stat.procs[pid].read_avg_latency.Collect(req.latency); total_read_latency += (ulong)req.latency; if (pid == Sim.highest_rank_proc) { high_priority_total_misses += 1; } inflight_mem_requests--; Req first_request = req; ulong wb_addr = Proc.NULL_ADDRESS; //free up instruction window and mshr inst_wnd.set_ready(req.block_addr); mshr.RemoveAll(x => x.block_addr == req.block_addr); if (Config.fst) { if ((req.block_addr == interference_bit_set_addr) && (interference_bit == true)) { interference_bit = false; interference_bit_core = Config.N; } } if (!cache.has_addr(first_request.block_addr, ReqType.RD)) { wb_addr = cache.cache_add(first_request.block_addr, first_request.proc_req_type, (ulong)pid); if (!l1_cache.has_addr(first_request.block_addr, ReqType.RD) && !first_request.is_prefetch) { l1_cache.cache_add(first_request.block_addr, first_request.proc_req_type, (ulong)pid); } l1_cache.cache_remove(wb_addr, ReqType.RD); } if (Config.aux_cache) { if (!aux_cache.has_addr(first_request.block_addr, ReqType.RD)) { aux_cache.cache_add(first_request.block_addr, first_request.proc_req_type, (ulong)pid); } } if (Config.proc.wb == false) { wb_addr = Proc.NULL_ADDRESS; } if (wb_addr != Proc.NULL_ADDRESS) { Req wb_req = RequestPool.depool(); wb_req.set(pid, ReqType.WR, ReqType.NULL, wb_addr); bool wb_merge = wb_q.Exists(x => x.block_addr == wb_req.block_addr); if (!wb_merge) { wb_q.Add(wb_req); } else { RequestPool.enpool(wb_req); } } //destory req RequestPool.enpool(req); out_read_req--; }