4.6 An Overview of Pipelining

각 단계마다 별개의 자원을 가지고 있으면 작업들을 파이프라이닝할 수 있다.

Pipelining improves throughput of our laundry system. Hence, pipelining would not decrease the time to complete one load of laundry, but when we have many loads of laundry to do, the improvement in throughput decreases the total time to complete the work.

모든 단계가 대략 동일한 시간을 소요하고 할 일이 충분하면, 파이프라인으로 인한 speed-up은 파이프라인의 단계 수와 같다. 할 일의 수가 파이프라인 단계 수에 비해 많지 않을 경우에는 이 같은 시작 시간과 마무리 시간이 성능에 영향을 미친다.

단계들이 완벽하게 균형 잡혀 있지 않고, 파이프라니잉은 어느 정도의 오버헤드를 유발하기 때문에 파이프라인 프로세서의 명령어당 시간이 가능한 최소 값보다 커져서 속도 향상은 파이프라인 단계 수보다 작아진다.

RISC-V가 pipelining에 유리한 이유

forwarding 계산법

lw x2, 4(x31)
add x3, x2, x1
sw x3, 12(x31)

[공식] load의 rd를 직후 명령어에서 rs로 받으면 load-use data hazard 발생 → 1 stall 추가

pipelining 제약: 앞 명령어가 n단계일 때 뒤 명령어는 n-1 단계를 실행해야 한다.

add 명령어에서 적어도 3단계(EX) 때 x2의 값이 필요하다. 같은 사이클에서 lw 명령어는 4단계(MEM)이므로 x2를 전달해줄 수 없다. 적어도 5단계(WB) 실행 중에나 forwarding으로 add 명령어 3단계(EX)에 x2 값을 전해줄 수 있다. 연이은 명령어 사이에 단계 차이가 2이므로 한 단계 forwarding과 stall 하나가 발생한다.

add 명령어에서 5단계(WB)에 x3를 쓰면 sw 명령어 2단계(RF) 단계에서 그 x3를 읽지 못하므로 forwarding이 필요하다. add 명령어에서 sw 명령어에 x3 값을 줄 수 있는 건 3단계(EX) 끝나고 4단계(MEM) 시작부터이다. sw 명령어가 x3 값이 필요한 건 3단계(EX) 끝나고 4단계(MEM) 시작 때이므로 add 명령어 5단계(WB) 전 레지스터가 sw 명령어 4단계(MEM) 전 레지스터에 forwarding 된다. 연이은 명령어 사이에 단계 차이가 1이므로 stall은 없다.

add 명령어에서 “4단계 전” 대신 “5단계 전” 레지스터를 forwarding하는 이유: 물리적으로 forwarding은 같은 시점 내에서 다른 명령어가 사용하는 레지스터끼리 가능

<aside> 📌

forwarding이나 stall 발생 계산할 때 “단계 끝” 기준으로 통일해서 생각하자.

</aside>

image.png