summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/abstract_hardware_model.h16
-rw-r--r--src/gpgpu-sim/shader.cc8
2 files changed, 19 insertions, 5 deletions
diff --git a/src/abstract_hardware_model.h b/src/abstract_hardware_model.h
index 4d2bb4c..ba32358 100644
--- a/src/abstract_hardware_model.h
+++ b/src/abstract_hardware_model.h
@@ -1320,12 +1320,24 @@ class register_set {
// for sub core model we need to figure which reg_id has the ready warp
// this function should only be called if has_ready() was true
assert(has_ready());
+ warp_inst_t **ready;
+ ready = NULL;
+ unsigned reg_id;
for (unsigned i = 0; i < regs.size(); i++) {
if (not regs[i]->empty()) {
- return i;
+ if (ready and (*ready)->get_uid() < regs[i]->get_uid()) {
+ // ready is oldest
+ } else {
+ ready = &regs[i];
+ reg_id = i;
+ }
}
}
- abort();
+ return reg_id;
+ }
+ unsigned get_schd_id(unsigned reg_id) {
+ assert(not regs[reg_id]->empty());
+ return regs[reg_id]->get_schd_id();
}
void move_in(warp_inst_t *&src) {
warp_inst_t **free = get_free();
diff --git a/src/gpgpu-sim/shader.cc b/src/gpgpu-sim/shader.cc
index 895a2ef..5c27b9b 100644
--- a/src/gpgpu-sim/shader.cc
+++ b/src/gpgpu-sim/shader.cc
@@ -3976,19 +3976,21 @@ void opndcoll_rfu_t::allocate_cu(unsigned port_num) {
bool allocated = false;
unsigned cuLowerBound = 0;
unsigned cuUpperBound = cu_set.size();
+ unsigned schd_id;
if(sub_core_model) {
// Sub core model only allocates on the subset of CUs assigned to the scheduler that issued
unsigned reg_id = (*inp.m_in[i]).get_ready_reg_id();
+ schd_id = (*inp.m_in[i]).get_schd_id(reg_id);
assert(cu_set.size() % m_num_warp_scheds == 0);
unsigned cusPerSched = cu_set.size() / m_num_warp_scheds;
- cuLowerBound = reg_id * cusPerSched;
+ cuLowerBound = schd_id * cusPerSched;
cuUpperBound = cuLowerBound + cusPerSched;
- std::cout << "reg_id: " << reg_id << " cusPerSched: " << cusPerSched << " lowerBound: " << cuLowerBound << std::endl;
+ 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++) {
if (cu_set[k].is_free()) {
- std::cout << "Allocated on cu: " << k << std::endl;
+ std::cout << "Allocated schd_id: " << schd_id << " on cu: " << k << std::endl;
collector_unit_t *cu = &cu_set[k];
allocated = cu->allocate(inp.m_in[i], inp.m_out[i]);
m_arbiter.add_read_requests(cu);