summaryrefslogtreecommitdiff
path: root/src/abstract_hardware_model.cc
diff options
context:
space:
mode:
authorDavit Grigoryan <[email protected]>2026-04-12 01:05:57 +0000
committerDavit Grigoryan <[email protected]>2026-04-12 01:05:57 +0000
commitc3c124bfdf4384db3b6e852b517dc8828577a3a5 (patch)
tree4dca37ffc13bf3939d9b051898fb131a22c44729 /src/abstract_hardware_model.cc
parent29d90a95ffa4287f58dc30a2e3488edf13d6c143 (diff)
impl thread compaction
Diffstat (limited to 'src/abstract_hardware_model.cc')
-rw-r--r--src/abstract_hardware_model.cc41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/abstract_hardware_model.cc b/src/abstract_hardware_model.cc
index ed91a44..deebfd6 100644
--- a/src/abstract_hardware_model.cc
+++ b/src/abstract_hardware_model.cc
@@ -88,6 +88,47 @@ void warp_inst_t::compute_simd_sets(unsigned num_sets, unsigned set_width) {
}
}
+void warp_inst_t::compute_simd_sets_compacted(unsigned num_sets,
+ unsigned set_width,
+ unsigned start_set) {
+ m_simd_sets.resize(num_sets);
+ // Initialize all sets as invalid
+ for (unsigned s = 0; s < num_sets; s++) {
+ simd_set_info &info = m_simd_sets[s];
+ info.set_id = s;
+ info.warp_id = m_warp_id;
+ info.set_active_mask.reset();
+ info.active_mask_in_warp.reset();
+ info.num_active_threads = 0;
+ info.valid = false;
+ info.source_inst = NULL;
+ for (unsigned i = 0; i < MAX_WARP_SIZE; i++) info.thread_ids[i] = 0;
+ }
+
+ // Collect active thread IDs
+ std::vector<unsigned> active_tids;
+ for (unsigned t = 0; t < m_config->warp_size; t++) {
+ if (m_warp_active_mask.test(t)) active_tids.push_back(t);
+ }
+
+ // Pack active threads contiguously into sets starting at start_set
+ unsigned tid_idx = 0;
+ for (unsigned s = start_set; s < num_sets && tid_idx < active_tids.size();
+ s++) {
+ simd_set_info &info = m_simd_sets[s];
+ for (unsigned lane = 0;
+ lane < set_width && tid_idx < active_tids.size(); lane++) {
+ unsigned tid = active_tids[tid_idx];
+ info.thread_ids[lane] = tid;
+ info.set_active_mask.set(lane);
+ info.active_mask_in_warp.set(tid);
+ info.num_active_threads++;
+ tid_idx++;
+ }
+ info.valid = true;
+ }
+}
+
unsigned warp_inst_t::num_active_simd_sets() const {
unsigned count = 0;
for (unsigned i = 0; i < m_simd_sets.size(); i++) {