From bff8df22880d9d4ee3a548c79a30fbd59f790ca4 Mon Sep 17 00:00:00 2001 From: Onur Kayiran Date: Mon, 14 May 2018 13:51:35 -0400 Subject: [PATCH] gpu-compute: Dropping fetchs when no entry is reserved in the buffer MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 --- src/gpu-compute/fetch_unit.cc | 10 ++++++++++ src/gpu-compute/fetch_unit.hh | 12 ++++++++++++ 2 files changed, 22 insertions(+) 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); /** -- 2.30.2