diff options
Diffstat (limited to 'src/gpgpu-sim/scoreboard.cc')
| -rw-r--r-- | src/gpgpu-sim/scoreboard.cc | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/gpgpu-sim/scoreboard.cc b/src/gpgpu-sim/scoreboard.cc index bcaea56..6cdcaf5 100644 --- a/src/gpgpu-sim/scoreboard.cc +++ b/src/gpgpu-sim/scoreboard.cc @@ -269,3 +269,25 @@ void Scoreboard::dumpAccounting(FILE* out) const { sec_avg_dur, m_sec_max_duration_cycles, m_sec_clear_calls, m_sec_clear_regs_dropped); } + +// Read-only diagnostic. Prints the primary and secondary scoreboard +// register sets for one warp. Called from deadlock_check() under +// MEMCO_DBG_DEADLOCK to help localize a stuck warp. +void Scoreboard::dump_warp_state(FILE *out, unsigned wid) const { + if (wid >= reg_table.size()) return; + fprintf(out, " primary_reg_table[%u] (size=%zu):", wid, + reg_table[wid].size()); + for (auto r : reg_table[wid]) fprintf(out, " r%u", r); + fprintf(out, "\n"); + fprintf(out, " sec_reg_table[%u] (size=%zu):", wid, + sec_reg_table[wid].size()); + for (auto r : sec_reg_table[wid]) fprintf(out, " r%u", r); + fprintf(out, "\n"); + // Long-op registers — relevant for stuck loads + if (wid < longopregs.size() && !longopregs[wid].empty()) { + fprintf(out, " longopregs[%u] (size=%zu):", wid, + longopregs[wid].size()); + for (auto r : longopregs[wid]) fprintf(out, " r%u", r); + fprintf(out, "\n"); + } +} |
