본문 바로가기

Computer Science/Computer Architecture

[Computer Architecture] 데이터 연산 (picoMIPS)

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

CPU의 연산장치 (ALU, Arithmetic & Logic Unit)

+,- 등 산술 연산, AND, OR 등 논리 연산, Shifter, 보수기 등이 포함된다.
- << 연산: × 2^n
- >> 연산: ÷ 2^n
 
ex) add $5 $3 $ 4: 레지스터 3에 저장된 데이터와 레지스터 4에 저장된 데이터를 더하고 레지스터 5에 저장
=> 0000 011 100 101 010 (순서 기억)
1.  OpCode와 fn을 통해 명령어를 해독한다.
- ALU에 + 제어신호를 전달한다.
=> R-형식 명령어 이므로 3bit(source), 3bit(target), 3bit(destination) 레지스터의 주소임을 인식한다.
 
2. source, target 레지스터 주소에 해당하는 데이터를 가져와서 ALU에서 더하기 연산을 진행한다.
- 레지스터 주소는 3bit, 레지스터 데이터는 16bit이다.
 
3. 연산을 진행한 데이터를 destination 레지스터 주소에 저장한다.

picoMIPS 아키텍쳐의 덧셈 실행과정

ALU 내 산술장치와 논리장치의 통합

16bit의 산술장치와 논리장치를 멀티플렉서를 이용하여 연결한다.
 
2개의 16bit 입력 데이터가 산술장치와 논리장치에 입력된다.
- 입/출력 올림수는 산술장치에만 각각 입력되고 출력된다.
 
3bit 제어 신호에 따라 어떤 장치를 선택할지 결정한다.
- 2bit산술장치와 논리장치에 입력되어 각 장치의 연산 종류를 선택한다.
- 1bit멀티플렉서에 적용되어 산술장치와 논리장치 출력 중 하나를 선택하여 출력한다.

16 bit용 연산 장치를 위한 산술장치와 논리장치의 연결

Flag register

CPU내 연산 과정 중에 발생한 상태 데이터들을 저장한다.
- 하나의 정답 값 외에 발생하는 부수적 정보 데이터: 올림수(C), 오버플로우(V), 부호(S), 0값(Z)
ex) 11 + 11 = 110 (올림수 발생), 16bit + 16bit = 17bit (오버 플로우 발생), 11 - 11 = 00 (0값)
 
프로그램을 제어할 때 많이 사용된다.
ex) beq 분기 명령어를 수행 시 Z값을 체크한다. (연산 결과값이 0이면 Z = 1)

16bit용 연산장치와 플래그 레지스터

정수의 뎃셈

10진수 덧셈과 유사하다.
- 오른쪽(낮은 자리) -> 왼쪽(높은 자리)으로 한 자리씩 더하고, 올림수 발생 시 함께 더한다.
 
두 수의 부호가 다를 때: 절댓값이 큰 수의 부호를 따라간다. (자리올림수 무시)
두 수의 부호가 같을 때: 자리올림수(잉여 비트)를 무시한 결과는 오버플로우가 발생가능하다.
+ 오버플로우: 두 정수의 연산 결과가 주어진 비트로 표현할 수 없는 경우
 
ex) 운이 좋은 경우
1. (+3) + (+4) = +7
=> 0011 + 0100 = 0111
 
2. (-3) + (+3) = 0
=> 1101 + 0011 = (1)0000  (Overflow가 아닌 Carry)
 
3. (-6) + (+2) = -4
=> 1010 + 0010 = 1100
 
4. (-4) + (-1) = -5
=> 1100 + 1111 = (1)1011
 

ex) 오버플로우 발생 예시(-3) + (-6) = -9=> 1101 + 1010 = (1)0111즉, -9가 아닌 7이 답이 된다.

 
< 오버 플로우 점검 방법 >
MSB(가장 큰 자릿수)에 대한 입력 올림수(Carry In)와 출력 올림수(Carry Out)가 서로 다를 때 발생한다.
- XOR 게이트를 이용하여 구현 가능하다.

오버플로우 점검

=> 즉 점검하여 오버 플로우라면 표현을 못하는 상황이고, 아니라면 비트를 벗어나는 잉여 비트를 지운다.
 
< 두 수의 비트 수가 다를 때 >
부호 확장을 통해 동일한 비트 수로 변환해야한다.
- 비트 수가 작은 수를 큰 수의 비트 수로 변환해야한다.

두 수의 비트 수가 다를 때 부호 확장

4 bit 정수의 덧셈 뺄셈 장치

4개의 전가산기(FA, Full Adder)를 직렬로 연결한다.
 
뺄셈의 경우, 빼야할 숫자를 2의 보수로 변환하여 덧셈을 수행한다.

4bit 정수의 덧셈 뺄셈 장치

