코딩스토리

Chapter 7. 데이터 경로 본문

컴퓨터구조

Chapter 7. 데이터 경로

kimtaehyun98 2020. 12. 6. 17:03

# 본 내용은 한국항공대학교 길현영 교수님의 '컴퓨터 구조' 강의 및 컴퓨터 아키텍처(우종정, 한빛 아카데미)를 바탕으로 작성한 글입니다.

 

1. 데이터 경로

데이터 경로 : CPU가 명령어를 실행할 때 프로세서가 명령어의 정의에 따라 데이터를 경유시키는 경로

 

CPU가 명령어 실행을 위해 하는 일

 

  • 다음에 수행할 명령어(데이터) 주소 계산 (연산장치, PC)
  • 데이터를 처리하기 위해 메모리에서 데이터를 읽거나 저장
  • CPU 내부의 고속 메모리인 레지스터 파일에 데이터를 일시적으로 보관하고, 연산장치를 통해 산술 연산과 논리 연산을 수행하고, 그 결과값을 레지스터파일/연산장치레지스터 파일/연산장치에 보관

데이터경로를 구성하는 기본적인 hw적 요소들

위의 그림은 CPU 내부에서 데이터가 어떻게 이동하는지를 확인하는데 필요한 hw적 요소들이다.

 

데이터 경로 방식

 

데이터 경로는 크게 단일 사이클 방식다중 사이클 방식으로 나뉜다고 한다.

 

단일 사이클 방식

 

하나의 명령어는 한 사이클 내에서 해당 명령어를 수행한다.

하나의 명령어가 한 사이클 동안 전체 데이터 경로를 사용한다.

이 말은 한 클럭 사이클 동안 하나의 명령어만 PC, 레지스터 파일, ALU, 메모리 등을 거쳐 수행된다는 뜻이다.

 

다중 사이클 방식

 

단일 사이클 방식에서 개선된 방식으로 명령어에 따라 하나의 명령어가 다양한 개수의 사이클을 사용한다.

명령어는 각 사이클마다 데이터 경로를 다시 사용이 가능하다.

 

책과 강의에서는 세탁 방식에 비유해서 설명하는데 잠시 예를 들어보면

 

세탁 과정을 세탁, 탈수, 건조 세 과정으로 나눈다면

단일 사이클은 세탁 한번, 탈수 한번, 건조 한번 한다는 의미이다.

다중 사이클은 건조도 여러번여러 번 할 수 있고, 탈수도 여러 번 할 수 있다는 것이다.

 

지금은 이정도만 이해하고 파이프라인에 가서 다중 사이클에 대해서 다 자세히 알아보도록 하자.

 

단일 사이클 방식 vs 다중 사이클 방식

 

그림으로 보면 더욱 쉽게 이해할 수 있는데 이때 중요한 점은 다중 사이클 방식에서 여러 번 반복이 가능해야 하기 때문에 결과를 임시적으로 저장해 놓는 저장장치(Flip Flop)가 필요하다는 점이다.

 

 

picoMips 명령어 실행과 데이터 경로

 

내가 picoMips 명령어를 설명했는지 기억이 잘 안나지만 아마 안 했던 것 같으므로 ㅎㅎ..

picoMips 아키텍처에서 명령어는 3개의 형식으로 나뉜다.

 

  • R-형식 : 레지스터 2개를 사용, 연산장치에서 처리한 결과를 다른 레지스터에 저장 (ex, add, mul)
  • I-형식 : 메모리 참조, 상수 피연산자를 가진 연산, 조건 분기 등을 수행 (ex. addi, subi)
  • J-형식 : 무조건 분기 수행 (ex. j addr)

 

picoMips 아키텍처에서 명령어 실행 단계는 아래와 같다.

 

1. 명령어 인출

   PC가 가리키는 메모리의 내용인 데이터를 읽기 (3장에서 공부했던 MAR, MBR 등을 통해)

   PC가 다음 명령어를 가리키도록 PC의 내용을 갱신

 

2. 명령어 해독 및 레지스터 읽기

   명령어의 연산 부호를 해독

   명령어에 필요한 레지스터 값 읽기

 

3. 명령어 기능 실행 

   산술 및 논리연산, 메모리 참조, 분기 등 각 명령어에 해당하는 기능 실행

 

단일 사이클 방식 vs 다중 사이클 방식

 

위의 그림이 각 방식의 데이터 경로를 나타낸 그림이다.

지금까지 공부해왔던 hw적 요소들이 복잡하게 연결되어 있다.

특이한 점은 다중 사이클에는 PC 갱신 장치가 없다는 것인데 잘 보면 ALU와 PC가 연결되어있다.

이는 ALU에서 PC 갱신값을 연산해서 보내준다는 뜻이다. 

 

 

