From 0d71376678778ea7f62556d997c71baa43fb2fbe Mon Sep 17 00:00:00 2001 From: Davit Grigoryan Date: Fri, 24 Apr 2026 22:53:58 +0000 Subject: fix global mem reqs coalescing --- src/abstract_hardware_model.h | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'src/abstract_hardware_model.h') diff --git a/src/abstract_hardware_model.h b/src/abstract_hardware_model.h index 1a42657..713c51a 100644 --- a/src/abstract_hardware_model.h +++ b/src/abstract_hardware_model.h @@ -867,6 +867,22 @@ class mem_access_t { void set_source_wid(unsigned w) { m_source_wid = w; } void set_source_split_id(unsigned s) { m_source_split_id = s; } + // MEMCO v3 inter-set coalescing: list of (wid, split_id) pairs that + // contributed lanes to this access after cross-set merging. Empty for + // unmerged / legacy (non-co-issue) accesses. On writeback, each entry's + // source_inst out[] regs are decremented independently. + void add_source(unsigned w, unsigned s) { + for (unsigned i = 0; i < m_source_list.size(); i++) { + if (m_source_list[i].first == w && m_source_list[i].second == s) return; + } + m_source_list.push_back(std::make_pair(w, s)); + } + const std::vector > &get_source_list() const { + return m_source_list; + } + bool has_source_list() const { return !m_source_list.empty(); } + void clear_source_list() { m_source_list.clear(); } + void print(FILE *fp) const { fprintf(fp, "addr=0x%llx, %s, size=%u, ", m_addr, m_write ? "store" : "load ", m_req_size); @@ -919,6 +935,8 @@ class mem_access_t { mem_access_sector_mask_t m_sector_mask; unsigned m_source_wid; // MEM co-issue: originating warp (-1 = unset) unsigned m_source_split_id; // MEM co-issue: originating split (-1 = unset) + // MEMCO v3: populated by coalesce_accessq_across_sets; empty otherwise. + std::vector > m_source_list; }; class mem_fetch; @@ -1432,6 +1450,18 @@ class warp_inst_t : public inst_t { std::list::const_iterator accessq_end() const { return m_accessq.end(); } + // MEMCO v3: mutable iteration for coalesce_accessq_across_sets (populating + // per-access source_list + erasing merged duplicates). + std::list::iterator accessq_mut_begin() { + return m_accessq.begin(); + } + std::list::iterator accessq_mut_end() { + return m_accessq.end(); + } + std::list::iterator accessq_mut_erase( + std::list::iterator it) { + return m_accessq.erase(it); + } bool dispatch_delay() { if (cycles > 0) cycles--; -- cgit v1.3