SEQ 방식의 명령 수행

기존의 SEQ는 한 클럭 주기당 하나의 명령어만을 수행합니다.

 

(a)의 하드웨어에서 하나의 명령어를 수행한다면

Combinational logic에서 300ps(s/조)가 소요되고

clock에 의해 register에 값을 쓰는데에 20ps가 소요되어 결과적으로 320ps가 소요됩니다.

 

(a)의 하드웨어로 I1, I2, I3를 수행한다면

I1 I2 I3, 3개의 명령어를 수행하므로 320 * 3 = 960ps가 소요됩니다.

 

SEQ 성능 측정

성능측정을 위한 두 가지 개념이 있습니다.

 

Latency of SEQ

하나의 명령어가 수행되는 시간으로 Latency(지연시간)을 표현합니다.

즉, SEQ의 Latency는 320ps입니다.

 

Throughput of SEQ

1초당 수행되는 명령어의 개수로 Throughtput(처리량)을 표현합니다.

위의 SEQ는 320ps당 1개의 Instruction이 수행되므로, 1s당 31억 2천만개의 Instruction이 처리됩니다.

너무 길기때문에, 십억개의 Instructions 묶음으로 나타내기로 약속한 GIPS를 통해 처리량을 표현하면, 3.12 GIPS가 됩니다.

 

즉, 위 SEQ의 Throghput은 3.12 GIPS 입니다.

 

 

왜 Pipelining?

SEQ의 작업 순서가 변경되지 않으면서, 여러개의 명령어를 동시에 수행할 수 있다면 더 빠른속도를 산출할 수 있을겁니다.

하나의 Instruction은 여러개의 Stage(Fetch, Decode, Execute, Memory, Writeback, PC update)로 나눌 수 있는데,

Instruction을 적절한 개수로 나눠 여러개의 명령어의 완료순서를 바꾸지 않고 동시에 수행할 수 있습니다.

 

위 처럼 하드웨어를 구성했다고 합시다.

A에서 계산하고, 클럭이 rise되어 첫번째 레지스터에 작성되고

B에서 계산하고, 클럭이 rise되어 두번째 레지스터에 작성되고

C에서 계산하고, 클럭이 rise되어 세번째 레지스터에 작성되고

를 반복합니다.

Pipeline으로 각 구간이 위와같이 수행된다고 합시다.

예를들어, A에서 Fetch를 완료한 후 Decode단계에서 B가 Fetch를 진행하는 방식으로 동시에 여러개의 명령어를 수행하는겁니다.

각 구간마다 넘버링하여 하드웨어 상태를 살펴보면 다음과 같습니다.

 

 

Pipelining 성능 측정

SEQ의 처리량, 지연시간과 측정 방식이 완전히 동일합니다.

다만 처리량을 구하는 방법에서 약간 생각할 부분이 있습니다.

 

Latency of Pipelining

하나의 명령어의 수행이 완료되려면 stage A, B, C를 거쳐야합니다.

한 clock의 cycle당 하나의 stage를 완료하므로, clock의 cycle인 120ps에 3을 곱하면 360ps입니다.

즉, 위 Pipelining의 Latency는 360ps 입니다.

 

Throughput of Pipelining

위는 단지 3개의 명령어만 수행하지만, 처리량은 1초동안 명령어가 반복적으로 수행한다고 가정해서 구하므로,

명령어 I1 I2 I3 I1 I2 I3 I1... 를 반복적으로 수행해야한다고 가정하겠습니다.

1초에 수행되는 명령어의 개수를 구해야하는데

1초에 굉장히 많은 명령어가 수행되므로 양 Side 부분은 무시하고 값을 구해도 실제로 수행되는 명령어 수와 크게 다르지 않을겁니다.

 

즉 처리량 계산을 위해 side 부분을 제거해서 0ps부터 600ps 까지의 부분만 보았을 때 위와 같은 형태로 명령어들이 수행됩니다.

이제 처리량 계산을 위해 다음을 생각해봅시다.

 

N개의 부분으로 나뉘어진 하드웨어는 N개의 stage를 동시에 수행할겁니다. (예시에서 N = 3)

또한, 한개의 명령어를 수행하려면 stage A, B, C를 거쳐야하고 한 주기동안에도 stage A, B, C가 모두 수행되고 있습니다.

Clock의 한 주기동안 stage A, B, C가 모두 수행되므로 한개의 Instruction이 수행된다고 생각하면,

1초를 한 주기단위로 나눈 개수(위에서는 1s / 120ps)는 1초동안 수행되는 Instruction 수와 동일합니다.

실제로는 한 주기 동안 I1의 stage 한개, I2의 stage 한개, I3의 stage 한개가 수행되지만

결과적으로 1초에 수행되는 명령어수와 거의 동일하다는 얘기입니다.

 

위의 사실들을 바탕으로 계산해보면,

한개의 Instruction이 120ps 동안 실행된다고 생각했을 때

1 Instruction : 120ps = 8333333333.33 Instruction : 1s 의 비율을 가집니다.

1초에 약 83.333억개를 수행하므로, 이를 10억단위로 묶는 GIPS로 나타내면 약 8.33333 GIPS가 됩니다.

 

즉, 위 Pipelining의 Throughput은 약 8.33 GIPS입니다.

 

 

SEQ vs Pipelining 성능비교

Latency : Pipelining의 지연시간이 SEQ의 지연시간보다 약 1.12(360 / 320)배 더 깁니다.

Throughput : Pipelining의 처리량이 SEQ의 지연시간보다 약 2.67(8.33 / 3.12)배 더 깁니다.

 

Pipelining이 SEQ에 비해 1.12배라는 약간의 명령어 처리시간이 늘어났지만 2.67배라는 처리량을 얻었으므로

더 좋은 성능을 얻었다고 정리할 수 있습니다.

'CS:APP' 카테고리의 다른 글

[CS:APP 2.2] Binary Number Encoding  (0) 2023.10.26
[CS:APP] BombLab Phase6 해설  (0) 2023.10.20
[CS:APP] BombLab Phase5 해설  (0) 2023.10.20
[CS:APP] BombLab Phase4 해설  (0) 2023.10.20
[CS:APP] BombLab Phase3 해설  (0) 2023.10.20

+ Recent posts