안 씀/컴퓨터구조

파이프라이닝 pipelining(1)

unhyepnhj 2024. 11. 4. 21:39

파이프라이닝이란 동시에 여러 명령어를 실행하여 명령어 처리 효율을 높이는 기법이다.

 

많이들 사용하는 빨래 예시로 설명해 보겠다.

 

빨래를 하는 과정은 세탁기 돌리기, 건조기 돌리기, 빨래 개기, 빨래 넣기의 4단계로 이루어져 있는데, non-pipelined 방식으로 빨래를 하면 다음과 같다.

sequential laundry

 

하지만 실제로 이렇게 빨래를 하는 사람은 거의 없을 것이다. 보통은 빨래가 돌아가는 동안 빨래를 개는 등 작업을 병행하는데, 이것이 바로 파이프라이닝이다.

pipelined laundry

 

위 예시에서 각 단계별로 1시간이 소요되므로, n개의 빨래 더미(load)와 빨래를 끝마치는 데 필요한 작업의 수(task) k에 대한 총 작업 소요 시간은

 

\(\text{without pipelining: }kn\)

\(\text{with pipelining: }k-1+n\)

 

이므로, load가 무한일 경우 파이프라이닝 기법을 사용했을 때 속도는 \( \displaystyle \lim_{n \to \infty }\frac{kn}{k-1+n}=k\)만큼 증가한다. 명령어 개수가 무한에 가까워질수록 파이프라이닝 기법을 사용하면 task의 개수만큼 속도가 빨라지는 것이다.

 

CPU에서도 위 예시를 그대로 적용할 수 있다. CPU는 명령어를 실행하기 위해 IF, ID, EX, MEM, WB의 5단계를 거치는데 (이제부터 RISC-V 기준으로 설명할 것이다) , 자세한 내용은 아래와 같다.

  • IF: Instruction Fetching
  • ID: Instruction Decoding & register reading
  • EX: EXecute operation or calculate address
  • MEM: access memory operand; read from memory/write on memory
  • WB: Write Back(write result back to register)

파이프라이닝을 위해 substages를 나눌 때는 소요 시간이 가장 긴 stage를 기준으로 하는 것이 중요하다. lw, sw, R-format(add, sub, etc.), beq를 수행하는 데 시간이 표와 같이 소요된다 할 때, 가장 긴 stage가 200ps이므로 이를 기준으로 stage를 결정하는 것이다.

single-cycle(Tc=800ps)
pipelined(Tc=200ps)

 

이처럼 파이프라이닝을 사용했을 때 처리할 명령어의 개수가 증가할수록 수행 효율이 좋아지지만(작업의 수 \(k\)배에 근접), 각 명령어의 실행 시간 자체를 단축하는 것은 아님에 주의해야 한다. 명령어를 빠르게 처리하는 것이 아니라, 명령어의 처리 시간은 동일하되 이를 중첩하여 전체 수행 시간을 단축하는 것이다.

파이프라이닝: 각 명령어의 처리 시간을 단축하지 않고 전체 데이터 처리량을 향상

 

더불어, 앞서 설명했듯 \(\text{Time Between Piplined Instructions}=\frac{\text{Time Between Nonpipelined Instructions}}{\text{Number of Stages}}\)이지만, 이 또한 모든 단계가 완벽하게 balanced될 경우에 가능하고, 그렇지 않다면 속도 증가율은 감소한다.

pipelined execution representation