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