From ab201ce8cb84c780742dac71fc2d2996f2b9c775 Mon Sep 17 00:00:00 2001 From: Davit Grigoryan Date: Sat, 18 Apr 2026 18:28:57 +0000 Subject: impl xor lane shuffling; add delay option for operand reads --- src/abstract_hardware_model.cc | 46 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'src/abstract_hardware_model.cc') diff --git a/src/abstract_hardware_model.cc b/src/abstract_hardware_model.cc index 9262a92..86427ad 100644 --- a/src/abstract_hardware_model.cc +++ b/src/abstract_hardware_model.cc @@ -129,6 +129,52 @@ void warp_inst_t::compute_simd_sets_compacted(unsigned num_sets, } } +void warp_inst_t::compute_simd_sets_xor_static(unsigned num_sets, + unsigned set_width, + unsigned start_set) { + // start_set is unused for XOR-static: the lane permutation is fully + // determined by warp_id. Accepted for signature compatibility with + // compute_simd_sets_compacted. + (void)start_set; + + m_simd_sets.resize(num_sets); + 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; + } + + // xor_key = reverse of the low log2(warp_size) bits of m_warp_id + unsigned warp_size = m_config->warp_size; + unsigned bits = 0; + while ((1u << bits) < warp_size) bits++; + unsigned xor_key = 0; + for (unsigned i = 0; i < bits; i++) { + if (m_warp_id & (1u << i)) xor_key |= (1u << (bits - 1 - i)); + } + + // Physical lane P runs logical thread T = P ^ xor_key. + for (unsigned P = 0; P < warp_size; P++) { + unsigned T = P ^ xor_key; + unsigned s = P / set_width; + unsigned lane = P % set_width; + simd_set_info &info = m_simd_sets[s]; + info.thread_ids[lane] = T; + if (m_warp_active_mask.test(T)) { + info.set_active_mask.set(lane); + info.active_mask_in_warp.set(T); + info.num_active_threads++; + } + } + + for (unsigned s = 0; s < num_sets; s++) { + m_simd_sets[s].valid = (m_simd_sets[s].num_active_threads > 0); + } +} + unsigned warp_inst_t::num_active_simd_sets() const { unsigned count = 0; for (unsigned i = 0; i < m_simd_sets.size(); i++) { -- cgit v1.3