s는 제어신호로 뺄셈일 경우, 2의 보수 처리를 위해 +1을 갖는다.
- C는 자리 올림수이다. 그 중 C0는 2의 보수 처리를 위해 1의 보수에서 +1 역할을 한다.


무부호 정수의 곱셈

종이 - 연필 방식

종이-연필 방식 무부호 정수 곱셈

=> N bit 수 2개를 곱셈했을 때, 결과는 최대 2N bit이다.
 
즉, 2N bit 덧셈연산장치가 필요하다.
 
부분곱의 개수는 승수를 구성하는 비트 수와 동일하다.
-> 일반적으로 컴퓨터의 연산 장치는 2개의 입력을 받아 1개의 출력을 생성하는 회로로 설계한다.
-> 부분곱 3개 이상을 한 번에 입력하는 계산을 원한다면 따로 추가적인 설계가 필요하다.

시프트 - 덧셈 방식 (1)

 각 사이클마다 승수(부분곱)를 왼쪽으로 1-Shift하고, 누적 부분곱에 부분곱을 더한다.

시프트 - 덧셈 방식 곱셈 과정 1

=> 부분곱  계산을 위해 2N bit 덧셈 연산이 필요하다. (HW 낭비)

시프트 - 덧셈 방식 (2)

N bit 덧셈장치로 N bit 곱셈장치를 구현한다.
- 상위 N bit만 덧셈을 수행한다.
 
미리 4 bit 왼쪽 Shift한 승수를 사이클마다 누적 부분곱에 더한 후, 누적 부분곱을 1 bit씩 오른쪽 시프트한다.

시프트 - 덧셈 방식 곱셈 과정 2

=> 승수에 1이 많을수록 덧셈이 증가한다.

Booth 알고리즘

< 10진법 >
A × 9999
 
= A × (9 + 90 + 900 + 9000)
=> 곱셈 4번과 덧셈 3번이 필요하다.
 
= A × (10000 - 1)
=> 곱셈 2번과 덧셈(뺄셈) 1번만 필요하다.
 
< 2진법 >
A × 01111110
 
= A × (01000000 + 00100000 + 00010000 + 00001000 + 00000100 + 00000010)
=> 곱셈 6번과 덧셈 5번이 필요하다.
 
= A × (10000000 - 00000010)
=> 곱셈 2번과 덧셈(뺄셈) 1번만 필요하다.
 

booth 알고리즘 표

 

booth 알고리즘 계산 예시

 
+ booth 알고리즘은 음수 × 양수도 가능하다.


무부호 정수의 나눗셈

피제수(D, dividend), 제수(V, divisor), (Q, quotient), 나머지(R, remainder)
=> D ÷ V = Q ... R
=> D = Q × V + R
 
Q와 V가 n비트라면 D의 비트 수는 2 × n 비트도 가능하다.
- n bit 나눗셈 시, 피제수의 bit를 2n bit로 확장하기도 한다. 

종이 - 연필 방식

종이-연필 방식 무부호 정수 나눗셈

컴퓨터는 몫이 시작하는 자리를 찾을수 있는가?
=> 피제수와 제수의 뺄셈을 통해 비교하여 크기를 비교해야한다.

복원 알고리즘

복원 알고리즘 예시

뺄셈한 결과인 부분 나머지가 음수이면,  다시 제수를 더한 다음, 더 큰 수에서 빼기 위해 피제수를 1비트씩 왼쪽으로 시프트하면서 제수를 빼는 과정을 반복하므로써 몫과 나머지를 구한다.
 

무부호 정수 나눗셈의 복원 알고리즘 예시

< 계산 과정 >
0. 초기의 부분 나머지는 피제수를 n비트에서 2n비트로 확장한다.
 
1. 부분 나머지를 1 bit 왼쪽으로 Shift한다. 부분 나머지의 왼쪽 n bit에서 제수를 뺀다.
- 뺄셈 결과가 음수이면, 몫의 LSB에 0을 추가하고 제수를 다시 덧셈하여 부분 나머지를 복원한다.
- 뺄셈 결과가 음수가 아니라면, 몫의 LSB에 1을 추가한다.
 
2. 1을 n번 반복한다.
 
=> 뺄셈 연산 후 복원 여부에 따라 덧셈을 수행하므로 오랜 시간이 소요된다.

비복원 알고리즘

무부호 정수 나눗셈의 비복원 알고리즘 예시

 
(1 × 2^n) - (1 × 2^n-1) = (1 × 2^n-1) 임을 이용한다.
 
< 계산 과정 >
1. 제수를 오른쪽 Shift한다. (÷ 2)
2. 부분 나머지가 음수면 제수를 더하고 음수가 아니면 제수를 뺀다.
3. 부분 나머지가 음수이면 대응하는 몫의 LSB에 0을, 아니면 1을 추가한다.
 
+ 제수를 오른쪽으로 Shift하는 것과 피제수 또는 부분 나머지를 왼쪽으로 Shift하는 것은 같은 의미이다.