Rename Development Discussion #39
Replies: 5 comments 8 replies
-
Not sure I follow your question. Rename does not send any credits to Dispatch. Dispatch will continue to drain and send credits back to Rename, but unless Rename has resources to actually rename the instructions it has, it will remain asleep. Your test plan is looking good!
Not in Sparta nor in the examples, unfortunately. For the Rename test, I recommend you implement a TesterUnit that takes parameters, such as
The number of entries in the FreeList corresponds to the number of outstanding instructions past rename. So, if you can have 100 instructions outstanding, but only have 50 freelist renames, you'll definitely stall. |
Beta Was this translation helpful? Give feedback.
-
Rename keeps track of the downstream credits given to it by Dispatch. When Rename renames an instruction and sends it to Dispatch, it will decrement it's local credit count. Dispatch will send an update to that number when Dispatch has room to accept new instructions. As an example, at the beginning of simulation, Dispatch will send, say 9 credits to Rename (meaning Dispatch has room in its buffers for 9 instructions). Rename locally caches that number and decrements it when it sends instructions to Dispatch. So, if the machine width is 3 and Rename successfully renames 3 instructions, it will decrement that local credit count by 3 -> 6. Unless Dispatch sends credits back to Rename in the next cycle, that number will remain at 6.
After Rename, there are instructions in Dispatch (D) and instructions in Retire (R) since Dispatch appends to Retire when it dispatches. So the total number of instructions past rename is D + R. If each instruction writes to a destination of the same register file type, that would be D+R renames of that register file type outstanding. Of course, this is assuming the Retire block is stalled on the oldest instruction for a long time (like a load to main memory).
I took a look at your fork and a couple of comments:
|
Beta Was this translation helpful? Give feedback.
-
I'm working on the operand dependency checking in ExecutePipe and LSU, is there any difference between LSU and ExecutePipe for operand dependency checking? In either case, we check for operand readiness via scoreboard views, if they're not ready we do a |
Beta Was this translation helpful? Give feedback.
-
Do we have any existing experimental data gathered using olympia changing num_integer_rename param to see effect of register renaming on existing workloads such as dhrystone / coremark? |
Beta Was this translation helpful? Give feedback.
-
Is there any reason why reference counters are used for Rename. It should be enough to release a register when the instruction that remaps it retires? Or am I missing something? |
Beta Was this translation helpful? Give feedback.
-
Continuing the email discussion around the stalling of rename:
"When you receive a group of instructions from Decode and you do not have any renames, you must stall (i.e. do not send credits back to Decode). Rename will “sleep” until it receives retired instructions from the ROB and reclaims Renames. If enough renames have been collected to service the given instruction group from Decode, Rename starts up renaming (and sends credits back to Decode for each instruction renamed)."
Would the dispatch credits/instructions being sent from rename also need to be stalled?
Regarding a "smarter" test plan:
Ideally I would like to test:
One instruction -> PRF assigned -> reference counter updated -> retired -> PRF added back to free list -> reference counter updated
Two instructions -> RAW dependency -> PRF assigned -> reference counter updated (make sure the source uses the PRF and not the ARF)-> retired -> PRF added back to free list -> reference counter updated
Fill freelist -> (this one might have to be implemented later, as due to the current nature, the freelist doesn't get filled, as we aren't checking for dependencies yet, and thus we're not hitting stalls that could lead to a freelist being empty) Fill the freelist -> check that no instruction group is processed -> check dispatch/decode credits aren't incremented
Reference_counter -> Have a couple of instructions reference a destination PRF, once all the instructions retire, reference_counter should be 0, and PRF should be freed.
Is there an example of how to test a module at such a fine grain level, such as the ones in SPARTA? Also, does my logic from above around the freelist never being empty due to the current OOO nature of Olympia, pass through without true operand dependency correct? When I run on the example dhrystone trace I never hit the freelist being empty, but I wanted to double check as I could've made an error in my implementation.
Beta Was this translation helpful? Give feedback.
All reactions