summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/abstract_hardware_model.h11
-rw-r--r--src/gpgpu-sim/shader.cc17
-rw-r--r--src/gpgpu-sim/shader.h10
3 files changed, 27 insertions, 11 deletions
diff --git a/src/abstract_hardware_model.h b/src/abstract_hardware_model.h
index ba32358..d70c3eb 100644
--- a/src/abstract_hardware_model.h
+++ b/src/abstract_hardware_model.h
@@ -1346,6 +1346,17 @@ class register_set {
// void copy_in( warp_inst_t* src ){
// src->copy_contents_to(*get_free());
//}
+ void move_in(bool sub_core_model, unsigned reg_id, warp_inst_t *&src) {
+ warp_inst_t **free;
+ if (!sub_core_model) {
+ free = get_free();
+ } else {
+ assert(reg_id < regs.size());
+ free = get_free(sub_core_model, reg_id);
+ }
+ move_warp(*free, src);
+ }
+
void move_out_to(warp_inst_t *&dest) {
warp_inst_t **ready = get_ready();
move_warp(dest, *ready);
diff --git a/src/gpgpu-sim/shader.cc b/src/gpgpu-sim/shader.cc
index 5c27b9b..ec10733 100644
--- a/src/gpgpu-sim/shader.cc
+++ b/src/gpgpu-sim/shader.cc
@@ -3939,7 +3939,7 @@ bool opndcoll_rfu_t::writeback(warp_inst_t &inst) {
void opndcoll_rfu_t::dispatch_ready_cu() {
for (unsigned p = 0; p < m_dispatch_units.size(); ++p) {
dispatch_unit_t &du = m_dispatch_units[p];
- collector_unit_t *cu = du.find_ready();
+ collector_unit_t *cu = du.find_ready(sub_core_model, p);
if (cu) {
for (unsigned i = 0; i < (cu->get_num_operands() - cu->get_num_regs());
i++) {
@@ -3961,7 +3961,9 @@ void opndcoll_rfu_t::dispatch_ready_cu() {
m_shader->get_config()->warp_size); // cu->get_active_count());
}
}
- cu->dispatch();
+ unsigned cusPerSched = du->get_num_collectors() / m_num_warp_scheds;
+ unsigned reg_id = p / cusPerSched;
+ cu->dispatch(sub_core_model, reg_id);
}
}
}
@@ -3985,7 +3987,6 @@ void opndcoll_rfu_t::allocate_cu(unsigned port_num) {
unsigned cusPerSched = cu_set.size() / m_num_warp_scheds;
cuLowerBound = schd_id * cusPerSched;
cuUpperBound = cuLowerBound + cusPerSched;
- std::cout << "reg_id: " << reg_id << " schd_id: " << schd_id << " cusPerSched: " << cusPerSched << " lowerBound: " << cuLowerBound << std::endl;
assert(0 <= cuLowerBound && cuUpperBound <= cu_set.size());
}
for (unsigned k = cuLowerBound; k < cuUpperBound; k++) {
@@ -4046,8 +4047,8 @@ void opndcoll_rfu_t::allocate_reads() {
}
}
-bool opndcoll_rfu_t::collector_unit_t::ready() const {
- return (!m_free) && m_not_ready.none() && (*m_output_register).has_free();
+bool opndcoll_rfu_t::collector_unit_t::ready(bool sub_core_model, unsigned reg_id) const {
+ return (!m_free) && m_not_ready.none() && (*m_output_register).has_free(sub_core_model, reg_id);
}
void opndcoll_rfu_t::collector_unit_t::dump(
@@ -4110,7 +4111,7 @@ bool opndcoll_rfu_t::collector_unit_t::allocate(register_set *pipeline_reg_set,
return false;
}
-void opndcoll_rfu_t::collector_unit_t::dispatch() {
+void opndcoll_rfu_t::collector_unit_t::dispatch(bool sub_core_model, unsigned reg_id) {
assert(m_not_ready.none());
// move_warp(*m_output_register,m_warp);
// Print out which OC dispatched which warp sched id to which exec pipeline
@@ -4122,8 +4123,10 @@ void opndcoll_rfu_t::collector_unit_t::dispatch() {
<< m_warp->get_schd_id()
<< "\tto execution register: "
<< m_output_register->get_name()
+ << "\treg id: "
+ << reg_id
<< std::endl;
- m_output_register->move_in(m_warp);
+ m_output_register->move_in(sub_core_model, reg_id, m_warp);
m_free = true;
m_output_register = NULL;
for (unsigned i = 0; i < MAX_REG_OPERANDS * 2; i++) m_src_op[i].reset();
diff --git a/src/gpgpu-sim/shader.h b/src/gpgpu-sim/shader.h
index 05c0e4c..74bf320 100644
--- a/src/gpgpu-sim/shader.h
+++ b/src/gpgpu-sim/shader.h
@@ -867,7 +867,7 @@ class opndcoll_rfu_t { // operand collector based register file unit
m_bank_warp_shift = 0;
}
// accessors
- bool ready() const;
+ bool ready(bool sub_core_modle, unsigned reg_id) const;
const op_t *get_operands() const { return m_src_op; }
void dump(FILE *fp, const shader_core_ctx *shader) const;
@@ -888,7 +888,7 @@ class opndcoll_rfu_t { // operand collector based register file unit
void collect_operand(unsigned op) { m_not_ready.reset(op); }
unsigned get_num_operands() const { return m_warp->get_num_operands(); }
unsigned get_num_regs() const { return m_warp->get_num_regs(); }
- void dispatch();
+ void dispatch(bool sub_core_model, unsigned reg_id);
bool is_free() { return m_free; }
private:
@@ -917,10 +917,10 @@ class opndcoll_rfu_t { // operand collector based register file unit
m_next_cu = 0;
}
- collector_unit_t *find_ready() {
+ collector_unit_t *find_ready(bool sub_core_model, unsigned reg_id) {
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()) {
+ if ((*m_collector_units)[c].ready(sub_core_model, reg_id)) {
m_last_cu = c;
return &((*m_collector_units)[c]);
}
@@ -928,6 +928,8 @@ class opndcoll_rfu_t { // operand collector based register file unit
return NULL;
}
+ unsigned get_num_collectors(){return m_num_collectors;}
+
private:
unsigned m_num_collectors;
std::vector<collector_unit_t> *m_collector_units;