diff options
| author | Davit Grigoryan <[email protected]> | 2026-04-14 03:06:42 +0000 |
|---|---|---|
| committer | Davit Grigoryan <[email protected]> | 2026-04-14 03:06:42 +0000 |
| commit | 305c5ea8fed5bca224377c1bdd8c726fac0f926f (patch) | |
| tree | 549f408023103f33d6b074293e7f25f467590fc1 /src/gpgpu-sim/scoreboard.cc | |
| parent | 2c3524751b9b175514970c768637266bbed08767 (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.cc | 31 |
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(); +} |
