Quote:
0026]In certain instances, the processing pipeline 200 may be processing only a single thread. In this case, the instruction dispatch module 210 can be configured to dispatch integer instruction operations associated with the thread to both integer execution units 212 and 214 based on a predefined or opportunistic dispatch scheme. Alternately, the instruction dispatch module 210 can be configured to dispatch integer instruction operations of the single thread to only one of the integer execution units 212 or 214 and the unused integer execution unit can be shut down or otherwise disabled so as to reduce power consumption. The unused integer execution unit can be disabled by, for example, reducing the power supplied to the circuitry of the integer execution unit, clock-gating the circuitry of the integer execution unit, and the like.
[0027]The implementation of multiple integer execution units that execute in parallel and share the same front-end unit 202 facilitates accelerated execution of a single thread through collaboration between the integer execution units. The integer execution units 212 and 214 can be used to implement a run ahead scheme whereby the instruction dispatch module 210 dispatches memory-access operations (e.g., load operations and store operations) to one integer execution unit while dispatching non-memory-access operations to the other integer execution unit. To illustrate, the front-end unit 202 can fetch and decode instructions associated with a thread such that load instructions later in the program sequence of the thread are prefetched and dispatched to one of the integer execution units for execution while the other integer execution unit is still executing non-memory-access instructions at an earlier point in the program sequence. In this way, memory data will already be prefetched and available in a cache (or already in the process of being prefetched) by the time one of the integer execution units prepares to execute an instruction dependent on the load operation.
[0028]Another example of a collaborative use of the integer execution units 202 and 204 is for an eager execution scheme whereby both results of a branch in an instruction sequence can be individually pursued by each integer instruction unit. When the correct branch is determined, the integer instruction unit that was tasked with the branch that ultimately was correct can transfer its state to the other integer instruction unit and both integer instructions can then be used for execution of the program stream of the thread. Table 1 illustrates an example eager execution of instructions of a thread:
TABLE-US-00001 TABLE 1 Eager Execution Example Section Instructions A add r1, r2, r1 cmp r1, r3 jne next B add r3, 3, r6 . . . mov r6, r3 C next: add r3, 6, r1 . . .
[0029]As illustrated by Table 1, instruction section A represents the instruction sequence leading to and including the conditional jump instruction (jne), the instruction section C represents the instruction sequence that follows if the jump is taken, and the instruction section B represents the instruction sequence between the conditional jump instruction and the target of the conditional jump instruction (next). In this example, the front-end unit 202 could dispatch the instruction sequence represented by sections A and B (i.e., the program flow in the event that the jump is not taken) to the integer execution unit 212 and dispatch the instruction sequence represented by sections A and C (i.e., the program flow in the event that the jump is taken) to the integer execution unit 214. In the event that it is ultimately determined that the jump is to be taken, the state of the integer execution unit 214, having been executing the correct path, can be transferred to the integer execution unit 212. Conversely, in the event that that it is ultimately determined that the jump is not to be taken, the state of the integer execution unit 212, having been executing the correct path, can be transferred to the integer execution unit 212. More detailed eager execution implementations are described below with reference to FIGS. 6 and 7.
[0030]As yet another example, the integer execution units 212 and 214 can be used collaboratively to implement a reliable execution scheme for a single thread. In this instance, the same integer instruction operation is dispatched to both integer execution units 212 and 214 for execution and the results are compared by, for example, the thread retirement modules 226 of each integer execution unit. In the event that the results match, the results of the integer instruction operation are deemed reliable and execution of the next instruction operation proceeds. Otherwise, if there is a mismatch between the results of execution of the same integer instruction operation, the results are deemed unreliable and corrective action is taken, such as by issuing an exception or other interrupt, by executing the integer instruction operation again, etc.
As for this: