summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/scoreboard.cc
diff options
context:
space:
mode:
authorDavit Grigoryan <[email protected]>2026-04-14 03:06:42 +0000
committerDavit Grigoryan <[email protected]>2026-04-14 03:06:42 +0000
commit305c5ea8fed5bca224377c1bdd8c726fac0f926f (patch)
tree549f408023103f33d6b074293e7f25f467590fc1 /src/gpgpu-sim/scoreboard.cc
parent2c3524751b9b175514970c768637266bbed08767 (diff)
create separate scoreboard for I-Buf's second slot; fix other minor issues
Diffstat (limited to 'src/gpgpu-sim/scoreboard.cc')
-rw-r--r--src/gpgpu-sim/scoreboard.cc31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/gpgpu-sim/scoreboard.cc b/src/gpgpu-sim/scoreboard.cc
index 44a9980..de71807 100644
--- a/src/gpgpu-sim/scoreboard.cc
+++ b/src/gpgpu-sim/scoreboard.cc
@@ -38,6 +38,7 @@ Scoreboard::Scoreboard(unsigned sid, unsigned n_warps, class gpgpu_t* gpu)
// Initialize size of table
reg_table.resize(n_warps);
longopregs.resize(n_warps);
+ sec_reg_table.resize(n_warps);
m_gpu = gpu;
}
@@ -152,3 +153,33 @@ bool Scoreboard::checkCollision(unsigned wid, const class inst_t* inst) const {
bool Scoreboard::pendingWrites(unsigned wid) const {
return !reg_table[wid].empty();
}
+
+// Secondary scoreboard methods for intra-warp co-issue
+
+void Scoreboard::reserveRegisterSecondary(unsigned wid, unsigned regnum) {
+ // No abort on duplicate — secondary may share register names with primary
+ sec_reg_table[wid].insert(regnum);
+}
+
+void Scoreboard::releaseRegisterSecondary(unsigned wid, unsigned regnum) {
+ sec_reg_table[wid].erase(regnum);
+}
+
+bool Scoreboard::checkCollisionSecondary(unsigned wid,
+ const inst_t *inst) const {
+ std::set<int> inst_regs;
+ for (unsigned i = 0; i < inst->outcount; i++) inst_regs.insert(inst->out[i]);
+ for (unsigned j = 0; j < inst->incount; j++) inst_regs.insert(inst->in[j]);
+ if (inst->pred > 0) inst_regs.insert(inst->pred);
+ if (inst->ar1 > 0) inst_regs.insert(inst->ar1);
+ if (inst->ar2 > 0) inst_regs.insert(inst->ar2);
+
+ for (auto it = inst_regs.begin(); it != inst_regs.end(); it++)
+ if (sec_reg_table[wid].find(*it) != sec_reg_table[wid].end())
+ return true;
+ return false;
+}
+
+void Scoreboard::clearSecondary(unsigned wid) {
+ sec_reg_table[wid].clear();
+}