From 0bb385941b1b4bda9e3d73e76be41b2cc10bdf8a Mon Sep 17 00:00:00 2001 From: Kyle Roarty Date: Sat, 14 Nov 2020 13:42:12 -0600 Subject: [PATCH] gpu-compute: Add exp_cnt tracking for buffer store instructions MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit exp_cnt (expInstsIssued in the code) is used in the waitcnt instruction to track that data has been read out of VGPRs in previous global memory instructions, making it safe to overwrite the VGPRs used in said global memory instructions. Previously, exp_cnt wasn't being tracked at all, which lead to the waitcnt finishing immediately, leading to the memory instruction's VPGRs getting overwritten by subsequent instructions, causing errors. This patch makes it so waitcnts waiting on exp_cnt will wait for MUBUF buffer store instructions to read their VGPRs before completing Change-Id: Idd2b59511bc086cf316217da27b7a228272b0b0f Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/37555 Reviewed-by: Matt Sinclair Reviewed-by: Alexandru Duțu Maintainer: Matt Sinclair Tested-by: kokoro --- src/gpu-compute/global_memory_pipeline.cc | 4 ++++ src/gpu-compute/schedule_stage.cc | 3 +++ 2 files changed, 7 insertions(+) diff --git a/src/gpu-compute/global_memory_pipeline.cc b/src/gpu-compute/global_memory_pipeline.cc index 01f986c25..bcd93f886 100644 --- a/src/gpu-compute/global_memory_pipeline.cc +++ b/src/gpu-compute/global_memory_pipeline.cc @@ -193,6 +193,10 @@ GlobalMemPipeline::exec() mp->disassemble(), mp->seqNum()); mp->initiateAcc(mp); + if (mp->isStore() && mp->isGlobalSeg()) { + mp->wavefront()->decExpInstsIssued(); + } + if (((mp->isMemSync() && !mp->isEndOfKernel()) || !mp->isMemSync())) { /** * if we are not in out-of-order data delivery mode diff --git a/src/gpu-compute/schedule_stage.cc b/src/gpu-compute/schedule_stage.cc index 851cca81b..54e931306 100644 --- a/src/gpu-compute/schedule_stage.cc +++ b/src/gpu-compute/schedule_stage.cc @@ -144,6 +144,9 @@ ScheduleStage::exec() wf->incLGKMInstsIssued(); } } + if (gpu_dyn_inst->isStore() && gpu_dyn_inst->isGlobalSeg()) { + wf->incExpInstsIssued(); + } } } -- 2.30.2