diff options
Diffstat (limited to 'src/abstract_hardware_model.h')
| -rw-r--r-- | src/abstract_hardware_model.h | 30 |
1 files changed, 30 insertions, 0 deletions
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<std::pair<unsigned, unsigned> > &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<std::pair<unsigned, unsigned> > m_source_list; }; class mem_fetch; @@ -1432,6 +1450,18 @@ class warp_inst_t : public inst_t { std::list<mem_access_t>::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<mem_access_t>::iterator accessq_mut_begin() { + return m_accessq.begin(); + } + std::list<mem_access_t>::iterator accessq_mut_end() { + return m_accessq.end(); + } + std::list<mem_access_t>::iterator accessq_mut_erase( + std::list<mem_access_t>::iterator it) { + return m_accessq.erase(it); + } bool dispatch_delay() { if (cycles > 0) cycles--; |
