summaryrefslogtreecommitdiff
path: root/src/abstract_hardware_model.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/abstract_hardware_model.cc')
-rw-r--r--src/abstract_hardware_model.cc30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/abstract_hardware_model.cc b/src/abstract_hardware_model.cc
index dde9d28..316b02b 100644
--- a/src/abstract_hardware_model.cc
+++ b/src/abstract_hardware_model.cc
@@ -66,6 +66,36 @@ void warp_inst_t::issue(const active_mask_t &mask, unsigned warp_id,
m_scheduler_id = sch_id;
}
+void warp_inst_t::compute_simd_sets(unsigned num_sets, unsigned set_width) {
+ 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;
+ for (unsigned lane = 0; lane < set_width; lane++) {
+ unsigned tid = s * set_width + lane;
+ info.thread_ids[lane] = tid;
+ if (m_warp_active_mask.test(tid)) {
+ info.set_active_mask.set(lane);
+ info.active_mask_in_warp.set(tid);
+ info.num_active_threads++;
+ }
+ }
+ info.valid = (info.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++) {
+ if (m_simd_sets[i].valid) count++;
+ }
+ return count;
+}
+
checkpoint::checkpoint() {
struct stat st = {0};