diff options
| author | Davit Grigoryan <[email protected]> | 2026-04-23 07:34:57 +0000 |
|---|---|---|
| committer | Davit Grigoryan <[email protected]> | 2026-04-23 07:34:57 +0000 |
| commit | 3b2306b471ea0b92fc07ebef54f8f261d9c55a29 (patch) | |
| tree | 2503bf8109e8a37cb01ed60fdfb507ecdd215f26 /src/abstract_hardware_model.h | |
| parent | 84ec3a171c138e35a22ff6bf90960b7f4112593f (diff) | |
co-issue global mem requests
Diffstat (limited to 'src/abstract_hardware_model.h')
| -rw-r--r-- | src/abstract_hardware_model.h | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/abstract_hardware_model.h b/src/abstract_hardware_model.h index 698c896..1e3c94e 100644 --- a/src/abstract_hardware_model.h +++ b/src/abstract_hardware_model.h @@ -859,6 +859,14 @@ class mem_access_t { mem_access_byte_mask_t get_byte_mask() const { return m_byte_mask; } mem_access_sector_mask_t get_sector_mask() const { return m_sector_mask; } + // Source-warp attribution for MEM co-issue composites. Unset by default; + // when set, overrides the composite's primary warp_id for mem_fetch + // allocation + pending_writes tracking + writeback scoreboard release. + unsigned get_source_wid() const { return m_source_wid; } + unsigned get_source_split_id() const { return m_source_split_id; } + void set_source_wid(unsigned w) { m_source_wid = w; } + void set_source_split_id(unsigned s) { m_source_split_id = s; } + void print(FILE *fp) const { fprintf(fp, "addr=0x%llx, %s, size=%u, ", m_addr, m_write ? "store" : "load ", m_req_size); @@ -909,6 +917,8 @@ class mem_access_t { active_mask_t m_warp_mask; mem_access_byte_mask_t m_byte_mask; 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) }; class mem_fetch; @@ -1113,6 +1123,7 @@ const unsigned MAX_ACCESSES_PER_INSN_PER_THREAD = 8; struct simd_set_info { unsigned set_id; // Set index (0 to num_sets-1) unsigned warp_id; // Owning warp + unsigned split_id; // Owning split (-1 = inter-warp / primary) simt_mask_t set_active_mask; // Active lanes within this set (lower set_width bits) active_mask_t active_mask_in_warp; // Active mask in original 32-bit warp thread domain unsigned thread_ids[MAX_WARP_SIZE]; // Original thread IDs for each lane (max set_width used) @@ -1121,8 +1132,8 @@ struct simd_set_info { const inst_t *source_inst; // Pointer to static decoded instruction (for MIMD) simd_set_info() - : set_id(0), warp_id(0), num_active_threads(0), valid(false), - source_inst(NULL) { + : set_id(0), warp_id(0), split_id((unsigned)-1), + num_active_threads(0), valid(false), source_inst(NULL) { set_active_mask.reset(); active_mask_in_warp.reset(); for (unsigned i = 0; i < MAX_WARP_SIZE; i++) thread_ids[i] = 0; @@ -1198,6 +1209,7 @@ class warp_inst_t : public inst_t { bool has_simd_sets() const { return !m_simd_sets.empty(); } void merge_simd_sets(const std::vector<simd_set_info> &other_sets); void set_source_inst_on_sets(const inst_t *src); + void set_split_id_on_sets(unsigned split_id); static bool simd_sets_overlap(const std::vector<simd_set_info> &a, const std::vector<simd_set_info> &b); @@ -1323,6 +1335,13 @@ class warp_inst_t : public inst_t { unsigned accessq_count() const { return m_accessq.size(); } const mem_access_t &accessq_back() { return m_accessq.back(); } void accessq_pop_back() { m_accessq.pop_back(); } + // Const iteration over the access queue for per-source grouping (MEM co-issue). + std::list<mem_access_t>::const_iterator accessq_begin() const { + return m_accessq.begin(); + } + std::list<mem_access_t>::const_iterator accessq_end() const { + return m_accessq.end(); + } bool dispatch_delay() { if (cycles > 0) cycles--; |
