컴퓨터 구조 - 3

컴퓨터 구조 3강

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


Instruction Set

컴퓨터(processor)에서 지원하는 명령어의 집합. processor마다 다른 instruction set을 갖고 있지만 대부분 비슷하다.

초창기 컴퓨터들은 simple instruction set을 가졌다. 그 다음에는 CISC(Complex Instruction Set Computer)가 나왔고 현대에 와서는 다시 RISC(Reduced Instruction Set Computer)를 사용한다. CISC의 대표적인 예시로는 인텔이 있고, RISC의 대표적인 예시로는 MIPS, ARM 이 있다.

Q1) 왜 RISC를 쓰는 것이냐?

A1) 전통적인 CISC CPU에는 프로그래밍을 돕기 위한 많은 수의 명령어와 주소 모드가 존재했다. 그러나 그중에서 실제로 쓰이는 명령어는 몇 개 되지 않는다는 사실을 바탕으로, 적은 수의 명령어만으로 명령어 집합을 구성한 것이 RISC이다. 그래서, RISC는 CISC보다 구조가 더 단순하다. 복잡한 연산도 적은 수의 명령어들을 조합하는 방식으로 수행이 가능하다. - 출처


ISA(Instructioin Set Architecture)

HW와 low level SW(OS) 사이의 interface. 모든 정보는 instruction을 통해서 processor에게 전달되는 것.


ABI(Application Binary Interface)

ISA와 OS의 조합. Binary portability를 결정하는 조건. 어떤 application이 해당 컴퓨터에서 실행될지 안될지를 판단할 때 쓰인다. 향후 Study 태그에서 더 자세히 다루도록 하겠다. 같은 OS여도 intel CPU인지 ARM CPU인지에 따라 프로그램이 실행이 안 될 수도 있다.


MIPS Instruction Set

1초에 몇백만개의 instruction을 실행키는지 나타내는 연산속도의 단위에서 따온 말이다. 본 강의에서는 해당 MIPS를 사용하여 강의를 진행할 것이다.

예전에 임베디드 시스템 쪽에서 많이 사용됐다. 현대 ISA의 전형적인 예시이다. MIPS가 다른 최선 processor와 공통된 부분이 많다.


Arithmetic Operation(산술연산)

Add, subtract하는데 3개의 operand가 필요하다. 2개는 연산대상(source), 나머지 1개는 연산결과(destination)를 저장.

add a, b, c # a <- b + c

모든 Arithmetic Operation은 위 구조를 따르게 된다.

Process 만들 때 4가지 design principle 중 1번째

  1. Simplicity favors regularity

    간단하게 만들기 위해선 regularity가 있어야 한다. regularity는 implementation을 간단하게 만든다. 간단하게 만들면 저비용으로 고성능 구현이 가능하다.


Arithmetic Operation Example

우리가 코드를 작성할 땐 C code 1줄이지만, 실제로는 processor가 3개의 instruction을 실행하는 것으로 바뀌어진다. Compiler가 위와 같이 코드를 processor가 실행하기 좋게 바꾼다.


Register Operand

Process 만들 때 4가지 design principle 중 2번째

  1. Simplicity favors regularity

  2. Smaller is fast

    register는 용량이 작지만 가장 빠르다.


Register Operand Example


Byte Address

대부분의 processor들은 byte가 기본단위이다.


Memory Operands


Memory Operand Example 1


Memory Operand Example 2


Register vs Memory


MIPS Register File

ca3_1

CPU가 매번 memory에 access해서 값을 읽어 오는 것은 overhead가 큰 일이다. Register는 memory보다 빠르기 때문에 overhead가 적고, 이는 CPU안에 register가 있는 이유다. 그러나 register의 개수를 늘리거나 port를 늘릴수록 속도는 낮아지기 때문에 좋다고 계속 늘리면 안된다.


MIPS Register Convention

ca3_2

이 부분에 대해서는 나중에 다시 다룰 예정이다.


Immediate Operands

Operand 중 하나가 상수인 경우에 immediate operand라고 한다. 명령어 뒤에 i를 붙인다.

addi $s3, $s3, 4 # s3 <- s3 + 4

memory에 access해서 4라는 값을 가져온 뒤 연산을 하는 것보단, arithmetic 연산에서 4를 상수로 표현할 수 있다면 memory access가 필요 없으므로 성능을 향상시킬 수 있다. load명령을 사용 안했기에 instruction 하나를 줄여서 성능향상.

