컴퓨터 구조 - 7

컴퓨터 구조 7강

KOCW 컴퓨터구조 2020-2학기 최규상 교수님 강의를 듣고 정리한 글이다.


Processor

이전에 컴퓨터 성능은 명령어 개수, clock cycle time, CPI 에 의해 결정된다는 것을 알았다. 그리고 compiler와 ISA가 프로그램에 필요한 명령어 개수를 결정한다. 여기서 clock cycle time, CPI 는 processor의 구현 방법에 따라 결정된다. 이제는 MIPS instruction set을 2가지 방법으로 구현하여 data path와 control unit을 완성시키려 한다.


Instruction Execution

  1. PC → instruction memory에 PC에 해당하는 주소로 가서 fetch instruction(명령어 읽어온다).
  2. Register numbers → register file에 가서 register를 읽어온다.
  3. instruction의 종류에 따른 명령을 수행한다.
    • Use ALU
    • Load/Store data memory Access
    • PC ← PC + 4


위 과정들을 아래의 그림과 같이 나타낼 수 있다.

ca7_1

 사진출처 

PC는 다음번 명령어를 가리키기 때문에 +4가 된 것을 볼 수 있다. 그러나 O라고 되어있는 곳을 보도록 하자. Hardware에서는 2개의 wire가 겹치는 경우는 없다. 따라서 위 그림으로 processor를 설계한다면 당연하게도 동작을 안할 것이다. → MUX를 사용해야 한다!!

그리고 Load, Store, Arithmetic instruction일 때 마다 unit이 다르게 제어되어야 하는데 그러한 기능을 하는 부분도 빠져있다.


ca7_2

이렇게 MUX를 추가하여 MIPS subset의 기본적인 구현을 해볼 수 있다. Control은 CPU의 내부 구성요소들을 제어해주는 역할을 한다.


Clocking Methodology

ca7_3

Sequential 회로는 edge-triggered clocking 방식을 가정한다고 하면, combinational logic에 input이 들어오면 해당 회로의 연산을 모두 마칠때까지 clock period가 보장이 돼야 한다. 따라서 가장 긴 delay를 가진 명령어에 clock이 맞춰지게 되는 것이다.

⇢ 이전 시간에 우리는 복잡한 명령어가 1개가 간단한 명령어 2~3개보다 더 오래걸린다고 했었다. 이 이유가 모든 명령어는 synchronize돼있기 때문에 가장 긴 clock period에 영향을 받게 되고, 복잡한 명령어는 clock period가 길기 때문에 더 오래걸리는 것이었다.


Processor의 3가지 구성요소

  1. Control
  2. Datapath
  3. Cache memory

우리는 1, 2를 간단하게나마 구현을 해볼 것이고, 3번은 나중에 구현하도록 할 것이다.


Datapath

process data와 address를 CPU에서 처리해주는 elements

datapath 설계를 시작하는 방법은 MIPS의 명령어 종류 각각을 실행하는데 필요한 주요 구성 요소들을 살펴보는 것. 각 명령어들이 어떤 datapath를 필요로 하는지 보도록 하자.


PC : program counter

ca7_4

위 그림은 program의 명령어를 저장하고 주소가 주어지면 해당 명령어를 보내 주는 datapath 이다.


R-format Instruction

ca7_5


예시를 한번 들어보도록 하자. 아주아주 간단한 add연산이다.

add $t0, $s0, $s1 # $s0: 4, $s1: 6

MIPS register 32개는 각각의 register number가 있는것을 우린 배웠다. $t0: reg 8, $s0: reg 16, $s1: reg 17이다. 따라서 #2부분에 16이라는 register number가 들어가고, #3에는 17이라는 값이, #4의 주소에는 #2, #3의 ALU연산의 결과가 저장될 register number인 8이 들어가게 된다.

#2-1에는 $s0가 갖고 있는 4라는 값이 나오고, #3-1에는 $s1이 갖고 있는 6이라는 값이 나오게 된다. ALU연산의 결과값인 4+6=10#4의 register에 write된다. add연산이라는 것은 ALU Operation이 결정해준다. 물론 register에서 write/read는 RegWrite의 값에 따라 결정된다.


Load/Store Instruction

ca7_6


Branch Instruction

ca7_7


Full Datapath

ca7_8

단순화시킨 datapath를 완성했다. 이제 control unit을 추가해야 한다. → 각 MUX의 신호, ALU 제어를 하기 위해서이다.



ALU Control

ca7_9

MIPS ALU는 입력 4개를 사용하는 위 6가지 조합을 정의하고 있다.


ca7_10

사진출처

ALU control bit들은 ALUOp control bit와 R-format instruction의 funct 코드값에 의해 결정된다. Kocw 3강에서 우리는 R-format에 대해 배웠었다. 그 때는 add, sub 등등의 연산을 구별해주는게 funct 코드라고 듣기만 했었는데 이렇게 직접 보게 된 것이다.

lw, sw는 Load/Store 명령어이기에 I-format을 사용한다. 따라서 funct code가 없으므로 xxxxxx로 돼있는 것이다.

결론적으로 2bit의 ALUOp, 6bit의 funct code(field)를 4bit의 ALU control bit로 mapping시켜서 제어하는 것이다. 그리고 이 회로를 설계하기 위해서는 기본적으로 combinational circuit이므로 truth table을 만드는게 좋다. 위의 표를 토대로 만들면 아래와 같다.

ca7_11

 사진출처


Datapath with Control

ca7_13

사진참고

이제 제법 복잡해진게 느껴질 정도다. 하지만 subset unit의 기능을 하나하나 이해하고 넘어갔다면 그저 그것들을 붙여놓은 것뿐이기에 똑같은 것이라고 생각한다.


Performance Issue


Pipeline

pipelining은 여러 명령어가 중첩되어 실행되는 구현 기술이다. 지금까지 구현한 간단한 MIPS processor는 1 clock에 1개의 instruction을 처리했었다.이제는 pipelining으로 병렬적으로 처리하는 방법을 배워보도록 하자.


MIPS Pipeline

  1. IF : Instruction Fetch from memory
  2. ID : Instruction Decode & Register read
  3. EX : Execution operation OR Calculate Address
  4. MEM : Access memory operands. data memory에 접근하는 것
  5. WB : Write Back. 결과를 다시 register에 write


MIPS Pipeline

ca7_14

사진출처

아까 말했듯이 lw명령어가 가장 오래 걸림을 알 수 있었다.


ca7_15

위 그림을 보면, lw명령어를 pipelining을 했을 때와 안했을 때의 실행시긴의 차이를 알 수 있다. 3번의 load instruction을 실행하는 동안 pipelining이 아닐 때에는 2400ps가 걸렸고, 했을 때에는 1400ps가 걸림으로써 성능향상을 볼 수 있다.


Pipeline Speed up