summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/shader.cc
diff options
context:
space:
mode:
authorWonhyuk Yang <[email protected]>2024-06-22 09:50:06 +0900
committerGitHub <[email protected]>2024-06-22 00:50:06 +0000
commit036b1305fc825fe29c3174dd814c413407db8584 (patch)
tree85f7b7b692bc3f580a2bfea7e04699dd1a56f35a /src/gpgpu-sim/shader.cc
parent7dc9977199f6a79f58191b18b64568b6155873ac (diff)
Add missing increment part for m_pending_ldgsts with minor fix (#72)
LDGSTS/LDGDEPBAR was introduced #62, but it's increment part was deleted by mistake. So add it. In some applications, ldgsts may not exist between ldgdepbar. In such cases, add exception handling logic to insert an empty vector. Reported-by: Okkyun Woo <[email protected]> Signed-off-by: Wonhyuk Yang <[email protected]>
Diffstat (limited to 'src/gpgpu-sim/shader.cc')
-rw-r--r--src/gpgpu-sim/shader.cc9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/gpgpu-sim/shader.cc b/src/gpgpu-sim/shader.cc
index 67540e0..b1609d5 100644
--- a/src/gpgpu-sim/shader.cc
+++ b/src/gpgpu-sim/shader.cc
@@ -1073,6 +1073,12 @@ void shader_core_ctx::issue_warp(register_set &pipe_reg_set,
m_warp[warp_id]->set_membar();
} else if (next_inst->m_is_ldgdepbar) { // Add for LDGDEPBAR
m_warp[warp_id]->m_ldgdepbar_id++;
+ // If there are no added LDGSTS, insert an empty vector
+ if (m_warp[warp_id]->m_ldgdepbar_buf.size() != ldgdepbar_id + 1) {
+ assert(m_warp[warp_id]->m_ldgdepbar_buf.size() < ldgdepbar_id + 1);
+ std::vector<warp_inst_t> l;
+ m_warp[warp_id]->m_ldgdepbar_buf.push_back(l);
+ }
} else if (next_inst->m_is_depbar) { // Add for DEPBAR
// Set to true immediately when a DEPBAR instruction is met
m_warp[warp_id]->m_waiting_ldgsts = true;
@@ -2642,6 +2648,9 @@ void ldst_unit::issue(register_set &reg_set) {
m_pending_writes[warp_id][reg_id] += n_accesses;
}
}
+ if (inst->m_is_ldgsts) {
+ m_pending_ldgsts[warp_id][inst->pc][inst->get_addr(0)] += n_accesses;
+ }
}
inst->op_pipe = MEM__OP;