KOCW 최규상 교수님 컴퓨터구조 강의 정리
이 글은 공부한 것을 복습 및 기록하기 위한 게시물입니다.
잘못된 정보가 기입되어 있을 수 있으니 주의해주시기 바랍니다.
참고 : 컴퓨터 구조 및 설계 - David A. Patterson,John L. Hennessy
강의 링크 : http://www.kocw.net/home/cview.do?lid=bae6f412d7ecafe8
1. Instruction Set
Instruction Set은 컴퓨터에서 사용되는 instruction의 집합이다.
다른 컴퓨터들은 각기 다른 Instruction Set을 가지게 된다.
하지만 대부분의 경우 공통된 특성을 가지고 있다.
초창기 컴퓨터들은 매우 단순한 Instruction Set을 가지고 있었으며 Instruction Set의 종류가 적었다.
최근 CPU들 또한 단순한 Instruction Set을 가지게 된다.
물론 초창기와 최근 사이에 complex instruction set을 가지는 CPU들이 존재했었다.
단순 - 복잡 - 단순의 과정을 거친 것이다.
1-1. Instruction Set Architecture(ISA)
ISA는 H/W와 가장 낮은 레벨의 S/W(ex.시스템 소프트웨어or 운영체제임)간에 인터페이스이다.
이런 ISA를 사용하여 필요한 정보들을 machine에 주는 것이다.
즉 필요한 정보를 Instruction에 담아서 H/W(CPU)에 주면 H/W는 그 Instruction을 실행한다.
ISA를 사용하면 똑같은 소프트웨어를 실행할 때 성능과 비용에 따라 다른 implementation이 가능하게 된다.
즉, ISA만 같다면 같은 소프트웨어를 여러개의 CPU에서 실행할 수 있다는 것이다.
1-2. Application binary interface(ABI)
ABI는 ISA와 O/S의 combination을 칭한다.
ABI는 유저관점에서 아주 중요하다.
ABI가 같다는 것은 어떤 프로그램이 특정 PC에서 실행될 때 그 프로그램은
다른 컴퓨터에서 ABI가 같으면 해당 컴퓨터에서도 실행할 수 있다.
예를 들어 집에서 PC를 사용할 때 MS Word를 사용한다고 하면 , 다른 환경에서도 MS Word를 실행할 수 있다.
그 이유는 두개의 컴퓨터 ABI가 같기 때문이다.
같은 운영체제(윈도우)와 같은 CPU(인텔)를 사용하기 때문이다.
2. The MIPS Instruction Set
MIPS(Million Instructions Per Second)는 컴퓨터의 연산 속도를 나타내는 단위로도 쓰이지만 CPU의 이름이기도 하다.
MIPS는 RISC(축소 명령 집합 컴퓨터)의 구조 및 그 구조를 이용한 MCU를 뜻한다.
임베디드 시스템에서 많이 쓰이고 있으며 최근엔 ARM이 많이 쓰이고 있다.
MIPS에서 사용하는 대부분의 특성은 많은 CPU들에 의해서 공유되고 있다.
2-1. Arithmetic Operations(산술연산)
컴퓨터에서 많이 사용되는 Operations 중 하나인 Arithmetic Operations이다.
어셈블리 언어에서 add a, b, c를 하게 되면 b, c를 더해 a에 할당하게 된다.
모든 Arithmetic Operations은 이와 같은 형태를 갖게 됨
Design Principle 1: Simplicity favours regularity
CPU를 설계하는 첫번째 원칙이다.
규칙성을 주게 되면 구현할 때 수월하다.
간단하게 만들어야 낮은가격으로 높은 성능을 낼 수 있다.
C코드를 MIPS 코드로 컴파일하면 위와 같이 된다.
위 코드에서는 쉽게 이해할 수 있게 변수로 표현되어 있지만 실제로는 레지스터에서 수행되어야 한다.
2-2. Register Operands
Arithmetic Operations은 Register를 사용하게 된다.
MIPS는 32bit Register를 32개 가지고 있다.
32bit data를 'word'라고 칭한다.
자주 사용되는 데이터를 Register에 로딩해서 사용하게 된다.
어셈블리에서는 temporary 값을 사용하는 $t Register와
variables 저장하기 위한 $s Register를 사용하게 된다.
Design Principle 2: Smaller is faster
CPU를 설계하는 두번째 원칙이다.
작을 수록 빠르다는 뜻이다.
대부분의 경우에 해당된다.
메모리의 크기도 작을 수록 빠르다.
Register가 메인 메모리에 비해 훨씬 빠르다.(약 1000배)
위 예제 C 코드에서 g는 s1, h는 s2, i는 s3, j는 s4에 맵핑 되어있다.
MIPS 코드로 컴파일된 코드를 보게 되면 $s1과 $s2를 더해 $t0에 넣고
$s3와 $s4를 더해 $t1에 넣게 된다.
이후 $t0와 $t1을 뺀 다음 $s0에 넣게되며 s0는 f에 맵핑되어 있다.
2-3. byte addresses
대부분의 컴퓨터에서는 메모리를 byte단위로 지정할 수 있게 된다.
- alignment restriction(정렬제약)
대부분의 32bit 프로세서 같은 경우에는 memory address는 word단위로 맞춰진다,
기본 엑세스단위가 32bit이기 때문이다.
Endian은 데이터를 word에 어떤 방식으로 저장할 것이냐를 뜻한다.
Big endian은 leftmost byte로 큰 단위가 앞에 나온다.
Little endian은 rightmost byte로 작은 단위가 앞에 나온다.
대부분의 CPU는 1개의 endian만 지원함
최근 나온 ARM 프로세서는 2개 중 1개를 설정하여 사용할 수 있다.
2-4. Memory Operands
메인 메모리는 데이터를 저장하는 공간으로 사용된다.
Arithmetic Operations에서 이런 데이터를 사용할 경우 메모리에서 레지스터로 데이터를 로딩해야하고
연산의 결과를 레지스터에서 메모리로 써야한다.
그러나 메모리는 byte단위로 엑세스한다.
따라서 각각의 메모리 address는 byte로 되어있다.
또한 word 단위로 정렬되어 있어 address는 4의 배수로 되어 있다.
즉, MIPS는 byte단위로 엑세스되며 word단위로 정렬되고 Big endian을 사용한다.
2-4-1. Memory Operand Example 1
해당 예제 C코드에서 g는 s1, h는 s2, A 배열은 s3부터 연속으로 맵핑되어 있다고 가정한다.
MIPS 컴파일 코드는 위와 같이 되어있다.
A배열에는 8개의 index가 있게 된다.
A[8]의 값을 가져오려면 A[0]로 부터 32byte 뒤에 있는 값을 가져오면 된다.
1개의 배열은 4byte다.
A의 배열은 8개의 index가 있다.
따라서 8개의 index에 4byte씩 곱하게 되면 32byte가 된다.
s3는 A배열의 시작주소이며 s3에 32를 더해야 한다.
load word는 메모리로 부터 데이터를 로딩하는 것이다.
메모리 주소가 필요하며 메모리 주소는 32(s3)으로 표현 된다.
이 값에 32를 더한 메모리 주소에 가서 1word(4byte)만큼 읽어 t0에 넣는 것이다.
t0에는 A[8]의 값이 들어가게 된다.
2-4-2. memory operands ex2
해당 예제 C코드에서 h는 s2, A배열은 s3부터 연속으로 맵핑되어 있다고 가정한다.
MIPS 컴파일 코드는 위와 같이 되어있다.
t0에 A[8]의 데이터를 로딩해온 후 값을 넣어준다.
그다음 s2와 t0를 더해 다시 t0에 넣는다.
store word는 t0에 있는 값을 해당 시작 주소(48($s3))에 저장하는 것이다.
2-5. Registers vs. Memory
Registers는 메모리보다 엑세스시간이 훨씬 빠르다.
MIPS 프로세서에서는 메모리 데이터를 Registers에 로딩을 해서
연산을 한 후 메모리에 저장하는 방식을 택한다.(load store architecture)
MIPS는 명령어가 직접적으로 메모리에 엑세스해서 메모리에 있는 데이터를 연산을 하지 못하고
항상 load라는 명령을 사용해서 메모리에서 데이터를 Registers에 올린 후 연산을 한 다음
다시 메모리에 저장하는 방식을 택하게 된다.
위와 같은 방식을 사용하면 load staore때문에 많은 명령어가 필요하게 된다.
컴파일러는 Registers를 잘사용해야 한다.
variables을 위한 Registers를 효율적으로 잘 사용하는 것이 매우 중요하다.
잘 활용할 수록 메모리를 엑세스하는 횟수가 줄어들게 된다.
Registers optimization(최적화)은 컴파일러, 컴퓨터 구조에서 매우 중요하다.
2-6 MIPS Register File
MIPS는 32개의 32bit 레지스터를 가지고 있으며
2개의 read포트와 1개의 write포트를 가지게 된다.
Register는 메모리보다 빠르다.
Register를 사용하면 컴파일러가 훨씬 수월하며 코드의 접적도가 높다.
메모리를 엑세스할 때 32bit필요하지만 레지스터는 5bit이 필요하기 때문이다.
즉, 코드의 길이가 짧아진다.
코드의 집적도가 높다면 똑같은 일을 할 때 코드가 적다는 것이다.
2-7. MIPS Register Convention
$zero는 하드웨어로 정해져있으며 항상 0을 가지고 Read만 가능하다.
$at은 어셈블러만 사용하도록 예약되어있다.
$a는 function call을 사용하는 araguments로 사용된다.
$v는 returned values를 쓰는데 사용된다.
2-8. Immediate Operands
산술연산에서 기존 add의 피연산자는 모두 Register였다.
그러나 immediate operands는 3개의 피연산자 중 1개가 상수값을 갖는 것이다.
상수 값에서 음수는 add에서 가능하지만 sub에서는 지원하지 않는다.
Design principle 3: Make the common case fast
CPU를 설계하는 세번째 원칙이다.
많이 발생되는 사항을 빨리 처리해야 한다.
프로그램을 하다 보면 아주 적은 값의 상수를 많이 사용한다.
immediate operands를 지원하면 상수값을 바로 사용할 수 있지만
immediate operands이 지원되지 않는다면 메모리에서 항상 로드해야 한다.
immediate operands는 load 인스트럭션을 줄여주며 Make the common case fast의 대표적인 예이다.
2-8-1. The Constant Zero
MIPS의 0번 Resister이다.
Read만 가능한 Resister로 항상 0을 갖게 된다.
Move Instruction을 구현할 때 사용 된다.(복사할 때)
'Computer Science > 컴퓨터 구조' 카테고리의 다른 글
7. Instructions: Language of the Computer 3 (0) | 2021.04.11 |
---|---|
6. Instructions: Language of the Computer 2 (0) | 2021.04.10 |
4. Computer Avstractions and Technology 4 (0) | 2021.04.03 |
3. Computer Avstractions and Technology 3 (0) | 2021.03.31 |
2. Computer Avstractions and Technology 2 (0) | 2021.03.29 |