summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/shader.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpgpu-sim/shader.h')
-rw-r--r--src/gpgpu-sim/shader.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/gpgpu-sim/shader.h b/src/gpgpu-sim/shader.h
index 3d1aea9..70de529 100644
--- a/src/gpgpu-sim/shader.h
+++ b/src/gpgpu-sim/shader.h
@@ -550,6 +550,50 @@ class scheduler_unit { // this can be copied freely, so can be used in std
const std::vector<shd_warp_t *>::const_iterator &prioritized_iter);
inline int get_sid() const;
+ // --- Change 4: co-issue scheduler helpers ----------------------------
+ // Classify an instruction's FU type (the 25-line op→exec_unit_type_t
+ // switch that was duplicated across the primary pick, inter-warp pass,
+ // and intra-warp pass).
+ exec_unit_type_t classify_fu_type(const warp_inst_t *inst) const;
+
+ // Check whether `cand_inst` can co-issue alongside `composite` given
+ // `available_sets`. Writes the candidate's sets_needed to *sets_needed
+ // on success. Uses the current compaction_mode to decide between the
+ // count-only path (full compaction) and the overlap-check path
+ // (identity / XOR-static).
+ bool check_coissue_feasibility(const warp_inst_t *composite,
+ const warp_inst_t *cand_inst,
+ const active_mask_t &cand_mask,
+ unsigned cand_warp_id,
+ unsigned available_sets,
+ unsigned *sets_needed);
+
+ // Runs the inter-warp co-issue pass. sort_mode:
+ // 0 = round-robin (iterate m_next_cycle_prioritized_warps as-is)
+ // 1 = fewest-lanes first (sort by popcount(active_mask) ascending)
+ // 2 = same-PC first, fall through to arbitrary within the cycle
+ void try_inter_warp_coissue(warp_inst_t *co_issue_composite,
+ exec_unit_type_t co_issue_fu_type,
+ unsigned co_issue_primary_warp_id,
+ unsigned &available_sets,
+ unsigned &next_free_set,
+ unsigned sort_mode);
+
+ // Runs the intra-warp co-issue pass (primary warp's secondary slots).
+ void try_intra_warp_coissue(warp_inst_t *co_issue_composite,
+ exec_unit_type_t co_issue_fu_type,
+ unsigned co_issue_primary_warp_id,
+ unsigned &available_sets,
+ unsigned &next_free_set);
+
+ // Unified intra+inter candidate pool, density-sorted greedy packing.
+ // Approximates optimal SIMD-lane utilization for the cycle.
+ void try_utilization_max_coissue(warp_inst_t *co_issue_composite,
+ exec_unit_type_t co_issue_fu_type,
+ unsigned co_issue_primary_warp_id,
+ unsigned &available_sets,
+ unsigned &next_free_set);
+
protected:
shd_warp_t &warp(int i);
@@ -2039,6 +2083,18 @@ struct shader_core_stats_pod {
unsigned *gpgpu_n_shmem_bank_access;
long *n_simt_to_mem; // Interconnect power stats
long *n_mem_to_simt;
+
+ // Change 5: SIMD partitioning co-issue counters. All per-core arrays
+ // of size num_shader(); histogram is flat size num_shader() *
+ // (gpgpu_num_simd_sets + 1).
+ unsigned long long *inter_warp_coissue_events;
+ unsigned long long *intra_warp_coissue_events;
+ unsigned long long *coissue_denied_by_fu_mismatch;
+ unsigned long long *coissue_denied_by_scoreboard;
+ unsigned long long *coissue_denied_by_no_sets;
+ unsigned long long *coissue_total_active_lanes;
+ unsigned long long *coissue_composite_cycles;
+ unsigned long long *simd_sets_used_histogram;
};
class shader_core_stats : public shader_core_stats_pod {
@@ -2151,6 +2207,27 @@ class shader_core_stats : public shader_core_stats_pod {
m_shader_dynamic_warp_issue_distro.resize(config->num_shader());
m_shader_warp_slot_issue_distro.resize(config->num_shader());
+
+ // Change 5: SIMD partitioning co-issue counters
+ inter_warp_coissue_events = (unsigned long long *)calloc(
+ config->num_shader(), sizeof(unsigned long long));
+ intra_warp_coissue_events = (unsigned long long *)calloc(
+ config->num_shader(), sizeof(unsigned long long));
+ coissue_denied_by_fu_mismatch = (unsigned long long *)calloc(
+ config->num_shader(), sizeof(unsigned long long));
+ coissue_denied_by_scoreboard = (unsigned long long *)calloc(
+ config->num_shader(), sizeof(unsigned long long));
+ coissue_denied_by_no_sets = (unsigned long long *)calloc(
+ config->num_shader(), sizeof(unsigned long long));
+ coissue_total_active_lanes = (unsigned long long *)calloc(
+ config->num_shader(), sizeof(unsigned long long));
+ coissue_composite_cycles = (unsigned long long *)calloc(
+ config->num_shader(), sizeof(unsigned long long));
+ // Histogram bins: 0..gpgpu_num_simd_sets (inclusive). When
+ // partitioning is off, gpgpu_num_simd_sets == 1 so we allocate 2 bins.
+ unsigned nbins = config->gpgpu_num_simd_sets + 1;
+ simd_sets_used_histogram = (unsigned long long *)calloc(
+ (size_t)config->num_shader() * nbins, sizeof(unsigned long long));
}
~shader_core_stats() {
@@ -2203,6 +2280,15 @@ class shader_core_stats : public shader_core_stats_pod {
free(m_n_diverge);
free(shader_cycle_distro);
free(last_shader_cycle_distro);
+ // Change 5: SIMD partitioning co-issue counters
+ free(inter_warp_coissue_events);
+ free(intra_warp_coissue_events);
+ free(coissue_denied_by_fu_mismatch);
+ free(coissue_denied_by_scoreboard);
+ free(coissue_denied_by_no_sets);
+ free(coissue_total_active_lanes);
+ free(coissue_composite_cycles);
+ free(simd_sets_used_histogram);
}
void new_grid() {}