addi $s2, $s1, -1

MIPS에서 immediate instruction으로 sub명령어는 지원을 안한다. 따라서 상수에 음수값을 넣어서 계산해준다.


Process 만들 때 4가지 design principle 중 3번째

  1. Simplicity favors regularity

  2. Smaller is fast

  3. Make the common case fast

    작은 상수값은 흔하게 쓰인다. 따라서 흔히 쓰이는 상수값들을 immediate operand를 사용해서 연산하고, memory에 load를 피함으로써 성능향상.


The Constant Zero

MIPS의 regiset 0은 $zero이고 항상 0의 값을 가진다. 덮어쓰기가 안되고 읽기만 가능한 register이다. 이걸 쓰면 다른 명령어들을 간단하게 구현할 수 있다.

만약 $s1의 값을 $t0에 옮기고 싶다면 move, copy등의 명령어가 필요하다. 그러나 $zeroregister가 있다면, add로 간단하게 구현이 가능하다.

move $t0, $s1 # t0 <- s1
# mov명령어 대신,
add $t0, $s1, $zero # t0 <- s1 + 0 = s1

따라서 $zero를 써서 MIPS에서 move라는 추가적인 명령어를 만들 필요가 없게 된다.



MIPS Instructions

  1. 32bit instruction word로 돼있다.

  2. Opcode(operation code), register number 등 명령어로 만들 format이 별로 없다.

    -> 간단학 regularity 해서 고성능을 낼 수 있는 것.


R-format Instructions(Arithmetic operation)

ca3_3

rs, rt으로op의 연산을 하여 rd에 저장.

Ex) $s1, $s2 register로 add연산을 하여 $t0에 저장.

하나의 instruction에 여러개의 register가 있음을 알 수 있다. 아까 위에서 공부했던 MIPS Register File에서 code density가 향상된다고 했었는데 이러한 이유 때문이었음을 알 수 있었다.


R-format Example

ca3_4

add $t0, $s1, $s2

결과를 binary code(=machine code)로 다시 표현하면, \(00000010001100100100000000100000 = 02324020_{16}\) 과 같이 되고 이런 machine code가 CPU에게 add $t0, $s1, $s2라는 명령을 진행하라고 하는 것이다. Machine code(=binary code)는 사람이 보면 이해를 할 수 없고 CPU만 이해할 수 있다.


I-format Instructions

ca3_5

I-format1개로 2개의 instruction을 지원한다. Load/StoreImmediate arithmetic이다.

Q3) memory가 만약 4GB쯤 된다면 address field가 16bit밖에 표현 못하면 문제 있는거 아닌가?

A3) 그래서 address field를 offset으로 사용하는 것이다. 16bit address field로 memory의 모든 용량을 표현할 수 없기 때문에 displacement addressing방식을 사용하여 rs를 기준으로 16bit(address field)만큼의 offset을 더하고 빼서 주소를 표현하는 것이다. 따라서 우리가 표현할 주소는 rs + address field가 된다.


Process 만들 때 4가지 design principle 중 4번째

  1. Simplicity favors regularity

  2. Smaller is fast

  3. Make the common case fast

  4. Good design demands good compromises

    immediate arithmeticeLoad/Store instruction은 별개의 명령어이다. 하지만 이 2개가 같은 format을 사용한다. format이 많아지면 복잡해지기 때문에 최대한 간단히 만들어야 한다.


Logical Operation

ca3_6


Shift Operations

ca3_3


AND Operations

ca3_7

Bit 단위로 AND연산을 한다. 어떤 특정한 값을 masking할 때 쓰인다.


OR Operations

ca3_8

어떤 특정한 bit를 1로 만들고 나머지 값은 유지하고 싶을 때 쓴다.


NOT Operations

ca3_9

NOToperation은 MIPS에 없어서 NOR로 구현했다.


Conditional Operations

만약 해당 조건이 True라면 labeled instruction으로 branch한다. 그렇지 않으면 그 다음 명령어를 순차대로 실행.

beq rs, rt, L1 # if rs==rt, then go L1. otherwise go next instruction.
bne rs, rt, L1 # if rs!=rt, then go L1. otherwise go next instruction.
j L1 # go L1 unconditionally


Compiling IF Statements