changeset de6e9c30ad87 in /z/repo/m5 details: http://repo.m5sim.org/m5?cmd=changeset;node=de6e9c30ad87 description: inorder: remove request map, use request vector take away all instances of reqMap in the code and make all references use the built-in request vectors inside of each resource. The request map was dynamically allocating a request per instruction. The request vector just allocates N number of requests during instantiation and then the surrounding code is fixed up to reuse those N requests *** setRequest() and clearRequest() are the new accessors needed to define a new request in a resource
diffstat: src/cpu/inorder/cpu.cc | 7 +- src/cpu/inorder/pipeline_stage.cc | 1 + src/cpu/inorder/resource.cc | 153 ++++++++----------------- src/cpu/inorder/resource.hh | 21 ++- src/cpu/inorder/resources/agen_unit.cc | 4 +- src/cpu/inorder/resources/branch_predictor.cc | 2 +- src/cpu/inorder/resources/cache_unit.cc | 69 ++++------- src/cpu/inorder/resources/cache_unit.hh | 43 +++++- src/cpu/inorder/resources/decode_unit.cc | 4 +- src/cpu/inorder/resources/execution_unit.cc | 4 +- src/cpu/inorder/resources/fetch_seq_unit.cc | 6 +- src/cpu/inorder/resources/fetch_unit.cc | 29 +--- src/cpu/inorder/resources/graduation_unit.cc | 4 +- src/cpu/inorder/resources/inst_buffer.cc | 2 +- src/cpu/inorder/resources/mult_div_unit.cc | 18 +- src/cpu/inorder/resources/tlb_unit.cc | 53 +++----- src/cpu/inorder/resources/tlb_unit.hh | 15 +- src/cpu/inorder/resources/use_def.cc | 45 ++----- src/cpu/inorder/resources/use_def.hh | 16 +- 19 files changed, 214 insertions(+), 282 deletions(-) diffs (truncated from 1097 to 300 lines): diff -r 143fa8eed0e5 -r de6e9c30ad87 src/cpu/inorder/cpu.cc --- a/src/cpu/inorder/cpu.cc Fri Feb 18 14:28:22 2011 -0500 +++ b/src/cpu/inorder/cpu.cc Fri Feb 18 14:28:30 2011 -0500 @@ -324,12 +324,7 @@ tid, asid[tid]); - dummyReq[tid] = new ResourceRequest(resPool->getResource(0), - dummyInst[tid], - 0, - 0, - 0, - 0); + dummyReq[tid] = new ResourceRequest(resPool->getResource(0)); } dummyReqInst = new InOrderDynInst(this, NULL, 0, 0, 0); diff -r 143fa8eed0e5 -r de6e9c30ad87 src/cpu/inorder/pipeline_stage.cc --- a/src/cpu/inorder/pipeline_stage.cc Fri Feb 18 14:28:22 2011 -0500 +++ b/src/cpu/inorder/pipeline_stage.cc Fri Feb 18 14:28:30 2011 -0500 @@ -938,6 +938,7 @@ "\n", tid, inst->seqNum, cpu->resPool->name(res_num)); ResReqPtr req = cpu->resPool->request(res_num, inst); + assert(req->valid); if (req->isCompleted()) { DPRINTF(InOrderStage, "[tid:%i]: [sn:%i] request to %s " diff -r 143fa8eed0e5 -r de6e9c30ad87 src/cpu/inorder/resource.cc --- a/src/cpu/inorder/resource.cc Fri Feb 18 14:28:22 2011 -0500 +++ b/src/cpu/inorder/resource.cc Fri Feb 18 14:28:30 2011 -0500 @@ -43,7 +43,7 @@ reqs.resize(width); // Use to deny a instruction a resource. - deniedReq = new ResourceRequest(this, NULL, 0, 0, 0, 0); + deniedReq = new ResourceRequest(this); } Resource::~Resource() @@ -60,7 +60,7 @@ resourceEvent = new ResourceEvent[width]; for (int i = 0; i < width; i++) { - reqs[i] = new ResourceRequest(this, NULL, 0, 0, 0, 0); + reqs[i] = new ResourceRequest(this); } initSlots(); @@ -100,39 +100,28 @@ // Put slot number on this resource's free list availSlots.push_back(slot_idx); - // Erase Request Pointer From Request Map - std::map<int, ResReqPtr>::iterator req_it = reqMap.find(slot_idx); - - assert(req_it != reqMap.end()); - reqMap.erase(req_it); - + // Invalidate Request & Reset it's flags + reqs[slot_idx]->clearRequest(); } -// TODO: More efficiently search for instruction's slot within -// resource. int Resource::findSlot(DynInstPtr inst) { - map<int, ResReqPtr>::iterator map_it = reqMap.begin(); - map<int, ResReqPtr>::iterator map_end = reqMap.end(); - int slot_num = -1; - while (map_it != map_end) { - if ((*map_it).second->getInst()->seqNum == - inst->seqNum) { - slot_num = (*map_it).second->getSlot(); + for (int i = 0; i < width; i++) { + if (reqs[i]->valid && + reqs[i]->getInst()->seqNum == inst->seqNum) { + slot_num = reqs[i]->getSlot(); } - map_it++; } - return slot_num; } int Resource::getSlot(DynInstPtr inst) { - int slot_num; + int slot_num = -1; if (slotsAvail() != 0) { slot_num = availSlots[0]; @@ -142,24 +131,6 @@ assert(slot_num == *vect_it); availSlots.erase(vect_it); - } else { - DPRINTF(Resource, "[tid:%i]: No slots in resource " - "available to service [sn:%i].\n", inst->readTid(), - inst->seqNum); - slot_num = -1; - - map<int, ResReqPtr>::iterator map_it = reqMap.begin(); - map<int, ResReqPtr>::iterator map_end = reqMap.end(); - - while (map_it != map_end) { - if ((*map_it).second) { - DPRINTF(Resource, "Currently Serving request from: " - "[tid:%i] [sn:%i].\n", - (*map_it).second->getInst()->readTid(), - (*map_it).second->getInst()->seqNum); - } - map_it++; - } } return slot_num; @@ -206,7 +177,7 @@ inst->readTid()); } - reqMap[slot_num] = inst_req; + reqs[slot_num] = inst_req; try_request = true; } @@ -242,32 +213,21 @@ Resource::getRequest(DynInstPtr inst, int stage_num, int res_idx, int slot_num, unsigned cmd) { - return new ResourceRequest(this, inst, stage_num, id, slot_num, - cmd); + reqs[slot_num]->setRequest(inst, stage_num, id, slot_num, cmd); + return reqs[slot_num]; } ResReqPtr Resource::findRequest(DynInstPtr inst) { - map<int, ResReqPtr>::iterator map_it = reqMap.begin(); - map<int, ResReqPtr>::iterator map_end = reqMap.end(); - - bool found = false; - ResReqPtr req = NULL; - - while (map_it != map_end) { - if ((*map_it).second && - (*map_it).second->getInst() == inst) { - req = (*map_it).second; - //return (*map_it).second; - assert(found == false); - found = true; + for (int i = 0; i < width; i++) { + if (reqs[i]->valid && + reqs[i]->getInst() == inst) { + return reqs[i]; } - map_it++; } - return req; - //return NULL; + return NULL; } void @@ -281,9 +241,9 @@ Resource::execute(int slot_idx) { DPRINTF(Resource, "[tid:%i]: Executing %s resource.\n", - reqMap[slot_idx]->getTid(), name()); - reqMap[slot_idx]->setCompleted(true); - reqMap[slot_idx]->done(); + reqs[slot_idx]->getTid(), name()); + reqs[slot_idx]->setCompleted(true); + reqs[slot_idx]->done(); } void @@ -299,15 +259,10 @@ Resource::squash(DynInstPtr inst, int stage_num, InstSeqNum squash_seq_num, ThreadID tid) { - std::vector<int> slot_remove_list; + for (int i = 0; i < width; i++) { + ResReqPtr req_ptr = reqs[i]; - map<int, ResReqPtr>::iterator map_it = reqMap.begin(); - map<int, ResReqPtr>::iterator map_end = reqMap.end(); - - while (map_it != map_end) { - ResReqPtr req_ptr = (*map_it).second; - - if (req_ptr && + if (req_ptr->valid && req_ptr->getInst()->readTid() == tid && req_ptr->getInst()->seqNum > squash_seq_num) { @@ -322,16 +277,8 @@ if (resourceEvent[req_slot_num].scheduled()) unscheduleEvent(req_slot_num); - // Mark slot for removal from resource - slot_remove_list.push_back(req_ptr->getSlot()); + freeSlot(req_slot_num); } - - map_it++; - } - - // Now Delete Slot Entry from Req. Map - for (int i = 0; i < slot_remove_list.size(); i++) { - freeSlot(slot_remove_list[i]); } } @@ -366,8 +313,8 @@ Resource::scheduleEvent(int slot_idx, int delay) { DPRINTF(Resource, "[tid:%i]: Scheduling event for [sn:%i] on tick %i.\n", - reqMap[slot_idx]->inst->readTid(), - reqMap[slot_idx]->inst->seqNum, + reqs[slot_idx]->inst->readTid(), + reqs[slot_idx]->inst->seqNum, cpu->ticks(delay) + curTick()); resourceEvent[slot_idx].scheduleEvent(delay); } @@ -404,32 +351,10 @@ int ResourceRequest::maxReqCount = 0; -ResourceRequest::ResourceRequest(Resource *_res, DynInstPtr _inst, - int stage_num, int res_idx, int slot_num, - unsigned _cmd) - : res(_res), inst(_inst), cmd(_cmd), valid(false), stageNum(stage_num), - resIdx(res_idx), slotNum(slot_num), completed(false), - squashed(false), processing(false), memStall(false) +ResourceRequest::ResourceRequest(Resource *_res) + : res(_res), inst(NULL), stagePasses(0), valid(false), complSlotNum(-1), + completed(false), squashed(false), processing(false), memStall(false) { -#ifdef DEBUG - reqID = resReqID++; - res->cpu->resReqCount++; - DPRINTF(ResReqCount, "Res. Req %i created. resReqCount=%i.\n", reqID, - res->cpu->resReqCount); - - if (res->cpu->resReqCount > 100) { - fatal("Too many undeleted resource requests. Memory leak?\n"); - } - - if (res->cpu->resReqCount > maxReqCount) { - maxReqCount = res->cpu->resReqCount; - } - -#endif - - stagePasses = 0; - complSlotNum = -1; - } ResourceRequest::~ResourceRequest() @@ -442,6 +367,26 @@ } void +ResourceRequest::setRequest(DynInstPtr _inst, int stage_num, + int res_idx, int slot_num, unsigned _cmd) +{ + valid = true; + inst = _inst; + stageNum = stage_num; + resIdx = res_idx; + slotNum = slot_num; + cmd = _cmd; +} + +void +ResourceRequest::clearRequest() +{ + valid = false; + inst = NULL; + stagePasses = 0; +} + +void ResourceRequest::done(bool completed) { DPRINTF(Resource, "%s [slot:%i] done with request from " diff -r 143fa8eed0e5 -r de6e9c30ad87 src/cpu/inorder/resource.hh --- a/src/cpu/inorder/resource.hh Fri Feb 18 14:28:22 2011 -0500 +++ b/src/cpu/inorder/resource.hh Fri Feb 18 14:28:30 2011 -0500 @@ -221,9 +221,9 @@ const int latency; _______________________________________________ m5-dev mailing list m5-dev@m5sim.org http://m5sim.org/mailman/listinfo/m5-dev