diff options
Diffstat (limited to 'src/gpgpu-sim/shader.cc')
| -rw-r--r-- | src/gpgpu-sim/shader.cc | 72 |
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; } |
