#Branch Hazards
파이프라인에서 다음 명령 시퀀스들을 실행하는 것을 고려해보자.
- beq가 ID stage로 갈때:
- 44번으로 instruction를 가져와야 할까?
- $1 == $3인지에 따라 다음에 실행될 수도 있고 실행되지 않을 수도 있다
- 어쨌든 우리는 아직 branch target 명령의 주소를 모른다
beq가 ID 단계에 들어가면 우리는 그것이 conditional branch인지도 모른다.
그리고 beq가 EX가 끝날 때까지 branch를 가져가야 하는지 알 수 없다.
따라서 우리는 이미 다음 (순차적인) instruction을 가져왔을 것이다
#Stalling for Branch Hazards
branch를 가져갈지 알 때까지 stall을 사용하면된다. beq가 MEM 단계에 도달하기 전에는 해당 정보에 대해 조치를 취할 수 없다.
#Stalling Until Branch Decision
branch를 가져갈지 알 때까지 stall을 삽입.
하지만 그렇게 까지 하기위해선 (CPU / 메모리) 비용이 많이든다. 만약 우리가 branch를 받지 않는다면, 우리는 불필요하게 2 사이클 동안 and instruction을 지연 시켰다.
#Rollback for Branch Hazards
branch를 빼앗기지 않을 것처럼 진행하면 된다. 틀리면 mis-fetched instruction들은 nops로 바꾸면 된다
#여기서 질문
branch decision이 더 빨리 내려질 수 있도록 데이터 경로를 재조정할 수 있을까?
branch target 주소를 계산하는 것은 어떨까? 그건 ID 단계에서 할 수 있을까?
레지스터 비교는 어떤가? 그건 ID 단계에서 할 수 있나?
다른 종류의 conditional branch(예: bgez)는 어떨까?
#Making Branch Decisions Earlier
branch를 가져간 경우 stall하고, 그렇지 않은 경우 정상적으로 진행하면된다
이제 비용은 branch를 가져간다면 하나의 stall이고, branch를 가져가지 않았다면 아무것도 아니다.
간단한 하드웨어는 두 레지스터를 비교하기에 충분하다. branch adder은 비교적 쉽게
우리는 beq가 EX 단계에 도달하기 전에 브랜치를 가져갈지 여부를 결정할 수 있다. 하지만 우리는 또한 한 사이클을 위한 스톨을 만들어야 한다
#Stall-on-Branch
- beq 명령을 디코딩할 때마다:
- 우리는 beq에 따르는 지시를 지연시킬 필요가 있다
- 우리는 ID 단계의 지시를 nop으로 바꿀 수 있는 능력이 있다
- 하지만 우리는 beq를 디코딩한 후에 그 한 사이클을 트리거해야 한다
#The Big (but not quite final) Picture
#Data Hazards for Branches
beq의 비교 레지스터가 2차 또는 3차 선행 R-type 명령의 대상인 경우. stall 없이 fowarding을 사용하여 해결할 수 있다
비교 레지스터가 바로 앞의 형식 명령 또는 두 번째 선행 load 명령의 대상인 경우. 1사이클 동안 beq를 stall해야 한다
비교 레지스터가 바로 앞의 로드 명령의 대상인 경우 2사이클 동안 stall해야 한다
- 따라서 최신 버전의 데이터 경로에는 더 많은 수정이 필요하다:
- 이러한 위험은 ID 단계에서 새로운 하드웨어에 의해 감지되어야 한다
- 실제 포워딩(대체) 작업도 ID 단계에서 새로운 하드웨어가 필요하다.
- 이러한 해저드를 다루는 것은 lw와 마찬가지로 지연을 필요로 하지만
- 만약 write instruction이 beq보다 한 사이클 앞이라면 우리는 두 번의 stall 사이클이 필요하다.
- 또한 write instruction이 beq보다 두 사이클 앞서 있다면 우리는 하나의 stall 사이클이 필요하다.
'Computer Science > Computer Organization' 카테고리의 다른 글
[Lecture 19] Virtual Memory: Hardware and Performance (1) | 2022.11.12 |
---|---|
[Lecture 16] Cache Memory (0) | 2022.11.11 |
[Lecture 15] Memory Hierarchy / Cache Memory and Performance (1) | 2022.11.11 |
[Lecture 8] Computer Performance (0) | 2022.11.09 |