이제 각 방식에서 명령어가 어떤 과정을 통해 실행되는지 알아보자.

 

단일 사이클 방식

 

명령어 실행과정은 앞에서 많이 봤듯이 인출 과정과 수행 과정으로 나뉜다.

 

단일 사이클 방식 명령어 인출 단계

 

그림에서 볼 수 있듯이 PC에 저장되어 있는 메모리의 주소로 가서 명령어를 인출해온다.

 

다음은 명령어 해독이다.

 

단일 사이클 방식 명령어 해독

이제 메모리에서 명령어를 가져왔으므로 명령어를 해독해야 한다.

 

명령어를 해독한다는 것은 명령어를 bit에 맞게 분리한다는 의미와 같다.

PicoMips 명령어는 16bit이고, 최상위 4bit는 opcode, 나머지 비트들은 형식에 따라 다르지만 그림을 보면 명령어가 해체되어서 각각의 위치에 맞게 이동한다.

 

이때 rs, rt 처럼 레지스터 주소를 가져왔다면, 레지스터 파일에 접근하여 Reg[rs], Reg[rt]값을 읽어온다.

 

이제부터는 명령어의 형식마다, 기능 마다 실행하는 단계가 다르다.

 

명령어가 해독이 완료되었다면, 이제 실행해야 한다.

 

picoMips 명령어들

 

1. R-형식 덧셈 명령어 실행단계

 

위의 표에서 찾아볼 수 있듯이 picoMips add 명령어는 add $rd $rs $rt이다.

 

이제 그림을 보면 rs, rt에 있는 데이터를 가져와서 ALU를 통해 연산한다. (이 경우엔 덧셈 연산이겠죠)

 

ALU를 통해 계산된 결과는 rd에 저장되어야 하기 때문에 레지스터 파일로 돌아와서 데이터를 저장한다.

 

또한 지금까지 얻은 정보를 바탕으로 다음 실행을 위해 PC를 갱신한다.

 

2. I 형식 산술 논리 명령어

 

i 형식의 명령어는 위의 표에서 찾아볼 수 있듯이 addi $rt $rs, imm처럼 Reg[rt] = Reg[rs] + imm임을 알 수 있다.

 

 

사실 R형식의 덧셈과 거의 비슷한 방식이다.

ALU를 통해 즉칫값 imm와 Reg[rs]를 더하고 그 결과를 rt에다가 저장하는 과정이다.

 

하늘색 선을 잘 보면 imm 값이 ALU로 들어가는 것을 알 수 있다.

마찬가지로 PC를 갱신시켜준다.

 

3. I 형식 적재 명령어

 

적재 명령어는 lw $rt, imm($rs)와 같이 메모리에서 데이터를 가져와(M[$rs + imm*2]) 레지스터(rt)에 적재한다.

 

여기서 imm*2에 대해서 잠시 짚고 넘어가면

 

먼저 picoMips 아키텍처에서 ALU는 16bit 연산을 수행한다. 즉 입력과 출력이 16bit라는 것이다.

이때 i 형식 명령어에서 imm필드는 6bit이다. (이건 picoMips 명령어 정의임)

따라서 먼저 16bit로 부호 확장을 해준다.

 

이때 imm값은 현재 주소를 나타내는 숫자이다. (즉치값을 더했던 위의 경우와 다르다!)

 

CPU 내부에서는 주소를 Word 단위로 나타내기 때문에 현재 imm값은 2byte 단위로 나타내져 있다.

하지만 메모리는 주소를 1byte 단위로 표현하기 때문에 만약 그대로 ALU에 넣고 연산한다면 엉뚱한 주소값이 나온다.

따라서 2byte 단위의 주소를 1byte 단위로 바꿔주기 위해, 왼쪽으로 1bit Shift 한다. 

 

왼쪽으로 1bit Shift라는 말은 2진법에서는 2를 곱해라 라는 말과 같기 때문에 결국 imm*2 가 되는 것이다. 

(갑자기 떠오른 말은 로마에 가면 로마법을 따르라?인데 메모리에서 데이터를 가져오고 싶으면 메모리 주소 표현 방식을 따르라! 약간 이런 식으로 이해하면 쉬울 것 같다)  

 

 

그림이 가장 이해하기가 쉽다.

 

결국 차이점은 이번에는 ALU의 연산 결과를 통해 메모리에 접근한다는 점이다.

이를 통해 ALU를 통해 주솟값도 계산할 수 있다는 것을 알 수 있다.

 

 

4. I 형식 저장 명령어

 

저장 명령어는 메모리에 값을 저장하는 작업을 수행한다.

 

예를 들어 sw $rt, imm($rs)와 같이 메모리에서 값을 읽어와 레지스터에 저장한다.

 

 

위의 적재 명령어와 거의 비슷한데 주의 깊게 볼 점은 레지스터 값을 메모리에 보내주는 점 정도인 것 같다.

 

 

