1. 개요1.1. Scoreboard의 구성1.2. 파이프라인 단계 2. 예시 Scoreboarding은 CDC 6600에서 도입한 비순차적 실행 기법이다. Tomasulo 알고리즘과는 달리, 비순차적 실행에 필요한 정보를 각 기능 단위에 흩어놓지 않고 Scoreboard에 모아서 관리하는 것이 특징이다.
1.1. Scoreboard의 구성
Scoreboard는 다음과 같은 정보를 저장해야 한다.- 명령어 상태(Instruction status) : 처리하고 있는 명령어가 파이프라인의 어느 단계에 있는지에 대한 정보.
- 기능 단위 상태(Functional Unit status) : 각 기능 단위가 어떤 상태인지를 나타내는 정보. 주요 정보는 다음과 같다.
- Busy : 이 기능 단위가 현재 사용 중인지의 여부를 표시하는 플래그.
- Op : Operation. 현재 기능 단위에서 처리하고 있는 연산.
- Fi : 이 기능 단위에서 현재 계산을 다 수행하면 값을 써야 할 목적지 레지스터의 번호
- Fj, Fk, ... : 현재 계산을 처리한 데 필요한 source 레지스터들의 번호.
- Qj, Qk, ... : 계산에 필요한 값을 받아 올 기능 단위에 대한 정보. 이 정보는 지금 기능 단위가 처리하고 있는 명령어가 읽어야 할 명령어의 처리가 아직 진행 중일 경우에 필요하다.
- Rj, Rk, ... : 각각 Fj, Fk, ... 의 값이 준비되었으나, 아직 현재 기능 단위가 읽지 않았음을 표시하는 플래그이다. 이는 현재 기능 단위가 읽기도 전에 다른 기능 단위가 레지스터에 있는 값을 덮어쓰지 않도록 하는 역할을 하여 WAR 위험을 해결한다.
- 레지스터 결과 상태(Register result status) : 레지스터마다, 만약 해당 레지스터에 쓰는 명령어가 처리 중이라면 그것이 어떤 기능 단위에서 값을 받아와야 하는지에 대한 정보.
1.2. 파이프라인 단계
Scoreboarding에서, 가져온(fetched) 명령어는 다음과 같은 파이프라인 단계들을 거치게 된다.- 발행(Issue) : 우선, 명령어를 해석하고, 만약 이 명령어를 발행한 후에 앞선 명령어들과의 구조 위험(structural hazard)이 있는지 확인한 후, 있다면 발행하지 않고 그렇지 않을 때까지 기다린다. 이 구조 위험 확인 때문에 명령어가 발행 단계를 거치는 것은 순차적이어야 한다. 또한 WAW 위험을 해결하기 위해, 이 명령어가 쓸 곳에 쓰는 다른 명령어가 아직 처리 중이라면 발행하지 않는다.
- 명령어를 발행하게 되면, 사용하는 기능 단위에 해당하는 Scoreboard의 Busy를 Yes로 표시하고, Op, Fi, Fj, Fk에 대한 정보를 채운다. 레지스터 결과 상태를 확인하여, 이 명령어가 읽어야 할 각 레지스터의 값이 어떤 다른 기능 단위에서 계산하고 있다면 그에 대한 정보를 대응되는 Qj, Qk, ...에 채우고 대응되는 Rj, Rk, ... 는 No로 설정한다. 아니라면 해당 레지스터에 값이 준비되어 있고 아직 기능 단위가 읽지 않았으므로 대응되는 Rj, Rk, ...는 Yes로 설정한다.
- 피연산자 읽기(Read Operand) : 피연산자들을 읽기 전에 RAW 위험을 해결하기 위해 피연산자들이 모두 준비될 때까지, 즉 모든 Rj, Rk, ... 가 Yes로 설정될 때까지 기다려야 한다.
- 피연산자들이 모두 준비되었으면, 레지스터들은 피연산자들을 읽고 Rj, Rk, ...는 모두 No로 설정한다.
- 실행(Execute) : 기능 단위가 연산을 수행한다. 이에 소요되는 시간은 연산의 종류에 따라 수 사이클에서 수십 사이클까지도 소요될 수 있다.
- 되쓰기(Write Back) : 결과를 레지스터에 쓰기 전에 혹시 쓰는 동작이 다른 곳에 필요한 결과를 덮어쓰는지를 확인하고, 만약 그렇다면 그렇지 않을 때까지 기다린다. 이로써 WAR 위험이 해결된다.
- 이 기능 단위의 결과가 필요한 기능 단위마다, 해당하는 Rj, Rk, ...를 Yes로 설정해 줌으로써 결과가 준비되었다는 걸 알려야 한다. 또한 레지스터에 값을 쓰면서 레지스터 결과 상태 역시 비워야 한다. 마지막으로, 이 기능 단위의 Busy를 No로 표시함으로써 다른 명령어들이 이 기능 단위를 사용할 수 있도록 한다.
Scoreboarding의 pseudocode (위키피디아)
위 설명만으로는 구체적인 동작 방식을 이해하기 쉽지 않으므로, 예시를 들어 한 사이클씩 그 동작을 설명한다. 표에는 각 사이클이 끝난 직후의 상태를 표시한다.
예시 원본
다음과 같은 명령어들을 처리하는 것을 생각해 보자. F0...F10은 부동소수점 레지스터이고, MUL, SUB, DIV, ADD는 각각 곱셈, 뺄셈, 나눗셈, 덧셈을 처리하는 명령어이다. 피연산자(operand)는 첫 번째가 목적지 레지스터를 지정하고, 나머지 둘은 계산하는 데 필요한 source 레지스터를 지정한다. LOAD의 경우, 해당하는 주소에서 값을 가져온다.
LOAD F6, 34+R2
LOAD F2, 45+R3
MUL F0, F2, F4
SUB F8, F6, F2
DIV F10, F0, F6
ADD F6, F8, F2
다음은 cycle 0일 때의 초기 상태이다. 첫 명령어인 LOAD가 발행되기 전이다. 명령어 상태에는 다음 완료해야 할 단계를 나타낸다.
[clearfix] 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | Issue |
LOAD F2, 45+R3 | |
MUL F0, F2, F4 | |
SUB F8, F6, F2 | |
DIV F10, F0, F6 | |
ADD F6, F8 | |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
- | - | - | - | - | - |
Functional Unit status 남은 시간 | 기능 단위 | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | No | | | | | | | | |
| Multiply | No | | | | | | | | |
| Add/Sub | No | | | | | | | | |
| Divide | No | | | | | | | | |
명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | R.O |
LOAD F2, 45+R3 | Issue |
MUL F0, F2, F4 | |
SUB F8, F6, F2 | |
DIV F10, F0, F6 | |
ADD F6, F8 | |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
- | - | - | Load/Store | - | - |
Functional Unit status 남은 시간 | 기능 단위 | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | Yes | Load | F6 | | R2 | | | | Yes |
| Multiply | No | | | | | | | | |
| Add/Sub | No | | | | | | | | |
| Divide | No | | | | | | | | |
첫 번째 LOAD가 발행되었다. Load/Store FU의 Busy가 Yes로 설정되고, 목적지 레지스터인 F6은 해당 FU에서 값을 가져와야 한다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | Exec |
LOAD F2, 45+R3 | Issue |
MUL F0, F2, F4 | |
SUB F8, F6, F2 | |
DIV F10, F0, F6 | |
ADD F6, F8 | |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
- | - | - | Load/Store | - | - |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | Yes | Load | F6 | | R2 | | | | No |
| Multiply | No | | | | | | | | |
| Add/Sub | No | | | | | | | | |
| Divide | No | | | | | | | | |
Load/Store FU가 이미 사용 중이므로 구조 위험에 의해 다음 LOAD가 발행되지 않는다. 첫 번째 LOAD는 피연산자 읽기가 완료되었고 Rk가 No로 설정된다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | W.B |
LOAD F2, 45+R3 | Issue |
MUL F0, F2, F4 | |
SUB F8, F6, F2 | |
DIV F10, F0, F6 | |
ADD F6, F8 | |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
- | - | - | Load/Store | - | - |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | Yes | Load | F6 | | R2 | | | | No |
| Multiply | No | | | | | | | | |
| Add/Sub | No | | | | | | | | |
| Divide | No | | | | | | | | |
첫 번째 LOAD의 실행이 완료되었다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | Issue |
MUL F0, F2, F4 | |
SUB F8, F6, F2 | |
DIV F10, F0, F6 | |
ADD F6, F8 | |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
- | - | - | - | - | - |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | No | | | | | | | | |
| Multiply | No | | | | | | | | |
| Add/Sub | No | | | | | | | | |
| Divide | No | | | | | | | | |
첫 번째 LOAD의 되쓰기까지 완료되었다. 레지스터에는 34+R2의 주소에 있던 값이 쓰였고, FU status와 Register result status는 다시 비워진다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | R.O |
MUL F0, F2, F4 | Issue |
SUB F8, F6, F2 | |
DIV F10, F0, F6 | |
ADD F6, F8 | |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
- | Load/Store | - | - | - | - |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | Yes | Load | F2 | | R3 | | | | Yes |
| Multiply | No | | | | | | | | |
| Add/Sub | No | | | | | | | | |
| Divide | No | | | | | | | | |
앞에서 구조 위험이 해소되어, 두 번째 LOAD가 발행되었다. 첫 LOAD때와 동일하다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | Exec |
MUL F0, F2, F4 | R.O |
SUB F8, F6, F2 | Issue |
DIV F10, F0, F6 | |
ADD F6, F8 | |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
Multiply | Load/Store | - | - | - | - |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | Yes | Load | F2 | | R3 | | | | No |
| Multiply | Yes | Mult | F0 | F2 | F4 | Load/Store | | No | Yes |
| Add/Sub | No | | | | | | | | |
| Divide | No | | | | | | | | |
Multiply 기능 단위는 Busy하지 않으니, 구조 위험이 없어 MUL이 발행되었다. 첫 LOAD는 피연산자 읽기가 완료되었다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | W.B |
MUL F0, F2, F4 | R.O |
SUB F8, F6, F2 | R.O |
DIV F10, F0, F6 | Issue |
ADD F6, F8 | |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
Multiply | Load/Store | - | - | Add/Sub | - |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | Yes | Load | F2 | | R3 | | | | No |
| Multiply | Yes | Mult | F0 | F2 | F4 | Load/Store | | No | Yes |
| Add/Sub | Yes | Sub | F8 | F6 | F2 | | Load/Store | Yes | No |
| Divide | No | | | | | | | | |
아직 MUL의 피연산자가 준비되지 않아, 피연산자 읽기 단계를 완료할 수 없다. LOAD가 실행되었고, SUB가 발행된다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | - |
MUL F0, F2, F4 | R.O |
SUB F8, F6, F2 | R.O |
DIV F10, F0, F6 | R.O |
ADD F6, F8 | Issue |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
Multiply | - | - | - | Add/Sub | Divide |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | No | | | | | | | | |
| Multiply | Yes | Mult | F0 | F2 | F4 | Load/Store | | Yes | Yes |
| Add/Sub | Yes | Sub | F8 | F6 | F2 | | Load/Store | Yes | Yes |
| Divide | Yes | Div | F10 | F0 | F6 | Multiply | | No | Yes |
LOAD는 되쓰기까지 완료하면서, 레지스터에 불러온 값을 다른 기능단위들이 필요로 하는지 보고 값이 준비되었다는 표시로 Rj, Rk를 Yes로 설정한다. DIV가 발행된다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | - |
MUL F0, F2, F4 | Exec |
SUB F8, F6, F2 | Exec |
DIV F10, F0, F6 | R.O |
ADD F6, F8 | Issue |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
Multiply | - | - | - | Add/Sub | Divide |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | No | | | | | | | | |
10 | Multiply | Yes | Mult | F0 | F2 | F4 | Load/Store | | No | No |
2 | Add/Sub | Yes | Sub | F8 | F6 | F2 | | Load/Store | No | No |
| Divide | Yes | Div | F10 | F0 | F6 | Multiply | | No | Yes |
MUL과 SUB의 피연산자 읽기가 완료되며, Rj와 Rk를 No로 설정한다. 필요한 값을 Multiply FU에서 받아 와야 하기 때문에 DIV는 피연산자 읽기 단계를 완료할 수 없다. SUB가 Add/Sub 기능단위를 사용 중이기 때문에 구조 위험이 해결될 때까지 ADD를 발행할 수 없다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | - |
MUL F0, F2, F4 | Exec |
SUB F8, F6, F2 | Exec |
DIV F10, F0, F6 | R.O |
ADD F6, F8 | Issue |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
Multiply | - | - | - | Add/Sub | Divide |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | No | | | | | | | | |
9 | Multiply | Yes | Mult | F0 | F2 | F4 | Load/Store | | No | No |
1 | Add/Sub | Yes | Sub | F8 | F6 | F2 | | Load/Store | No | No |
| Divide | Yes | Div | F10 | F0 | F6 | Multiply | | No | Yes |
MUL과 SUB가 계산되고 있다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | - |
MUL F0, F2, F4 | Exec |
SUB F8, F6, F2 | W.B |
DIV F10, F0, F6 | R.O |
ADD F6, F8 | Issue |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
Multiply | - | - | - | Add/Sub | Divide |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | No | | | | | | | | |
8 | Multiply | Yes | Mult | F0 | F2 | F4 | Load/Store | | No | No |
0 | Add/Sub | Yes | Sub | F8 | F6 | F2 | | Load/Store | No | No |
| Divide | Yes | Div | F10 | F0 | F6 | Multiply | | No | Yes |
SUB의 실행이 완료되었다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | - |
MUL F0, F2, F4 | Exec |
SUB F8, F6, F2 | - |
DIV F10, F0, F6 | R.O |
ADD F6, F8 | Issue |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
Multiply | - | - | - | - | Divide |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | No | | | | | | | | |
7 | Multiply | Yes | Mult | F0 | F2 | F4 | Load/Store | | No | No |
| Add/Sub | No | | | | | | | | |
| Divide | Yes | Div | F10 | F0 | F6 | Multiply | | No | Yes |
SUB는 되쓰기까지 완료되었다. 해당하는 부분을 비운다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | - |
MUL F0, F2, F4 | Exec |
SUB F8, F6, F2 | - |
DIV F10, F0, F6 | R.O |
ADD F6, F8 | R.O |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
Multiply | - | - | Add/Sub | - | Divide |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | No | | | | | | | | |
6 | Multiply | Yes | Mult | F0 | F2 | F4 | Load/Store | | No | No |
| Add/Sub | Yes | Add | F6 | F8 | F2 | | | Yes | Yes |
| Divide | Yes | Div | F10 | F0 | F6 | Multiply | | No | Yes |
구조 위험이 해결되어 ADD를 발행할 수 있다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | - |
MUL F0, F2, F4 | Exec |
SUB F8, F6, F2 | - |
DIV F10, F0, F6 | R.O |
ADD F6, F8 | Exec |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
Multiply | - | - | Add/Sub | - | Divide |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | No | | | | | | | | |
5 | Multiply | Yes | Mult | F0 | F2 | F4 | Load/Store | | No | No |
2 | Add/Sub | Yes | Add | F6 | F8 | F2 | | | No | No |
| Divide | Yes | Div | F10 | F0 | F6 | Multiply | | No | Yes |
ADD의 피연산자 읽기가 완료되었다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | - |
MUL F0, F2, F4 | Exec |
SUB F8, F6, F2 | - |
DIV F10, F0, F6 | R.O |
ADD F6, F8 | Exec |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
Multiply | - | - | Add/Sub | - | Divide |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | No | | | | | | | | |
4 | Multiply | Yes | Mult | F0 | F2 | F4 | Load/Store | | No | No |
1 | Add/Sub | Yes | Add | F6 | F8 | F2 | | | No | No |
| Divide | Yes | Div | F10 | F0 | F6 | Multiply | | No | Yes |
MUL과 ADD를 계산 중이다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | - |
MUL F0, F2, F4 | Exec |
SUB F8, F6, F2 | - |
DIV F10, F0, F6 | R.O |
ADD F6, F8 | W.B |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
Multiply | - | - | Add/Sub | - | Divide |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | No | | | | | | | | |
3 | Multiply | Yes | Mult | F0 | F2 | F4 | Load/Store | | No | No |
0 | Add/Sub | Yes | Add | F6 | F8 | F2 | | | No | No |
| Divide | Yes | Div | F10 | F0 | F6 | Multiply | | No | Yes |
ADD의 계산이 완료되었다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | - |
MUL F0, F2, F4 | Exec |
SUB F8, F6, F2 | - |
DIV F10, F0, F6 | R.O |
ADD F6, F8 | W.B |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
Multiply | - | - | Add/Sub | - | Divide |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | No | | | | | | | | |
2 | Multiply | Yes | Mult | F0 | F2 | F4 | Load/Store | | No | No |
| Add/Sub | Yes | Add | F6 | F8 | F2 | | | No | No |
| Divide | Yes | Div | F10 | F0 | F6 | Multiply | | No | Yes |
ADD가 써야 할 F6에 있는 결과를 DIV가 아직 읽지 못했으므로, ADD는 되쓰기 단계를 완료하지 못한다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | - |
MUL F0, F2, F4 | Exec |
SUB F8, F6, F2 | - |
DIV F10, F0, F6 | R.O |
ADD F6, F8 | W.B |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
Multiply | - | - | Add/Sub | - | Divide |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | No | | | | | | | | |
1 | Multiply | Yes | Mult | F0 | F2 | F4 | Load/Store | | No | No |
| Add/Sub | Yes | Add | F6 | F8 | F2 | | | No | No |
| Divide | Yes | Div | F10 | F0 | F6 | Multiply | | No | Yes |
MUL을 계산하고 있다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | - |
MUL F0, F2, F4 | W.B |
SUB F8, F6, F2 | - |
DIV F10, F0, F6 | R.O |
ADD F6, F8 | W.B |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
Multiply | - | - | Add/Sub | - | Divide |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | No | | | | | | | | |
0 | Multiply | Yes | Mult | F0 | F2 | F4 | Load/Store | | No | No |
| Add/Sub | Yes | Add | F6 | F8 | F2 | | | No | No |
| Divide | Yes | Div | F10 | F0 | F6 | Multiply | | No | Yes |
MUL의 계산이 완료되었다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | - |
MUL F0, F2, F4 | - |
SUB F8, F6, F2 | - |
DIV F10, F0, F6 | R.O |
ADD F6, F8 | W.B |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
- | - | - | Add/Sub | - | Divide |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | No | | | | | | | | |
| Multiply | No | | | | | | | | |
| Add/Sub | Yes | Add | F6 | F8 | F2 | | | No | No |
| Divide | Yes | Div | F10 | F0 | F6 | Multiply | | Yes | Yes |
MUL은 되쓰기까지 완료되면서, DIV에 필요한 다른 결과가 준비된다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | - |
MUL F0, F2, F4 | - |
SUB F8, F6, F2 | - |
DIV F10, F0, F6 | Exec |
ADD F6, F8 | W.B |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
- | - | - | Add/Sub | - | Divide |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | No | | | | | | | | |
| Multiply | No | | | | | | | | |
| Add/Sub | Yes | Add | F6 | F8 | F2 | | | No | No |
40 | Divide | Yes | Div | F10 | F0 | F6 | Multiply | | No | No |
이제 DIV는 피연산자 읽기 단계를 완료할 수 있다. 이로써 WAR 위험이 해결되게 된다. 명령어 상태 명령어 | 다음 |
LOAD F6, 34+R2 | - |
LOAD F2, 45+R3 | - |
MUL F0, F2, F4 | - |
SUB F8, F6, F2 | - |
DIV F10, F0, F6 | Exec |
ADD F6, F8 | - |
Register result status F0 | F2 | F4 | F6 | F8 | F10 |
- | - | - | - | - | Divide |
Functional Unit status 남은 시간 | FU | Busy | Op | Fi | Fj | Fk | Qj | Qk | Rj | Rk |
| Load/Store | No | | | | | | | | |
| Multiply | No | | | | | | | | |
| Add/Sub | No | | | | | | | | |
39 | Divide | Yes | Div | F10 | F0 | F6 | Multiply | | No | No |
ADD의 되쓰기까지 완료된다.