|
|
|
|
|
|
|
of the execution of a sequence of blocks of instructions that always execute together. The block is initiated by a target of a branch instruction and is concluded by a branch instruction. Since an unconditional branch is always executed without altering the sequence of instruction execution, i.e., the instructions that are its predecessors or successors, it is a member of such a block. These blocks of instructions are called basic blocks1 (or branch subsets [302]). The last instruction in a basic block is always a branch instruction (conditional), called the trailing branch. Most algorithms for out-of-order instruction execution, or concurrent instruction execution, execute instructions only within a basic block. More complex algorithms have been developed to detect instruction concurrency between basic blocks [282, 302]. |
|
|
|
|
|
|
|
|
2. Resource Dependency. The last type of dependency that can occur among instructions is contention for a physical resource. For example: |
|
|
|
 |
|
|
|
|
While these instructions have no data dependencies or procedural dependencies, they both require the use of a divide unit. Since divide is a relatively infrequent operation, it is unlikely that a processor could accommodate two sequential divide operations without encountering a resource contention. Unfortunately, it is in the nature of code that resource requirements are not uniformly distributed across code segments. The probability of a relatively rare operation increases, given that there has already been a recent request for such an operation. |
|
|
|
|
|
|
|
|
1. Floating-point resources. After a sequence of integer operations to get addresses' base and index values, there may be multiple (presumably independent) floating-point operations requesting respective resources. Contention is usually highest for ADD.F and MPY.F resources. |
|
|
|
|
|
|
|
|
2. Load and store resources. Here, cache bandwidth is a limit as multiple instructions access (presumably independent) data operands. Contention occurs as a result of multiple DFs in the same cycle. |
|
|
|
|
|
|
|
|
7.6.4 When and How to Detect Instruction Concurrency |
|
|
|
|
|
|
|
|
There are three related issues here: |
|
|
|
|
|
|
|
|
1. Detecting concurrency. |
|
|
|
|
|
|
|
|
2. Dispatching concurrent instructions. |
|
|
|
|
|
|
|
|
3. Scheduling execution of concurrent instructions. |
|
|
|
 |
|
 |
|
|
1Sometimes compilers restrict the notion of basic block to instruction sequences that end in a branch of any type. For the run-time environment considered here, such restrictions are unnecessary. |
|
|
|
|
|