summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/shader.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpgpu-sim/shader.cc')
-rw-r--r--src/gpgpu-sim/shader.cc72
1 files changed, 55 insertions, 17 deletions
diff --git a/src/gpgpu-sim/shader.cc b/src/gpgpu-sim/shader.cc
index e9c2e19..a86393c 100644
--- a/src/gpgpu-sim/shader.cc
+++ b/src/gpgpu-sim/shader.cc
@@ -2477,8 +2477,18 @@ void scheduler_unit::try_utilization_max_coissue(
continue;
}
unsigned sec_active = sec_mask_eff.count();
- unsigned sec_needed = (sec_active + set_width - 1) / set_width;
- if (sec_needed > available_sets) {
+ // Use the same feasibility test as inter coissue. Under
+ // compaction != 2 partitions are fixed by thread_id, so the
+ // coissuer's set positions can overlap the composite's even
+ // when (active/set_width) <= available_sets. merge_simd_sets
+ // silently drops overlapping coissuer sets while the access
+ // was already injected, leaving m_pending_writes_secondary
+ // unincremented but later decremented at writeback (underflow
+ // on sb0/sb2, deadlock on sb1).
+ unsigned sec_needed = 0;
+ if (!check_coissue_feasibility(co_issue_composite, sec_inst,
+ sec_mask_eff, cand_warp_id,
+ available_sets, &sec_needed)) {
m_stats->coissue_denied_by_no_sets[get_sid()]++;
continue;
}
@@ -2517,16 +2527,14 @@ void scheduler_unit::try_utilization_max_coissue(
it != pool.end() && available_sets > 0; it++) {
coissue_cand_t &c = *it;
// Re-check feasibility: prior picks may have filled sets that this
- // candidate overlaps (only matters for compaction_mode != 2).
+ // candidate overlaps (only matters for compaction_mode != 2). Both
+ // intra and inter must re-evaluate against the *current* composite
+ // — the cached c.sets_needed from admission can be stale once an
+ // earlier pool entry has merged its sets in.
unsigned needed = 0;
- if (c.is_intra) {
- if (c.sets_needed > available_sets) continue;
- needed = c.sets_needed;
- } else {
- if (!check_coissue_feasibility(co_issue_composite, c.inst, c.mask,
- c.warp_id, available_sets, &needed))
- continue;
- }
+ if (!check_coissue_feasibility(co_issue_composite, c.inst, c.mask,
+ c.warp_id, available_sets, &needed))
+ continue;
if (c.is_intra) {
if (m_shader->m_config->gpgpu_simd_partitioning_debug) {
@@ -2798,8 +2806,18 @@ void scheduler_unit::try_utilization_max_coissue_window(
continue;
}
unsigned sec_active = sec_mask_eff.count();
- unsigned sec_needed = (sec_active + set_width - 1) / set_width;
- if (sec_needed > available_sets) {
+ // Use the same feasibility test as inter coissue. Under
+ // compaction != 2 partitions are fixed by thread_id, so the
+ // coissuer's set positions can overlap the composite's even
+ // when (active/set_width) <= available_sets. merge_simd_sets
+ // silently drops overlapping coissuer sets while the access
+ // was already injected, leaving m_pending_writes_secondary
+ // unincremented but later decremented at writeback (underflow
+ // on sb0/sb2, deadlock on sb1).
+ unsigned sec_needed = 0;
+ if (!check_coissue_feasibility(co_issue_composite, sec_inst,
+ sec_mask_eff, cand_warp_id,
+ available_sets, &sec_needed)) {
m_stats->coissue_denied_by_no_sets[get_sid()]++;
continue;
}
@@ -3120,8 +3138,18 @@ void scheduler_unit::try_utilization_max_coissue_window_centered(
continue;
}
unsigned sec_active = sec_mask_eff.count();
- unsigned sec_needed = (sec_active + set_width - 1) / set_width;
- if (sec_needed > available_sets) {
+ // Use the same feasibility test as inter coissue. Under
+ // compaction != 2 partitions are fixed by thread_id, so the
+ // coissuer's set positions can overlap the composite's even
+ // when (active/set_width) <= available_sets. merge_simd_sets
+ // silently drops overlapping coissuer sets while the access
+ // was already injected, leaving m_pending_writes_secondary
+ // unincremented but later decremented at writeback (underflow
+ // on sb0/sb2, deadlock on sb1).
+ unsigned sec_needed = 0;
+ if (!check_coissue_feasibility(co_issue_composite, sec_inst,
+ sec_mask_eff, cand_warp_id,
+ available_sets, &sec_needed)) {
m_stats->coissue_denied_by_no_sets[get_sid()]++;
continue;
}
@@ -3435,8 +3463,18 @@ void scheduler_unit::try_utilization_max_coissue_window_before(
continue;
}
unsigned sec_active = sec_mask_eff.count();
- unsigned sec_needed = (sec_active + set_width - 1) / set_width;
- if (sec_needed > available_sets) {
+ // Use the same feasibility test as inter coissue. Under
+ // compaction != 2 partitions are fixed by thread_id, so the
+ // coissuer's set positions can overlap the composite's even
+ // when (active/set_width) <= available_sets. merge_simd_sets
+ // silently drops overlapping coissuer sets while the access
+ // was already injected, leaving m_pending_writes_secondary
+ // unincremented but later decremented at writeback (underflow
+ // on sb0/sb2, deadlock on sb1).
+ unsigned sec_needed = 0;
+ if (!check_coissue_feasibility(co_issue_composite, sec_inst,
+ sec_mask_eff, cand_warp_id,
+ available_sets, &sec_needed)) {
m_stats->coissue_denied_by_no_sets[get_sid()]++;
continue;
}