From: Onur Kayiran Date: Mon, 14 May 2018 17:51:35 +0000 (-0400) Subject: gpu-compute: Dropping fetchs when no entry is reserved in the buffer X-Git-Tag: v20.1.0.0~474 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=bff8df22880d9d4ee3a548c79a30fbd59f790ca4;p=gem5.git gpu-compute: Dropping fetchs when no entry is reserved in the buffer This changeset drops fetches if there is no entry reserved in the fetch buffer for that instruction. This can happen due to a fetch attempted to be issued in the same cycle where a branch instruction flushed the fetch buffer, while an ITLB or I-cache request is still pending. Change-Id: I3b80dbd71af27ccf790b543bd5c034bb9b02624a Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/29932 Tested-by: kokoro Reviewed-by: Anthony Gutierrez Reviewed-by: Onur Kayıran Maintainer: Anthony Gutierrez --- diff --git a/src/gpu-compute/fetch_unit.cc b/src/gpu-compute/fetch_unit.cc index fb04cd27e..447ff12fa 100644 --- a/src/gpu-compute/fetch_unit.cc +++ b/src/gpu-compute/fetch_unit.cc @@ -234,6 +234,16 @@ FetchUnit::fetch(PacketPtr pkt, Wavefront *wavefront) pkt = new Packet(oldPkt->req, oldPkt->cmd); delete oldPkt; + /** + * if we have not reserved an entry in the fetch buffer, + * stop fetching. this can happen due to a branch instruction + * flushing the fetch buffer while an ITLB or I-cache request is still + * pending, in the same cycle another instruction is trying to fetch. + */ + if (!fetchBuf.at(wavefront->wfSlotId).isReserved(pkt->req->getVaddr())) { + return; + } + /** * we should have reserved an entry in the fetch buffer * for this cache line. here we get the pointer to the diff --git a/src/gpu-compute/fetch_unit.hh b/src/gpu-compute/fetch_unit.hh index 2cfe3f0fe..798c26465 100644 --- a/src/gpu-compute/fetch_unit.hh +++ b/src/gpu-compute/fetch_unit.hh @@ -120,6 +120,18 @@ class FetchUnit return reserved_pc->second; } + /** + * returns true if there is an entry reserved for this address, + * and false otherwise + */ + bool + isReserved(Addr vaddr) const + { + auto reserved_pc = reservedPCs.find(vaddr); + bool is_reserved = (reserved_pc != reservedPCs.end()); + return is_reserved; + } + void fetchDone(Addr vaddr); /**