-
항상 branch가 되지 않은 것(not taken)으로 간주하면 됌!
- PC + 4로 PC 값을 업데이트
- 만일 예측이 틀리다면, pipeline에서 예측된 명령어를 취소하고, branch의 실제 타겟에 맞는 PC값으로 업데이트

예시를 보면 쉽게 이해할 수 있다!


- IF/ID → 0으로 만들어서 뒤에 stage들을 실행하지 않도록함**( Flush !)**

-
Flush(명령어 취소)는 어떻게 이루어지나?
-
More-Realistic Branch Prediction
- Static Branch Prediction : 정적 분기 예측
- 정의 : 특정 branch 명령어의 동작 패턴을 사전에 정의하고, 이에 따라 결과를 예측한다.
- perfect하지 않다. (outcome을 중간에 바꾸지 x)
- 예시
- Loop(for, while) → Bachward branches : taken
- n번의 루프 → 1번(마지막루프) not taken, n-1번 taken ⇒ n=100이라면 99% 예측 성공
- If-else → Forward branches : not taken
- loop → imm = 음수 / if-else → imm = 양수
- Dynamic branch prediction : 동적 분기 예측
- 정의 : 하드웨어가 현재 프로그램의 branch 동작을 모니터링하여 최근 branch결과를 기록하고 이것을 기반으로 outcome를 예측한다.
- Branch Prediction Buffer
- 이를 통해 최근 명령어 주소가 인덱싱되고, branch 결과를 기록함(taken인지 not taken인지)
- 새로운 branch를 마주하게 되면
- table(buffer)를 체크하여 결과를 예측하고, 맞다면 타겟 명령어를 fetch 틀리다면 flush and 예측을 뒤집는다(not t → t / t → not t)
-
Branch Prediction Buffer 자세하게 살펴보자
- not taken → 0 / taken → 1로 표현 (1 bit 표현, 기본은 0)

-
1 bit predictor
- 1개의 비트로 not taken / taken을 구분하는 방법
- 반복문의 맨 처음과 맨 뒤가 무조건 예측 실패임!


-
2-Bit Predictor
- 00 : Strongly Predict Not Taken (강하게 분기하지 않을 것으로 예측) → not taken 예측
- 01 : Weakly Predict Not Taken (약하게 분기하지 않을 것으로 예측) → not taken 예측
- 10 : Weakly Predict Taken (약하게 분기할 것으로 예측) → taken 예측
- 11 : Strongly Predict Taken (강하게 분기할 것으로 예측) → taken 예측
- taken 과 not taken의 경계를 2분법이 아닌 중간 단계를 만들어 나눈 느낌
- 밑의 그림을 참고해서 이해!
- 00에서 taken이라면 01로 변경 → 또 taken이라면 10으로 변경

- 위의 1bit predictor에서 안 좋은 결과에 대입해보면

-
buffer
-
memory 사이즈 > prediction buffer 사이즈
- 여러 명령어가 하나의 buffer entry에 매핑됨

-
분기 타겟 계산
-
Multiple issue (여태까지 1cycle에 1개의 single 명령어 실행)
-
MIPS with Static Dual Issue 두 명령어 동시 실행