본문 바로가기

Computer Science/Computer Architecture

[Computer Architecture] 명령어 집합 (2)

+ 한국항공대학교 길현영 교수님의 컴퓨터구조론 과목 내용을 정리한 글입니다.

왜 CPU 내 기억장치 (Register)가 필요한가?

폰 노이먼 모델에서 발생 가능한 데이터 트래픽 추정

< 폰 노이먼 모델: 실행 장치 (CPU)와 기억장치 (Memory)의 분리 >

- SW와 HW의 분리로, 프로그램이 수정이 가능하고, 다양한 프로그램을 쉽게 사용 가능하다.

- 대신, 항상 기억 장치와 CPU 간 데이터 이동이 발생한다. (명령어/자료 등)

=> 시간이 지날 수록, CPU와 기억 장치 간 속도 차이가 커졌다. (병목 현상)

CPU 내부 기억장치(레지스터)가 없는 가상의 컴퓨터를 가정

M - M (메모리 - 메모리) 컴퓨터

- CPU 내부에 데이터 저장 불가하다.

- 모든 데이터는 메모리에서 CPU를 경유하여 메모리로 전송된다.

- 데이터가 필요한 경우, 명령어의 피연산자 필드에 메모리 전체 주소를 명시한다.

 

시스템은 아래 조건을 따른다고 가정한다.

- 연산 부호 비트는 8Bit (1Byte)이다.

- 연산마다 최대 2개의 피연산자를 사용한다. (피연산자 1개는 2Byte이다.)

- 첫 번째 피연산자는 Source & Destination이다.

ex) 피연산자 주소 1에 저장된 a, 피연산자 주소 2에 저장된 b를 연산한 값 c는 피연산자 주소 1에 저장된다.

- 메모리 주소는 16Bit (2 Byte)이고, 데이터의 크기는 32 Bit(4 Byte)이다.


M - M 컴퓨터: y = ax^2 + bx + x (시험)

< Register가 없을 때 >

+ 식의 앞 부분부터 계산하여 y에 저장하라 

+ 새로운 변수는 최소한으로 사용하라

 

1. y = ax^2 만들기

1) y = a 

MOV y a

=> M[y] <- M[a]: 메모리 주소 a의 데이터를 메모리 주소 y에 저장한다.

 

2) y = ax

MUL y x

=> M[y] <- M[y] × M[x]: 메모리 주소 y의 데이터와 메모리 주소 x의 데이터의 곱을 메모리 주소 y에 저장한다.

 

3) y = ax^2

MUL y x

=> M[y] <- M[y] × M[x]: 메모리 주소 y의 데이터와 메모리 주소 x의 데이터의 곱을 메모리 주소 y에 저장한다.

 

2. y = ax^2 + bx 만들기

1) t = b

MOV t b

=> M[t] <- M[b]: 메모리 주소 b의 데이터를 메모리 주소 t에 저장한다. (변수를 따로 할당 overwrite 주의)

 

2) t = bx

MUL t x

=> M[t] <- M[t] × M[x]: 메모리 주소 t의 데이터와 메모리 주소 b의 데이터의 곱을 메모리 주소 t에 저장한다.

 

3) y = y + t (y = ax^2 + bx)

ADD y t

=> M[y] <- M[y] + M[t]: 메모리 주소 y의 데이터와 메모리 주소 t의 데이터의 합을 메모리 주소 y에 저장한다.

 

3. y = ax^2 + bx + c 만들기

y = y + c (y = ax^2 + bx + c)

ADD y c

=> M[y] <- M[y] + M[c]: 메모리 주소 y의 데이터와 메모리 주소 c의 데이터의 합을 메모리 주소 y에 저장한다.

 

< 명령어 인출 트래픽 >

- 한 명령어 당 5Byte 트래픽 발생

=> 7개의 명령어를 사용했으므로 5Byte * 7 = 35Byte 트래픽 발생

 

< 데이터 이동 트래픽 (1) - MOV >

- 데이터 이동 연산: MOV y a

- a번지의 데이터를 메모리에서 CPU로 갖고 왔다가 다시 메모리 y번지로 저장한다.

- 4Byte데이터가 한 MOV 명령어당 2회 이동하므므로 4Byte × 2 = 8Byte 트래픽 발생

=> 2개의 명령어를 사용했으므로 8Byte × 2 = 16Byte 트래픽 발생

 

< 데이터 이동 트래픽 (1) - MUL, ADD >

- MUL과 ADD 연산 시 트래픽 양은 동일하다.

- 산술 연산: MUL y, x (산술연산을 수행하는 것은 트래픽이 없다.)

- y번지와 x번지의 데이터를 CPU로 갖고 와서 곱셈 수행 후, 결과 데이터를 y번지에 저장한다.

- 한 MUL 명령어당 4Byte 데이터 2개를 CPU에 가져오는 8Byte트래픽과 4Byte 결과 데이터 1개를 메모리에 저장하는 4Byte 트래픽이 발생하므로 총 12Byte의 트래픽이 발생한다.

=> 5개의 명령어를 사용했으므로 12Byte × 5 = 60Byte 트래픽 발생

 

=> 35Byte + 16Byte + 60 Byte = 111Byte 트래픽이 발생한다.

< Register가 있을 때 >

데이터 이동 트래픽이 감소한다.

- 반복적으로 사용되는 피연산자를 CPU 내부의 기억 장치에 보관한다.

- 메모리를 다시 참조할 필요성이 제거된다.

ex) MUL y x를 2번 사용할 필요가 없다.

=> 이미 2번째 코드에서 x를 메모리에서 가져왔기 때문에 3번째 코드에서 다시 가져올 필요가 없다.

 

명령어 트래픽이 감소한다

- 대용량 메모리를 위한 긴 주소 대신에 소규모 기억장치(레지스터)의 짧은 주소를 사용할 수 있다.

- 레지스터 개수 = 레지스터 주소 bit수

- 레지스터 개수 << 메모리 entry 수

- 피연산자 필드가 짧아지면 명령어의 길이가 축소된다.