diff options
| author | Davit Grigoryan <[email protected]> | 2026-04-12 01:05:57 +0000 |
|---|---|---|
| committer | Davit Grigoryan <[email protected]> | 2026-04-12 01:05:57 +0000 |
| commit | c3c124bfdf4384db3b6e852b517dc8828577a3a5 (patch) | |
| tree | 4dca37ffc13bf3939d9b051898fb131a22c44729 /src/abstract_hardware_model.cc | |
| parent | 29d90a95ffa4287f58dc30a2e3488edf13d6c143 (diff) | |
impl thread compaction
Diffstat (limited to 'src/abstract_hardware_model.cc')
| -rw-r--r-- | src/abstract_hardware_model.cc | 41 |
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++) { |
