gpu-compute: Add exp_cnt tracking for buffer store instructions
authorKyle Roarty <kyleroarty1716@gmail.com>
Sat, 14 Nov 2020 19:42:12 +0000 (13:42 -0600)
committerKyle Roarty <kyleroarty1716@gmail.com>
Mon, 30 Nov 2020 20:59:31 +0000 (20:59 +0000)
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 <mattdsinclair@gmail.com>
Reviewed-by: Alexandru Duțu <alexandru.dutu@amd.com>
Maintainer: Matt Sinclair <mattdsinclair@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/gpu-compute/global_memory_pipeline.cc
src/gpu-compute/schedule_stage.cc

index 01f986c2539ab33a2e1bb9d8c37ba609f8db5b21..bcd93f886210d2381340c73d925c2e8cd1f11e35 100644 (file)
@@ -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
index 851cca81b58054ebe62ed95b14d6f87e0809b585..54e931306e018128bcbdffd5ba156723280f6917 100644 (file)
@@ -144,6 +144,9 @@ ScheduleStage::exec()
                     wf->incLGKMInstsIssued();
                 }
             }
+            if (gpu_dyn_inst->isStore() && gpu_dyn_inst->isGlobalSeg()) {
+                wf->incExpInstsIssued();
+            }
         }
     }