summaryrefslogtreecommitdiff
path: root/src/abstract_hardware_model.h
diff options
context:
space:
mode:
authorDavit Grigoryan <[email protected]>2026-04-23 07:34:57 +0000
committerDavit Grigoryan <[email protected]>2026-04-23 07:34:57 +0000
commit3b2306b471ea0b92fc07ebef54f8f261d9c55a29 (patch)
tree2503bf8109e8a37cb01ed60fdfb507ecdd215f26 /src/abstract_hardware_model.h
parent84ec3a171c138e35a22ff6bf90960b7f4112593f (diff)
co-issue global mem requests
Diffstat (limited to 'src/abstract_hardware_model.h')
-rw-r--r--src/abstract_hardware_model.h23
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--;