diff options
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(); +} |
