본문 바로가기

학교공부/컴퓨터구조

컴퓨터구조 - 14(Predicated execution, Loop Unroll)

지금까지 정리하자면

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의 장º단점은?

 

 

장점

  1. A-> B or C로 이동할 시, Predicated Execution에서는 1 clock버리는 반면 Branch Prediction에서 못 맞추면 뒤에 모든 Pipeline flush 해야한다. 즉, prediction하기 힘든 경우 high performance and energy-efficient 기대 가능
  2. branch 보다 명령어 순서 바꾸기에 용이하다.

단점

  1. 적용시키기 힘들다.
    : predicated excution 방법은 static, 시스템이 실행되기전 compile단계에서 실행된다.
    : local, global history 방법은 dynamic, 시스템이 실행될 때 hw에서 기록하면서 실행된다.
    - 따라서 실제 실행되기전 compile 단계에서는 적용됐을 때 성능 가늠하기 힘들다.
  2.  당연한거지만 명령어 체계가 지원해야됨 MIPS(X), ARM(O)
  3.  조건문안에 명령어가 너무 많을 경우 Prediction보다 위험도가 높다.
    : 만약 B나 C에 명령어가 30개씩 있다고 가정하면 branch prediction에 실패해도 5개를 날리는 반면 계속 30개씩 명령어를 날리므로 오히려 손해일 수 있다.
  4. 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문에 부분적으로 사용가능한데 암튼 쓸만한 방법임