summaryrefslogtreecommitdiff
path: root/src/abstract_hardware_model.h
diff options
context:
space:
mode:
authorDavit Grigoryan <[email protected]>2026-04-24 22:53:58 +0000
committerDavit Grigoryan <[email protected]>2026-04-24 22:53:58 +0000
commit0d71376678778ea7f62556d997c71baa43fb2fbe (patch)
tree87e1aa73e21aa55202568f440765c2843a97469d /src/abstract_hardware_model.h
parent150e3a9c218fa1c99cd2391885ebd7e1c86a9430 (diff)
fix global mem reqs coalescing
Diffstat (limited to 'src/abstract_hardware_model.h')
-rw-r--r--src/abstract_hardware_model.h30
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--;