5. I 형식 조건 분기 명령어

 

조건 분기는 쉽게 말해 if - then, 즉 조건에 따라 분기한다는 말이다.

 

예시로는 우리가 과제에서 많이 써본 beq $rs, $rt, imm 가 있다.

 

 

분기 실행은 플래그 레지스터의 Z 비트를 통해 결정한다.

 

연산 결과(예제의 경우 같은지 다른지)에 따라 Z비트의 값에 true or false를 설정한다.

그리고 이 값에 따라 PC값을 갱신할지 말지를 결정한다.

 

Z 비트가 참이면 PC 갱신 장치에서 계산한 분기 주소(PC+2 +imm*2)PC 레지스터에 저장하고, 거짓이면 다음 명령어 주소 (PC+2)PC 레지스터에 저장한다.

 

 

6. J 형식 무조건 분기 명령어

 

 

이 명령어는 별다른 연산이 필요 없다.

레지스터를 읽는 과정에서 무조건 분기 주소 (PC + 2 + addr*2)를 PC에 저장해주면 된다.  

 

 

다중 사이클 방식

 

명령어 인출 단계

 

다중 사이클에서의 명령어 인출 단계

위 그림을 보면 명령어 인출 단계인데도 ALU를 통해 연산을 수행하고,  그 결과를 PC에 가져오는 것을 알 수 있다.

 

그 외에도 IR이나 DR 같이 명령어나 데이터를 일시적으로 저장해놓는 추가적인 레지스터가 있음을 알 수 있다.

 

명령어 해독, 읽기 단계

 

다중 사이클 명령어 해독, 읽기 단계

 

명령어는 메모리로부터 인출되어 IR에 저장되어 있었다.

 

여기서 가장 중요한 점은 (물론 내가 생각하는)

명령어를 해독할 때 모든 경우를 다 고려한다는 점이다.

 

이게 뭔 이야긴가 하면 R, I, J 형식 명령어는 각각 쓰는 필드들이 다르다.

따라서 단일 사이클에서는 각각의 명령어 형식에 맞게 명령어의 bit를 쪼개서 정보를 가져왔지만

다중 사이클에서는 모든 경우를 다 생각해서 rs, rt, imm를 모두 미리 구해놓는다.

 

그렇기 때문에 이런 여러 정보들을 임시적으로 저장해놓는 저장장치들(A, B, C)이 필요하다.

 

이제부터는 명령어 실행 과정이다.

 

1. R 형식 덧셈 명령어

 

 

과정은 단일 사이클과 거의 똑같다.

단지 임시 저장장치를 거쳐간다는 점만 다르다.

 

2. 적재 명령어 

 

 

이도 단일 사이클과 비슷하지만 임시 저장장치를 거친다는 점이 다르다.

 

 

 

2. 데이터 경로의 구체화와 성능 비교

 

가정 1) 지연 시간 : 메모리(2ns), 레지스터 파일 (1ns), 연산장치(2ns)

가정 2) 각 명령어 비율 : 연산(R-형식)(44%), 적재(24%), 저장(12%), 분기(20%)

 

가정 3) 고정 사이클 시간을 사용하여 분석

 

단일 사이클 vs 다중 사이클 

 

단일 사이클의 CPI = 1이다. 무조건. 

이때 단일 사이클의 클럭 사이클 시간은 8ns가 되어야 한다.

이유는 지연 시간이 가장 max인 값을 택해야 하는데 그렇지 않으면 한 사이클 내에 실행하지 못하는 명령어가 발생한다.

 

다중 사이클은 평균 CPI를 구해야 한다.

구해보면 평균 CPI = 0.44 x 4+ 0.24 x 5 + 0.12 x 4 + 0.2 x 4 = 4.24이다.

(이때 명령어마다 다르기 때문에 각각의 사이클 개수와 비율을 곱해주어야 한다.)

클럭 사이클 시간은 메모리, 레지스터 파일, 연산장치의 지연값 중 max갑인 2ns이다. 

 

따라서 단일 사이클의 명령어당 평균 CPU 실행 시간은 8ns이고

다중 사이클의 명령어당 평균 CPU 실행시간은 8.48ns이다.

 

이 예제에서는 단일 사이클이 더 좋은 성능을 보이지만 복잡한 연산을 진행할 시 단일 사이클 방식의 실행시간이 매우 커질 수 있다고 한다.

 

따라서 요즘의 컴퓨터는 다중 사이클 방식의 데이터 경로를 사용한다. (파이프라이닝을 위해서지만 이건 다음 챕터에)

 

 

 

너무 의식의 흐름대로 정리한 것 같은데 결국 중요한 점은 어떠한 경로를 통해, 어떤 과정을 통해 명령어가 실행되는지를 이해해야 한다. 

 

Comments