컴퓨터 구조론 Lecture 3 - 2

D0Lim·2021년 1월 7일
2

컴퓨터 구조론

목록 보기
11/13
post-thumbnail

시작하기 전

이 글은 필자가 수업시간에 들은 내용과 강의록을 토대로 정리한 글입니다.
수업 필기이다 보니, 오류가 있거나 설명이 부족한 부분이 있을 수 있습니다.
궁금하신 점이나 지적하실 점이 있다면 댓글로 달아주세요! 확인 후 내용을 추가하거나 답변해드리도록 하겠습니다 :)

곱셈(Multiplication)

  • 우리가 평상시에 하는 여러 자릿수 곱셈(Long-multiplication)처럼 접근해보자.

  • 예시는 4 비트 곱셈이다.

    2018-10-15 1 19 44

  • 참고로,

    1. 결과값(Product)의 길이는 최대 두 피연산자의 길이의 합이다.
    2. 우리는 피승수(Multiplicand)를 더하거나, 더하지 않을 것이다.(2진수 연산이기 때문에, 0(더하지 않거나) 아니면 1(더하거나)인 경우 밖에 없다.)
  • 위의 그림에서 간단하게,

    • ALU는 덧셈을 하는 역할
    • 피승수(Multiplicand)와 승수(Multiplier)가 적혀있는 부분은 각각의 값들을 제어하는 부분
    • Control test는 전체적인 행동을 통제하는 부분
  • 이라고 생각하면 된다.


곱셈 하드웨어(Multiplication Hardware)

  • 곱셈 하드웨어는 상술한 회로도와 같다.

2018-10-14 9 58 56

  • 위의 그림의 회로도는 다음과 같은 알고리즘으로 작동한다.

2018-10-23 5 21 21

  • 전체적으로 보면, 덧셈 연산 후 피승수와 승수를 시프트하는 형태를 띄고 있다.

최적화된 곱셈 연산기(Optimized Multiplier)

  • 더하는 과정과 시프트하는 과정을 병렬적으로 수행한다.(동시에 수행한다고 보면 될 것 같다. 모든 것은 한 클럭 기준이다.)

2018-10-15 1 40 15

  • Product의 우측 32비트에 승수(Multiplier)를 먼저 저장해둔다.
  • 그것을 이용하여 피승수를 더하거나, 그러지 않는 연산을 수행한다.
  • 그 연산의 결과는 칠해진 왼쪽 32비트에 반영된다.
  • 연산이 끝나면 오른쪽으로 한번 시프트한다. 즉, 원래의 하드웨어에서 따로 하던 연산을 한번에 수행하는 것이다.

더 빠른 곱셈 연산기(Faster Multiplier)

  • 그냥 덧셈 연산기(adder)를 겁나게 많이 써버리면 된다.

    • 그렇지만, 이는 비용이 상당히 많이 들게 될 것이다.
    • 즉, 비용과 성능 사이의 타협이다.
  • 아니면, 파이프라인을 사용하면 된다고 한다.

    • 수많은 곱셈은 병렬적으로 수행된다.

MIPS 곱셈(MIPS Multiplication)

  • 결과값(Product)은 64비트까지의 값을 가질 수 있다.

  • 그런데 MIPS의 레지스터는 기본적으로 32비트이다.

  • 따라서, 결과값을 온전히 담아내기 위해 특별한 레지스터 2개를 사용한다.

    • HI : 가장 상단의(most-significant) 32비트
    • LO : 가장 하단의(least-significant) 32비트
  • 명령어들(Instructions)

    • mult rs, rt / multu rs, rt
      • rs와 rt의 값을 곱해서 64비트 결과값을 HI와 LO를 사용하여 저장한다.
    • mfhi rd / mflo rd
      • HI 혹은 LO의 값을 rd로 옮긴다.
      • 32비트의 연산값을 원했을 경우, 오버플로우가 발생했는지 확인해보기 위해 HI의 값을 테스트해볼 수 있다.
    • mul rd, rs, rt
      • 결과값의 가장 하단의(least-significant) 32비트만 rd에 저장한다.

나눗셈(Division)

  • 곱셈과 마찬가지로, 우리가 어떻게 나눗셈을 수행하는지 생각해보면 된다.

2018-10-15 2 22 32

  • 먼저, 제수(Divisor)가 0인지 확인해야 한다.(0으로 나누는 끔찍한 만행을 저질러서는 안된다.)

  • 그러고선, 우리가 초등학생 때 배운 나눗셈을 똑같이 수행하면 된다. 2진수라고 쫄 필요가 없다.

    • 만약 제수(Divisor) 비트들이 피제수(Dividend)비트들보다 작거나 같으면, 몫에 1을 적고, 빼면 된다.
    • 아니면, 몫에 0을 적고, 피제수(Dividend)의 비트를 하나 더 가져온다.
  • 복원 나눗셈(Restoring Division)

    • 근데 위의 과정을 컴퓨터가 한다고 생각해보자. 컴퓨터가 어떻게 뺄 수 있는지 없는지 알겠는가? 결국 한번 빼 본 후 0보다 작으면 복원하는 식으로 진행하는 수 밖에 없다.
  • 음수를 어떤 수로 나누면 어떻게 할래?

    • 예를 들어, (10진수에서) -7 / 2를 수행한다고 가정하자.
      • 이 경우, Q = -3, R = -1 이 나오거나,
      • Q = -4, R = 1 이 나올 수 있다.
    • 위의 경우에서, 정답은 Q = -3, R = -1이다.
    • 나눗셈에서는 피제수(Dividend)와 나머지(Remainder)의 부호가 같아야만 한다.

복원 나눗셈 예시(Restoring Division Example)

  • 위의 나눗셈 과정에서, Skip하는 부분에 빼 본 후, 그것이 음수인 것을 확인하고 복원하는 과정을 추가하면 된다. 그닥 어려울 것이 없다.
  • 이 나눗셈에 사용되는 회로는 아래와 같다.

2018-10-15 4 15 51

  • 나머지(Remainder)가 들어가는 부분에 맨 처음 피제수(Divident)가 들어간다.

나눗셈 하드웨어(Division Hardware)

  • 전체적으로 곱하기와 비슷한 모습이다.
  • 순서도 : <추가 예정>

최적화된 나눗셈 연산기(Optimized Divider)

2018-10-15 4 19 59

  • 곱셈 연산기와 비슷, 아니 거의 똑같은 수준이다.
  • 차이점은 시프트가 오른쪽 뿐 아니라 왼쪽으로도 이루어진다는 것이다. 이를 통해서 복원 나눗셈이 가능해진다.

MIPS 나눗셈(MIPS Division)

  • 곱셈과 마찬가지로 HI와 LO를 사용한다.

    • HI : 나머지 저장
    • LO : 몫 저장
  • 명령어들(Instructions)

    • div rs, rt / divu rs, rt
    • 0으로 나누는 것을 확인하거나 오버플로우를 확인하지 않는다
      • 따라서, 만약 필요하다면 소프트웨어가 이를 먼저 확인해야만 한다.
    • mfhimflo 를 통해서 결과값에 접근할 수 있다.

1개의 댓글