지금까지 정리하자면
branch는 프로그램의 15%~25% 차지할 정도로 자주 쓰이는 명령어임.
근데 이 구조상 branch 자주 쓰면 클락 낭비되고 암튼 별로임.
그래서 이 명령어를 효율적으로 사용하기위한 여러 방법들이 생겨남
지금까지 stall, backward taken forward not taken , branch delay slot , branch prediction을 배웠음.
이번에 배울 건 Predicated execution, Loop Unroll 이라는 방법이다. 전에 배운게 branch를 예측하는거라면
오늘의 테마는 branch를 없애보자 이다.
Predicated Execution이란?
: branch를 없애고, 각 명령어가 predicate bit을 갖고 알맞게 실행한다.
predicated code는 조건부 실행을 위한 field가 존재한다.
ARM ISA는 앞에 condition을 위한 4bit 할당
cond 따라 여러 조건부 실행 지정할 수 있다. 조건에 맞지않으면 nop로 지정해서 무시한다.
Predicated Execution의 장º단점은?
장점
- A-> B or C로 이동할 시, Predicated Execution에서는 1 clock버리는 반면 Branch Prediction에서 못 맞추면 뒤에 모든 Pipeline flush 해야한다. 즉, prediction하기 힘든 경우 high performance and energy-efficient 기대 가능
- branch 보다 명령어 순서 바꾸기에 용이하다.
단점
- 적용시키기 힘들다.
: predicated excution 방법은 static, 시스템이 실행되기전 compile단계에서 실행된다.
: local, global history 방법은 dynamic, 시스템이 실행될 때 hw에서 기록하면서 실행된다.
- 따라서 실제 실행되기전 compile 단계에서는 적용됐을 때 성능 가늠하기 힘들다. - 당연한거지만 명령어 체계가 지원해야됨 MIPS(X), ARM(O)
- 조건문안에 명령어가 너무 많을 경우 Prediction보다 위험도가 높다.
: 만약 B나 C에 명령어가 30개씩 있다고 가정하면 branch prediction에 실패해도 5개를 날리는 반면 계속 30개씩 명령어를 날리므로 오히려 손해일 수 있다. - 100% 예측 가능한 branch면 오히려 손해
- 결론 쓸 수 있는 모든 방법 다써라 되는대로.
Loop Unrolling 이란?
# 1
for i in range(0,16):
data[i] = i
#2
for i in range(0,4):
data[i] = i
data[i+1] = i+1
data[i+2] = i+2
data[i+3] = i+3
위 두 코드는 같은 의미. branch를 줄이고 명령어를 늘리자. 그럼 for문 왜씀?
근데 그럼 1) 코딩하기 귀찮아 지고, 2) 명령어가 많아지니, 실행 시 메모리에 올라가는 명령어수 많아진다.
그래서 cpu가 푼다! cpu가 for문 보면 명령어 queue안에서 동적으로 풀어서 반복한다. 그럼 branch도 줄이면서 명령어 개수도 줄이는 좋은 방법이다.
for문이나 while문에 부분적으로 사용가능한데 암튼 쓸만한 방법임
'학교공부 > 컴퓨터구조' 카테고리의 다른 글
컴퓨터구조 16 - Multithreading (1) | 2020.06.17 |
---|---|
컴퓨터구조 15 - SuperScalar (0) | 2020.06.17 |
컴퓨터구조 13 - Branch Prediction (0) | 2020.06.16 |
컴퓨터구조 12 - Branch Prediction (0) | 2020.06.15 |
컴퓨터구조 10,11 - Pipeline Hazards (2) | 2020.06.15 |