Issue Queue Design #115
Replies: 3 comments 1 reply
-
Your separation of work between the issue queue and the execution pipe is right on target. When you initialize the execution components in Execute.cpp's factory, you will be creating the IssueQueues and the ExecutePipe instances. Then, by using the extensions from the topology yaml files, you will bolt IssueQueues to the ExecutePipes. The IsssueQueues will be cognizant of target pipes it supports, but may not know which ExecutePipe assigned to it supports that pipe. You can create a map of instruction pipe target -> 1+ ExecutePipe OR you can round-robin walk the assigned pipes for which one can take the given instruction. Here's an example of how you can do this... Start with a new YAML description that is based on the
What you can assume from the above layout:
You need to come up with a different set of YAML parameters that dictate IQ -> Pipe associativity. I'll leave that up to you. 😉 In Execute.cpp, two methods:
At this point, each IssueQueue has direct access to the public API for the ExecutePipe. The IQ can now do this:
There are other ways to do this. Think "best performance" when you implement this. |
Beta Was this translation helpful? Give feedback.
-
@klingaard,
|
Beta Was this translation helpful? Give feedback.
-
@klingaard,
|
Beta Was this translation helpful? Give feedback.
-
The addition of an Issue Queue unit will allow users to define Issue Queue topology of which execution units are mapped to a certain Issue Queue. The current implementation has a one to one relationship, where each execution unit has it's own issue queue (
ExecutePipe
is really the issue queue), and there is no way to map multiple execution units to one issue queue.Proposed Implementation:
IssueQueue Design
getInstsFromDispatch_()
pulls instruction, checks if sources are ready, if so callsissueInsts_()
->issueInsts_()
gets the issue queue with the least amount of instructions, lets say integer_issue_queue_0 is least filled, is inserted into queue ->arbitrate_alu()
where we have alu0 as busy, but alu1 is not busy, so we send it there -> ExecutePipe'sprepExecute_()
function is called, sets status to scheduled, marks the ALU as busy.ExecutionPipe
attached that handles any setting of statuses.Questions:
getInstsFromDispatch_()
andissueInst_()
to IssueQueue, so that would leavecompleteInst_()
andflushInst_()
in ExecutePipe (should we be moving those over to IssueQueue as well?). My thoughts are to rewriteissueInst_()
to handle arbitration logic of which issue queue we should allocate to, so when we say an instruction is "issued", it is placed in an issue queue, but not scheduled to be executed (which the current implementation ofissueInst_()
does.issueInst_()
currently does should be moved to ExecutePipe, but do we then have an event triggered when an entry is inserted into an issueQueue to issue to a specific ALU (arbitrate_alu()
as described in above example flow)? If no ALUs are ready, we then schedule a callback?Beta Was this translation helpful? Give feedback.
All reactions