중요하다고 생각되는 내용을 정리하였다.
컴퓨터 구조 및 설계 (David A. Patterson) 책도 빌려서 보긴 했는데 어려워서 거의 이해 못했다.
컴퓨터 추상화 및 관련 기술
명령어: 컴퓨터 언어
프로세서
메모리 계층 구조
PMD
Cloud Computing
Response Time (Execution Time)
Throughput
프로세서가 순수하게 프로그램을 실행하기 위해 소비한 시간
Elapsed Time 과는 다르다. (프로그램을 끝내는데 걸린 모든 시간, I/O 와 작업시간등을 포함)
User CPU Time
System CPU Time
- CPU Clock Cycles : 작업을 수행하는 데 필요한 클럭 개수
- Clock Cycle Time : 한 클럭당 수행 시간
- Clock Rate : 1초당 수행하는 클럭 수
문제 : 2GHz 클럭의 컴퓨터 A에서 10초 수행되는 프로그램이 있다. 이 프로그램을 6초 동안에 실행할 컴퓨터 B를 설계하고자 한다. 클럭 속도는 얼마든지 빠르게 만들 수 있는데, 이렇게 하면 CPU 다른 부분의 설계에 영향을 미쳐 같은 프로그램에 대해 A보다 1.2배 많은 클럭 사이클이 필요하게 된다고 한다. 컴퓨터 B의 클럭속도는 얼마로 해야 하겠는가?
풀이
Cycle
부분은Clock Rate
로 해석하는 것이 자연스러워 보인다.
새로운 공정기술이 나올 때마다 전압은 낮아지고, 이로인해 소비전력을 낮출 수 있었다.
오늘날에 이르러, 성능을 높이면서 더이상 전압을 낮출 수 없게되었다.
이로 인해 전력소모를 더이상 낮출 수 없고, CPU에서 발생하는 열을 낮출 수 없게 되었다.
이러한 배경에서 성능을 높이기 위해 도입한 것이 바로 Multi-Processor 방식이다.
일부의 성능 개선으로 전체의 성능을 개선하는데에는 한계가 있다.
컴퓨터의 한 부분만을 개선하였을 때, 개선한 만큼 컴퓨터의 전체 성능이 좋아지지 않는다.
다른 컴퓨터들은 다른 Instruction set을 가진다.
초창기 컴퓨터들은 매우 단순한 Instruction set을 가진다.
최근 컴퓨터들 역시 단순한 Instruction set을 가진다.
Instruction Set Architecture
하드웨어와 가장 낮은 레벨의 소프트웨어 (시스템 소프트웨어) 간의 인터페이스
Simplicity favours regularity
간단하게 하기 위해서는 규칙적인 것이 좋다.
ex) Arithmetic 연산은 모두 유사하다.
Smaller is faster
작은 것이 더 빠르다.
Register는 Main memory 보다 할당할 수 있는 크기가 작다.
Make the common case fast.
자주 생기는 일을 빠르게 하라.
ex) addi 와 같은 명령어 통해 자주 발생하는 작은 상수값 연산을 load 명령어 없이 빠르게 수행
Good design demands good compromises
8-bit ➔ 1-Byte
워드
Alignment restriction (정렬 제약)
메모리 내에서 데이터는 자연스러운 경계를 지키며 정렬된다.
따라서 데이터는 워드 단위로 정렬되고, 워드 단위로 접근할 수 있다.
워드에 데이터를 저장하는 방식
Big Endian
Little Endian
Register 가 Memory 보다 빠르다.
MIPS 프로세서에서 메모리에 있는 데이터에 연산을 하고 싶은 경우
컴파일러에서 Register Optimization 이 매우 중요한 이유이다.
op : operation code
rs : first source register number
rt : second source register number
rd : destination register number
shamt : shift amount
funct : function code
Example
rt : destination
immediate : constant (-2^15 ~ 2^15-1)
address : offset added to base address (rs)
Example,
$t0 = $s3[13]
중간에 브랜치 명령어가 없고
중간에 브랜치 타겟(Label)이 없는 명령어들의 집합
컴파일러는 이러한 Basic Blocks 를 찾아 성능 최적화
Caller 가 Callee 가 접근할 수 있는 곳에 인수를 넣는다.
$a0 ~ $a3
: argument registersCaller 가 Callee 에게 제어권을 넘긴다.
Callee 가 필요로 하는 메모리 자원을 획득한다.
Callee 의 작업을 수행한다.
Callee 작업의 결과값을 Caller가 접근할 수 있는 곳에 넣는다.
$v0 ~ $v1
: result value registersCallee 가 Caller 에게 제어권을 다시 넘긴다.
$ra
: return address registerProcedure call
jal ProcedureLabel
$ra
에 저장ProcedureLabel
로 이동Procedure return
jr $ra
$ra
를 Program counter 에 저장$ra
로 이동int leaf_example (int g, h, i, j) {
int f;
f = (g + h) - (i + j);
return f;
}
- arguments
g, h, i, j
➔$a0, $a1, $a2, $a3
f
➔$s0
, 따라서$s0
는 스택에 저장되어야 한다.- result in
$v0
$s0
은 이전 내역이 지워지면 안되는 레지스터이므로 스택에 저장됨$t0, $t1
은 지역변수이므로 스택에 저장됨leaf procedure
이므로, 인수들은 스택에 저장 안해도 됨
int fact (int n) {
if (n < 1) return f;
else return n * fact(n - 1);
}
- arguments
n
➔$a0
- result in
$v0
non-leaf procedure
는 이전에 caller에서 사용한 인수($a0
)와, callee 에서 사용한 인수가 중복사용될 수 있으므로, stack 에 저장해야한다.Local arrays and structures
영역은, 함수내에서 사용되는 지역변수의 저장 영역$fp
(시작주소) 와$sp
(끝주소) 를 통해 각각의procedure frame
을 구분할 수 있다.
뒤집어서도 많이 표현한다.
Text segment
Static data segment
Heap
Stack
16bits 영역이 offset 임
PC-relative addressing
Program Counter 에 offset 을 더하는 방식으로 주소 이동
Branch 명령어의 목적지는 대부분 근접한 위치에 있기 때문에 이런 간접적인 이동방식을 사용
Direct jump addressing
직접 이동방식
Addressing Mode(주소지정 방식)의 5가지 종류
Static-linking
방식
Compiler
Assembler
Linker
Static Linking 방식
Dynamic Linking 방식
Loader
Loader는 다음 순서로 일을 진행한다.
실행 파일 헤더를 읽어 텍스트와 데이터 세그먼트 크기를 파악
텍스트와 데이터가 들어갈 만한 가상의 주소 공간 확보
실행파일의 명령어와 데이터를 메모리에 복사(저장)
프로그램에 전달해야 할 인수가 있으면, 이를 스택에 복사(저장)
레지스터 초기화
프로그램의 시작 루틴을 호출
main
함수Intel 프로세서는 CISC
MIPS 프로세서는 RISC
Intel 프로세서는 복잡한 명령어를 간단한 명령어 여러개로 내부적으로 나누어 실행
D = input
,Q = output
- Edge-triggered (rising-edge)
Clock period 는 가장 오래걸리는 명령어에 맞춰진다.
load instruction
이러한 성능 저하를 해결하기 위해 파이프라이닝을 사용한다.
여러 명령어가 중첩되어 실행되는 구현 기술
동시에 여러개의 명령어를 처리함으로써 처리량을 올리는 것
- 파이프라이닝을 적용하지 않은 세탁소
- 4묶음을 처리하는데 총 8시간 소요
- 파이프라이닝을 적용한 세탁소
- 4묶음을 처리하는데 총 3.5시간 소요
MIPS 파이프라인은 다섯 단계를 가진다.
IF
: Instruction fetch from memory
ID
: Instruction decode & register read
EX
: Execute operation or calculate address
MEM
: Access memory operand
WB
: Write result back to register
각 단계별로 걸리는 시간
Tc = 800ps
- Single-cycle 방식은 가장 긴 명령어 실행시간(800ps)에 clock period 가 맞춰진다.
Tc = 200ps
- Pipelined 방식은 가장 긴 단계 실행시간(200ps)에 clock period 가 맞춰진다.
파이프라인 구조에서 발생하는 문제
다음 cycle 에 다음 명령어를 실행하지 못하는 경우를 말한다.
3가지 종류가 있다.
리소스 사용의 충돌로 인해 발생
하나의 메모리에 두 개의 명령어가 동시에 접속할 수 없다.
MEM
과 IF
가 동시에 이루어질 수 없다.하나의 메모리를 instruction memory (IF
에서 접근) 와, data memory (MEM
에서 접근)로 분리하여 해결할 수 있다.
리소스를 추가하여 해결할 수 있다.
데이터 종속성에 의해 발생
앞선 명령어의 결과가 바로뒤의 명령어에서 입력으로 필요할 때 발생
ex)
add $s0, $t0, $t1
sub $t2, $s0, $t3
뒤의 명령어가, 앞의 명령어의 결과
$s0
에 의존적이다.
- 앞선 명령어의
WB 전반부
에서 연산 결과를$s0
레지스터에 저장- 뒷 명령어의
ID 후반부
에서$s0
레지스터를 읽기 위해 2 stalls 발생
Data Hazards 의 대표적인 해결방법
어떤 Data의 연산 결과값이 나오면, 그 결과를 바로 사용한다.
WB
) 되는 것을 기다리지 않는다.stall 이 사라진다.
Data hazards 는 다양한 이유로 발생한다.
그 중 하나인, Load-Use Data hazard의 경우엔 forwardingd 으로도 stall의 발생을 막을 수 없다.
- 앞선 명령어의
MEM
에서 불러온 결과를$s0
레지스터에 저장- Forwarding을 하더라도, 1 cycle stall 발생
- 전 명령어의
ID
단계가 끝나야 어디로 분기할지 알 수 있다.- 1 cycle stall 이 발생
브랜치의 결과를 미리 예측할 수 있다.
MIPS의 경우 분기가 항상 발생하지 않는다고 예측한다.
예측이 맞은 경우
예측이 틀린 경우, stall 발생
L1
,L2
는 캐시 (SRAM)- Main Memory 는 DRAM
위 계층일수록 접근속도 ⬆, 비트당 비용 ⬆
아래 계층일수록 사이즈 ⬆
지역성의 원칙
Temporal locality
Spatial locality
캐시는 CPU와 가장 근접한 메모리이다.
Direct mapped cache
Associative cache
연속된 메모리 주소를 블락단위로 가져와 캐시에 저장
- Spatial locality 활용
Index
를 사용해 캐시 저장위치를 정한다.
찾는 데이터의 Index
가 캐시내에 존재할 때 Tag
를 검사해 실제 찾는 데이터와 동일한 지 검사한다.
hit
, 가져다쓰면 된다.miss
, 실제 메모리에 접근하여 캐시를 바꿔친다.찾는 데이터의 Index
가 캐시내에 존재하지 않는다면, 실제 메모리에 접근하여 캐시를 저장한다.
블락 크기를 키우면, miss rate ⬇
캐시 크기가 그대로인데, 블락 크기를 키우면
블락 크기를 키우면, miss 가 발생할 경우 더 많은 블락 정보를 읽어와야 한다.
Cache hit 의 경우, CPU는 정상적으로 수행
Cache miss 발생 시,
CPU pipeline 에 stall 발생
하위 메모리 계층에서 block(데이터)를 찾아 읽어와야 한다.
Instruction cache miss 의 경우
Data cache miss 의 경우
2-way
<-> Direct mapped cache
<-> Direct mapped cache
5 miss 발생
- 4 miss 발생
- 교체 규칙은 LRU (Least-recently used)
3 miss 발생
<-> Direct mapped : 교체 정책 x , 무조건 교체
Least-recently used (LRU)
Random
Secondary storage (disk) 입장에서, main memory 는 캐시와 유사하다.
main memory 를 disk 를 위한 캐시로 사용하는 기술을 Virtual Memory 라 한다.
VM block ➔ page
VM translation 의 miss 발생 ➔ page fault
Virtual Address ➔ 프로그램이 사용하는 주소
Physical Address ➔ 실제 컴퓨터가 사용하는 메모리 주소
Address Translation 을 거쳐, Virtual 메모리는 실제 메인 메모리나 disk로 매핑
- VA : Virtual Address
- PA : Physical Address
Translation 정보는 main memory 에 저장되어 있다.
따라서 캐시에 access 할 때마다 main memory 에 access 하는 것은 큰 낭비이다.
TLB
(Translation Lookaside Buffer) 를 추가하여 이런 낭비를 줄일 수 있다.
TLB
사용
TLB
에서 translation 정보를 먼저 찾아봄으로써, main memory 접근 횟수를 줄일 수 있다.
millions of clock cycles 발생
따라서 page fault rate 을 줄이는 것이 중요하다.
Compulsory misses (cold start misses)
Capacity misses
Conflict misses
출처
KOCW 컴퓨터구조 강의 (영남대학교 - 최규상 교수님)
http://www.kocw.net/home/search/kemView.do?kemId=1125218
컴퓨터 구조 및 설계 (David A. Patterson, 존 헤네시)
암달의 법칙
https://luv-n-interest.tistory.com/419
바이트 어드레싱
https://eine.tistory.com/entry/64%EB%B9%84%ED%8A%B8-32%EB%B9%84%ED%8A%B8-CPU%EC%99%80-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC
프로시저 호출
https://scarletbreeze.github.io/articles/2018-04/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0%EB%A1%A0%285%29.md
메모리 레이아웃
https://gofo-coding.tistory.com/entry/2-MIPS-Non-Leaf-Procedure
캐시
https://inyongs.tistory.com/134