summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJRPAN <[email protected]>2021-08-16 18:15:20 -0400
committerJRPAN <[email protected]>2021-08-16 18:15:20 -0400
commitb6581477462ea15d92967588277c4fe822a67bf7 (patch)
tree61a4f96c55386246b5f53ae57a9af1dfefc9d4fe
parentb1befa8422493e0deb45811e6b87399355a532ed (diff)
better oc selecting when sub core enabled
-rw-r--r--src/gpgpu-sim/shader.cc3
-rw-r--r--src/gpgpu-sim/shader.h45
2 files changed, 43 insertions, 5 deletions
diff --git a/src/gpgpu-sim/shader.cc b/src/gpgpu-sim/shader.cc
index 7cee40f..bcfda18 100644
--- a/src/gpgpu-sim/shader.cc
+++ b/src/gpgpu-sim/shader.cc
@@ -3997,6 +3997,9 @@ void opndcoll_rfu_t::init(unsigned num_banks, shader_core_ctx *shader) {
m_cu[j]->init(j, num_banks, m_bank_warp_shift, shader->get_config(), this,
sub_core_model, reg_id, m_num_banks_per_sched);
}
+ for (unsigned j = 0; j < m_dispatch_units.size(); j++) {
+ m_dispatch_units[j].init(sub_core_model,m_num_warp_scheds);
+ }
m_initialized = true;
}
diff --git a/src/gpgpu-sim/shader.h b/src/gpgpu-sim/shader.h
index 9cb256a..f2fac12 100644
--- a/src/gpgpu-sim/shader.h
+++ b/src/gpgpu-sim/shader.h
@@ -950,13 +950,44 @@ class opndcoll_rfu_t { // operand collector based register file unit
m_num_collectors = (*cus).size();
m_next_cu = 0;
}
+ void init(bool sub_core_model, unsigned num_warp_scheds) {
+ m_sub_core_model = sub_core_model;
+ m_num_warp_scheds = num_warp_scheds;
+ if (m_sub_core_model) {
+ m_last_cu_set = new unsigned(m_num_warp_scheds);
+ for (unsigned i = 0; i < m_num_warp_scheds; i++)
+ {
+ m_last_cu_set[i] = i * m_num_collectors / m_num_warp_scheds;
+ }
+ }
+
+ }
collector_unit_t *find_ready() {
- for (unsigned n = 0; n < m_num_collectors; n++) {
- unsigned c = (m_last_cu + n + 1) % m_num_collectors;
- if ((*m_collector_units)[c].ready()) {
- m_last_cu = c;
- return &((*m_collector_units)[c]);
+ if (m_sub_core_model) {
+ assert(m_num_collectors % m_num_warp_scheds == 0 &&
+ m_num_collectors >= m_num_warp_scheds);
+ unsigned cusPerSched = m_num_collectors / m_num_warp_scheds;
+ for (unsigned i = 0; i < m_num_warp_scheds; i++) {
+ unsigned cuLowerBound = i * cusPerSched;
+ unsigned cuUpperBound = cuLowerBound + cusPerSched;
+ assert(0 <= cuLowerBound && cuUpperBound <= m_num_collectors);
+ assert(cuLowerBound <= m_last_cu_set[i] && m_last_cu_set[i] <= cuUpperBound);
+ for (unsigned j = cuLowerBound; j < cuUpperBound; j++) {
+ unsigned c = cuLowerBound + (m_last_cu_set[i] + j + 1) % cusPerSched;
+ if ((*m_collector_units)[c].ready()) {
+ m_last_cu_set[i] = c;
+ return &((*m_collector_units)[c]);
+ }
+ }
+ }
+ } else {
+ for (unsigned n = 0; n < m_num_collectors; n++) {
+ unsigned c = (m_last_cu + n + 1) % m_num_collectors;
+ if ((*m_collector_units)[c].ready()) {
+ m_last_cu = c;
+ return &((*m_collector_units)[c]);
+ }
}
}
return NULL;
@@ -966,7 +997,11 @@ class opndcoll_rfu_t { // operand collector based register file unit
unsigned m_num_collectors;
std::vector<collector_unit_t> *m_collector_units;
unsigned m_last_cu; // dispatch ready cu's rr
+ unsigned *m_last_cu_set;
unsigned m_next_cu; // for initialization
+
+ bool m_sub_core_model;
+ unsigned m_num_warp_scheds;
};
// opndcoll_rfu_t data members