Ch 5: Large and Fast: Exploiting Memory Hierarchy
1. Introduction
1) principle of locality
- Program들은 어떤 특정 시간에는 주소공간 내의 비교적 작은 부분에만 접근한다.
- 즉 access하는 부분을 계속 access한다.
- Temporal locality
- 최근에 참조된 Item이 또 참조될 가능성이 크다.
- e.g., instructions in a loop, induction variables
- Spatial locality
- 어떤 Item이 참조되면 그 근처에 있는 item이 참조될 가능성이 높다.
- e.g., sequential instruction access, array data
2) Takeing Advantage of Locality
- Memory hierarchy
- 자주 사용하는 데이터를 점점 고속의 저장소, 그리고 CPU에 가깝게
- 모든 것을 disk에 저장
- 최근에 access한 항목들을 disk에서 더 작은 DRAM memory로 복사한다.
- 조금 더 최근의 항목들은 DRAM에서 더 작은 SRAM으로 복사한다.
- Cache memroy attached to CPU
3) Memory Hierarchy Levels
- Block (aka line): 복사의 단위 (unit of copying)
- May be multiple words
- Spatial locality, 근처에 있는 것 까지 다 같이 복사해서 word size보다 큰 것이 좋다.
- 만약 원하는 데이터가 upper level에 존재한다면,
- Hit: access satisfied by upper level
- 만약 원하는 데이터가 없다면,
- Miss: block copied from lower level
- Time taken: miss penalty
- Miss ratio: misses/accesses = 1 - hit ratio
- 상층부로 복사해와서, 이제 상층부에서 데이터를 접근한다.
2. Memory Technology
1) Memory Technology (in 2012)
- Static RAM (SRAM)
- 0.5ns - 2.5ns, $500 - $1000 per GB
- Dynamic RAM (DRAM)
- 50ns - 70ns, $10 - $20 per GB
- Flash-based drive (SSD)
- 5us - 50us, $0.75-$1 per GB
- Magnetic disk
- 5ms - 20ms, $0.05 - $0.1 per GB
- 가격 차이가 약 10, 100, 1000배로 늘어난다.
- Ideal memory
- Access time of SRAM, but capacity and cost/GB of disk
2) DRAM Technology
- SRAM → Static RAM, DRAM → Dynamic RAM
- Data는 capacitor(축전기, 콘덴서)의 충전으로써 저장된다.
- Single transistor가 charge(전하)에 access하기 위해 사용된다.
- 주기적으로 데이터를 다시 써 줘야한다.
- Read contents and write back
- DRAM의 “row”에 수행?
a) Advanced DRAM Organization
- DRAM의 bit들은 rectangular array로 구성된다.
- DRAM은 row에 전체적으로 access한다.
- Burst mode: 감소된 latency으로 row로부터 연속적인 word를 제공
- 추가 주소지정 대신 클럭이 연속적인 비트들을 버스트 모드로 전송하게 할 수 있게 한다.
- Double data rate (DDR) DRAM
- rising and falling clock edge에서 데이터가 전송
- Quad data rate (QDR) DRAM
- Row buffer
- 병렬적으로 여러 word를 읽고 다시 쓸 수 있도록 한다.
- Synchronous DRAM
- 각각의 주소를 보내지 않더라도, 연속된 주소에는 burst하게 접근 할 수 있도록 해줌
- bandwidth를 향상
- DRAM banking
- 여러 DRAM에 동시에 access할 수 있도록 해줌
- bandwidth를 향상
c) Main Memory Supproting Caches
- DRAM을 Main memory로 사용
- 고정된 사이즈(width) (e.g., 1word)
- fixed-width clocked bus에 연결되어 있음.
- bus clock은 전형적으로 CPU clock보다 느리다.
- cache block read의 예시로, 아래와 같은 조건이라면,
- address transfer에 1 bus cycle
- DRAM access에 15 bus cycle
- data transfer에 1 bus cycle
- 4-word block을 access 할 때, 1-word-wide DRAM에서,
- miss penalty = 1 + 415 + 41 = 65 bus cycles.
- bandwidth = 16 bytes / 65 cycles = 0.25 byte/cycle
d) Increasing Memory Bandwidth
- 성능은 b가 가장 좋지만, 많은 하드웨어 자원 (큰 bus, …)이 사용되므로, c 형태가 주로 사용된다.
3) Flash Storage
- Nonvolatile semiconductor storage
- 100x - 1000x faster than disk
- Smaller, lower power, more robust
- But more $/GB (beween disk and DRAM)
a) Flash Types
- NOR flash: bit cell like a NOR gate (병렬로 연결)
- Random read/write access
- 임베디드 시스템에서의 instruction memroy로 사용된다.
- NAND flash: bit cell like a NAND gate (직렬로 연결)
- Denser (bits, area), but block-at-a-time access (읽는건 오래 걸리지만 기록에 유리하다.)
- Cheaper per GB
- Used for USB keys, media storage,…
- Flash bit들은 1000’정도의 접근 후 마모된다.
- RAM이나 disk의 대체에는 적합하지 않다.
- Wear leveling: 덜 사용한 block에 data를 remap해서 마모 균등화.
4) Disk Storage
- Nonvolatile, rotating magnetic storage
a) Disk Sectors and Access
- Each sector records
- Sector ID
- Data (512 byte ~ 4096 byes)
- Error correcting code (ECC)
- 결함과 recording error들을 숨기기 위해 사용된다.
- fields와 gaps를 동기화
- Access to a sector involves
- 다른 요청이 먼저 처리되는 것을 기다리는 시간.
- Seek: head를 움직인다.
- Rotational latency
- HDD에서 헤드가 올바른 섹터 위에 위치하면 디스크 자체가 회전하여 올바른 데이터를 헤드 아래로 가져와야 한다.
- Data transfer
- Controller overhead
- 저장 장치의 컨트롤러가 요청을 처리하고, 데이터를 읽거나 쓰는 데 필요한 추가 시간을 말한다.
b) Disk Access Example
- Given
- 512B sector, 15,000rpm, 4ms average seek time, 100MB/s transfer rate, 0.2ms controller overhead, idle disk
- Average read time
- 1/2 / (15,000)60 = 2ms rotational latency
- 512 / 100MB/s = 0.005ms transfer time
- 0.2ms controller delay
= 6.2ms
- 만약에 average seek time이 1ms라면
- Average read time = 3.2ms
- 제조사들은 평균 seek time을 제공한다.
- 모든 가능한 seek에 기반하여서,
- Locality and OS scheduling은 실제 average seek time을 더 줄인다.
- 스마트 디스크 컨트롤러는 디스크상의 physical sector를 할당한다.
- 호스트에게 logical sector interface를 제공한다.
- SCSI, ATA, SATA
- Disk는 cach를 포함하고 있다.
- 접근이 예상되는 sector를 prefetch
- seek과 rotational delay를 피하게 해준다.
3. The Basics of Caches
1) Cache Memory
- Cache memory
- 메모리 계층에서 가장 CPU와 가까운 단계이다.
- X1, …, Xn-1, Xn으로 cache에 접근한다고 했을 때,
2) Direct Mapped Cache
- 위치는 주소로 인해서 결정이 된다.
- Direct mapped: only one choice
- (block address) modulo (#Blocks in cache)
- block의 수는 2^n개 이다.
- 최하위 n비트를 address bits로 사용한다.
- 캐시의 위치에 매핑된 데이터가, 메모리의 어느 특정 block과 일치하는지 알 수 있는가?
- block address를 data처럼 저장한다.
- 실제로는, 오직 상위 비트만을 필요로한다.
- called tag
- 만약 location에 data가 없다면?
- valid bit: 1 = present, 0 = not present
- Initially 0
b) Cache Example
- 8-blocks, 1 word/block, direct mapped
- Initial state
초기 상태
한개의 data가 들어 왔을 때, cache miss 발생 후 채워 넣음
이미 cache에 데이터가 존재하므로 cache hit
1개는 cache에 존재하고, 2개는 없기에 miss
block은 같지만, tag가 다르기에 miss
c) Address Subdivision
- 1024개를 위한 index는 1024 = 2^10이므로, 10개의 비트
- word 단위로 정렬이 되어 있기에, 하위 2 bit는 무시 할 수 있다.
- 나머지 비트인 상위 20 bit가 tag가 된다.
- 즉, cache memory에서 데이터는 32bit이고, index는 10 bit, tag는 20 bit, valid는 1 bit
- and gate를 통해서 valid가 1인지, Tag와 address의 tag가 일치하는지 확인 후 Hit, Miss 결정
- 해당 cache는 teporal locality만 사용한다. 최근 데이터만 사용하기 때문에
d) Example: Larger Block Size
- 64 blocks, 16 bytes/block
- 주소가 1200인 block은 어떤 block number 매핑 되는 가?
- Block address = [1200/16] = 75
- Block number = 75 modulo 64 = 11
- 16-byte이니까, 최하위 4개의 bit를 offset으로
- 64개의 block이기에 6 bit를 Index로 사용한다.
3) Block Size Consideration
- 더 큰 block은 miss rate를 줄인다.
- 하지만 fixed-sized cache
- Larger blocks → block 개수가 줄어듬
- More competition → increased miss rate
- Larger blocks → pollution
- 더 큰 miss penalty
- 줄어든 miss rate의 장점을 상쇄시킬 수 있다.
- “Early restart” and “critical-word-first”가 도와줄 수 있다.
- Early restart → 블록 전체를 기다리지 않고, 블록 내의 요청된 워드가 도달하면 곧바로 실행을 시작하는 것.
- Critical-word-first → 요청한 워드를 먼저 메모리에서 캐시로 전송할 수 있도록 하는 방식
4) Cache Misses
- On cache hit, CPU는 보통처럼 동작한다.
- On cache miss
- CPU pipeline에 stall을 발생시킨다.
- 메모리의 다음 계층에서 해당 block을 fetch 해온다.
- Instruction cache miss인 경우
- Data cache miss인 경우
5) Write-Through
- data-write hit가 발생하면, cache의 block를 바로 업데이트 할 수 있다.
- 하지만 그렇게 한다면 memory와 cache는 동일한 값을 갖지 않는다.
- Write through: cache와 함께 memory도 업데이트 한다.
- 하지만 그렇게 한다면 write가 더 오래 걸린다.
- e.g., if base CPI = 1, 10% of instructions are stores, 메모리에 write가 100cycles,
- Effective CPI = 1 + 0.1*100 = 11
- Soultion: write buffer
- 메모리에 쓸 data를 여기서 가지고 있는다.
- CPU는 즉시 계속 진행한다.
- write buffer가 이미 가득 찬 경우에서만 stall이 발생한다.
6) Write-Back
- Alternative: On data-write hit, cache의 block만 업데이트 한다.
- 각 블록이 다른지(dirty) 추적해야 한다. → dirty bit
- dirty block이 제거될 때에
- 그 때에 메모리에 Write it back 해준다.
- 여기에도 write buffer를 사용해서 메모리에 쓰는 것을 CPU가 기다리지 않게 할 수 있다.
7) Write Allocation
- write miss가 발생한다면?
- write-through의 대안
- Allocate on miss: block을 fetch
- Write around: block을 fetch하지 않음
- 캐시에는 write 하지 않고, 메모리만 직접 업데이트
- 어떤 프로그램은 자주 읽기 전에 전체 block을 쓰기 때문이다.
(e.g., initialization)
- For write-back
- 주로 fetch the block
- what if a write miss on a dirty block?
8) Example: Intrinsity FastMATH
- Embedded MIPS processor
- 12-stage pipeline
- 각 cycle마다 instruction과 data 접근.
- Split cache: I-cache와 D-cache가 나누어져 있음.
- 각각 16KB: 256 blocks x 16 words/block
- D-cache: write-through or write-back (OS가 결정)
- SPEC2000 miss rates
- I-cache: 0.4%
- D-cache: 11.4%
- 해당 접근은 Instruction에 비해서는 확연히 적음
- Weighted average: 3.24% (unified cache: 3.18%)
- 그래서 접근 빈도를 고려햐여 miss비율을 계산하면 확연히 적음
- 각 block 당 16개의 word가 있으므로 어떤 것을 선택할 지 4개의 bit 사용
- 총 블록이 256개이므로 index에 8개의 bit 사용
9) Main Memory Supporting Caches
- main memory를 위해서 DRAMs 사용
- Fixed width (e.g., 1 word)
- fixed-width clocked bus와 연결 됨.
- Bus clock은 전형적으로 CPU clock보다 느리다.
- Example cache block read
- 1 bus cycle for address transfer
- 15 bus cycles per DRAM access
- 1 bus cycle per data transfer
- 4-word block에 대하여, 1-word-wide DRAM
- Miss penalty = 1 + 4x15 + 4x1 = 65 bus cycles
- Bandwidth = 16 bytes / 65 cycles = 0.25 B/cycle
- CPU time (cycle과 clock time)
- (Execution cycles + Memory stall cycles) * Clock cycle time
- Components of CPU time
- Program execution cycles
- Memory stall cycles
- With simplifying assumptions:
- Given
- I-cache miss rate = 2%
- D-cache miss rate = 4%
- Miss penalty = 100 cycles
- Base CIP (ideal cache) = 2
- Load & stores are 36% of instructions
- instrution당 Miss cycles
- I-cache: 0.02 * 100 = 2
- D-cache: 0.36 0.04 100 = 1.44
- Actual CPI = 2 + (2 + 1.44) = 5.44
- Ideal CPU is 5.44/2 = 2.72 times faster
2) Average Access Time
- Hit time도 performance에 중요하다.
- Average memory access time (AMAT)
- AMAT = Hit time + Miss rate * miss penalty
- Example
- CPU with 1ns clock, hit time = 1 cycle, miss penalty = 20 cycles, I-cache miss rate = 5%
- AMAT = 1 + 0.05 * 20 = 2ns
- CPU 성능이 향상되면,
- miss penalty가 점점 더 중요해진다.
- 더 많은 비중을 차지하게 된다.
- 총 시간 중에 프로세서에게 소모되는 시간이 줄어들기에 “메모리에서 소요되는 시간”이 더 많이 차지한다.
- Decreasing base CPI
- 총 시간 중에, 메모리 stall에 소요되는 시간의 비중이 더 크다.
- Increasing clock rate
- 메모리 stall에 걸리는 CPU cycle이 더 많아진다.
- 시스템 성능을 평가할 때, cache behavior을 무시 할 수 없다.
4) Associative Caches
- n-way set associative
- 각 set은 n개의 entries
- Block number는 어떤 set에 매핑되는지 결정한다.
- (Block number) modulo (#Sets in cache)
- 해당 set의 entries들을 한번에 검색해야한다.
- n개의 comparators (fully보다는 비용이 적다.)
- Fully associative
- block이 cahce어디에서나 들어갈 수 있다.
- 모든 entry를 한번에(즉시 동시에) 검색해야 한다.
- entry마다 comparator가 필요하다. (expensive)
a) Associative Cache Example
Fully associative는 set이 1개나 다름없다.
b) Spectrum of Associativity
c) Associativity Example
- 4-block의 caches를 비교
- Direct mapped, 2-way set associative, fully associative
- Block address sequence: 0, 8, 0 , 6, 8
- Direct mapped
5번의 access에 5번의 miss
- 2-way set associative 5번의 access에 4번의 miss, 1번의 hit
- Fully associative
5번의 access에 3번의 miss, 2번의 hit
d) How Much Associativity
- associativity를 증사키리 수록 miss rate는 낮아진다.
- 16-word blocks의 64KB D-cache를 SPEC2000으로 시뮬레이션 한 결과
- 1-way: 10.3%
- 2-way: 8.6%
- 4-way: 8.3%
- 8-way: 8.1%
4-way set associative cache
5) Replacement Policy
- Direct mapped: no choice (그냥 무조건 교체)
- Set associative
- non-valid인 entry가 있다면, 선호한다.
- 그 다음으로는 두가지 방법 중 선택
- Least-recently used (LRU)
- 가장 오랫동안 안 쓴 것을 고른다.
- 2-way, 4-way에서는 할만 하지만, 그 이상은 어렵다.
- Random
- high associativity에서는 LRU와 거의 유사한 성능 수준을 보여준다.
6) Multilevel Caches
- Primary cache는 CPU와 붙어 있다.
- Level-2 cache는 primary cache miss가 발생 했을 때에만 접근한다.
- L1보다 크고 느리지만, main memory에 비해서는 빠르다.
- Main memory는 L-2 cache miss가 발생 되었을 때에 동작한다.
- 최근의 고성능 시스템은 L-3 cache도 갖는다.
a) Multilevel Cache Example
- Given
- CPU base CPI = 1, clock rate = 4GHz
- Miss rate/instruction = 2%
- Main memory access time = 100ns
- primary cache만 사용 했을 때
- Miss penalty = 100ns/0.25ns = 400 cycles
- Effective CPI = 1 + 0.02 * 400 = 9
- L-2 cache를 추가 했을 때
- Access time = 5ns
- global miss rate to main memory = 0.5%
- Primary miss with L-2 hit
- Penalty = 5ns/0.25ns = 20 cycles
- Primary miss with L-2 miss
- Extra penalty = 400 cycles
- CPI = 1 + 0.02 20 + 0.005 400 = 3.4
- Performance ratio = 9/3.4 = 2.6
- L-2 cache를 사용하는 것은 2.6배의 속도 향상이다.
7) Multilevel Cache Considerations
- Primary cache
- L-2 cache
- miss rate를 줄여서 메인메모리에 access하는 것을 줄이는 것에 초점을 둔다.
- hit time은 전체 성능에 큰 영향이 없다.
- 결과
- L-1 cache는 single cache보다 보통 작다.
- L-2 cache는 L-1 cahce보다 더 큰 set associativity를 사용한다.
- L-1 block size는 L-2 block size보다 더 작다.
8) Interactions with Advances CPUs
- Out-of-order CPUs는 cache miss동안에도 instruction들을 실행할 수 있다.
- 보류된 stor동작은 load/store unit에서 머무른다.
- miss에 의존적인 instruction들은 reservation stations에서 기다린다.
- Independent instructions continue
- miss의 효과는 프로그램의 data flow에 의존적이다.
- Much harder to analyze
- Use system simulations
9) Interactions with Software
- Misses는 memory access patterns에 의존적이다.
- algorithm behavior
- Compiler는 메모리 접근을 최적화 한다.
- 이미 효율적인 access를 하는 Quick sort와는 다르게 Radix Sort에서는 컴파일러의 최적화로 더 많은 데이터를 정렬할 때 miss 빈도가 감소하기도 한다.
10) Software Optimization via Blocking
- 목표: replace되기 전에 데이터에 대한 접근을 최대화 한다.
- Consider inner loops of DGEMM:
a) DGEMM Access Pattern
- 행렬의 element가 늘어날 수록 cache miss 비율이 커진다
- cache에 남아 있어야 빨리 데이터를 fetch할 수 있기 때문에.
b) Cache Blocked DGEMM
c) Blocked DGEMM Access Pattern
5. Virtual Machines
1) Virtual Machines
2) Virtual Machines Monitor
3) Example: Timer Virtualization
4) Instruction Set Support
6. Virtual Memory
1) Virtual Memory
- Main memory를 secondary(disk) storage의 “cache”로써 사용한다.
- Programs share main memory
- 각 프로그램들은 private한 virtual address space를 갖게 되며, 자주 사용하는 code와 data를 여기에 두고 사용한다.
- 이 private한 영역은 다른 프로그램으로부터 보호된다.
- CPU와 OS는 virtual address를 physical addresses로 번역한다.
- VM “block” is called a page
- VM translation “miss” is called a page falut
2) Address Translation
- Fixed-size pages (e.g., 4K)
3) Page Fault Penalty
- Page fault가 일어나면 page를 반드시 disk로 부터 fetch해와야 한다.
- 수백만의 clock cycle이 소요된다.
- OS code에 의해 처리된다.
- page fault rate를 최소화하기 위한 노력
- Fully associative placement
- Smart replacement algorithms
4) Page Tables
- placement 정보를 가지고 있음
- page table entry들이 배열로 되어 있고, virtual page number로 색인화 되어 있다.
- 개수가 너무 많기에 빨리 찾기 위해 index 구조
- CPU에 있는 Page table register가 page table이 존재하는 physical memory영역을 가리킨다.
- page가 메모리에 있다면,
- PTE(page table entry)가 physical page number을 갖고 있다.
- 그 와 다른 상태 정보들도 비트로 갖는다. (referenced, dirty, …)
- page가 메모리에 없다면,
- PTE는 Disk에 있는 swap space 정보를 가리키게 된다.
valid가 1이라는 것은 메인 메모리, 0이라면 disk
5) Replacement and Writes
- page fault rate를 줄이기 위해서 LRU 알고리즘이 선호된다.
- page에 접근할 때, Reference bit (aka use bit) in PTE set to 1
- OS는 주기적으로 0으로 초기화 시킨다.
- 즉, page reference bit가 0이라는 것은, 최근에 사용되지 않았다는 것.
- Disk write는 수백만 cycle이 소요된다.
- 한번에 block단위로, 개별적인 byte로 이루어지지 않는다.
- 캐시와 메모리를 함께 업데이트 하는 write-through방식은 비효율 적이다.
- Use write-back
- page가 업데이트 된 것을 알기 위해서 PTE에 dirty bit를 두고 표시한다.
6) Fast Translation Using a TLB
- 원래라면 address translation은 추가적인 memory reference를 필요로 한다. (page table도 메모리에 있기에)
- One to access the PTE
- 실제로 memory access할 때,
- 하지만 page table로의 access는 good locality를 가진다.
- 그래서 PTE를 위한 빠른 cache를 CPU에 두고 사용한다.
- Translation look-aside Buffer (TLB)
- Typical: 16-512 PTEs, 0.5-1 cycle for hit, 10-100 cycles for miss, 0.01%-1% miss rate
- miss는 하드웨어와 소프트웨어에 의해 처리된다.
a) TLB Misses
- 만약 page가 메모리에 있다면,
- page table에 가서 PTE를 받아와서 다시 시도한다.
- hardware에서 처리할 수도 있다.
- 그러려면 page table의 구조가 더 복잡해 지고, 하드웨어 또한 복잡해 진다.
- software가 처리한다면,
- 특별한 exception을 발생시키고, optimized handler로 처리한다.
- 만약 page가 memory에 없다면, (page fault)
- OS가 처리하며, disk로부터 page를 fetch하고, page table을 업데이트 한다.
- 그러고는 fault가 발생했던 instruction을 재시작한다.
b) TLB Miss Handler
- TLB miss indicates
- page는 존재하지만, PTE not in TLB
- page가 메인메모리에 존재하지 않는 것
- 대상 레지스터에 overwrite가 일어나기 전에 TLB miss임을 알아차려야 한다.
- Handler는 page table로부터 PTE를 TLB로 복사해온다.
- 그리고는 Instruction을 재시작한다.
- 만약 page가 실제로 없다면, page fault가 발생한다.
c) Page Fault Handler
- page table의 PTE를 찾기 위한 virtual address가 잘못 되었을 때,
- main memory의 page를 찾으려고 해도 없을 경우
- disk의 swap space에 page를 할당시킨다.
- 교체할 page를 고른다.
- 만약 dirty가 있다면, 이를 disk에 먼저 쓴다.
- page를 메모리로 가져와서 page table을 업데이트 한다.
- 프로세스를 다시 실행가능한 상태로 만든다.
d) TLB and Cache Interaction
- 이전에 배운대로 physical address를 cache tag로 사용한다면,
- cache를 훓기 전에 translate가 필요하다.
- 다른 방식은 virtual address tag를 사용한다.
- TLB는 critical path 바깥에 있을 수 있다.
- aliasing때문에 복잡해진다,
- 다른 virtual address가 같은 shared physical address를 가르키는 것.
- Virtually indexed but physically tagged
7) Memory Protection
- 다른 작업은 각각 고유의 virtual address space를 사용한다.
- 하지만, 다른 작업이 같은 영역 일부를 공유할 수 있다.
- 이러한 잘못된 접근에 대해서 보호할 필요가 있다.
- OS의 도움
- Hardware는 OS protection을 지원한다.
- privileged supervisor mode (aka kernel mode)
- privileged instructions
- Page table과 기타 정보들은 오직 supervisor mode에서 접근 가능
- System call exception (e.g., syscall in MIPS)
- OS는 하나의 프로세스를 다른 것으로 바꿀 것으로 결정한다.
- Context swith는 TLB flushs를 필요로한다.
- 대체로 adding task identifiers
7. A Common Framework for Memory Hierarchy
1) The Memory Hierarchy
- common principle이 메모리 계층의 모든 단계에 적용된다.
- 각 레벨의 hierarchy에서
- block placement
- Finding a block
- Replacement on a miss
- Write policy
2) Block Placement
- associativity에 따라서
- Direct mapped (1-way associative)
- n-way set associative
- Fully associative
- 어떤 부분이든 가능하다. 하나의 set 뿐이고, 해당 set에 모든 block이 들어가 있기 때문에.
- associativity가 높을 수록 miss rate가 감소한다.
- 하지만 복잡성, 비용, 접근 시간이 증가한다.
3) Finding a Block
- Hardware caches
- 비용을 줄이기 위해서, comparison의 수를 줄였다.
- Virtual memory
- full lookup table이 full associativity를 가능하게 해준다.
- miss rate를 줄여서 이득을 보기 위해.
4) Replacement
- miss 발생 시, 교체할 entry를 선택하는 방법
- Least Recently Used (LRU)
- high associativity에서는 복잡하고, 비용이 증가한다.
- Random
- Virtual memory
- 하드웨어의 도움으로 대락적으로 LRU를 구현한다.
- Hardware cache와 달리 LRU를 감당 할 수 있을 정도로 느리게 동작하기 때문이다.
5) Write Policy
- Wirte-through
- upper level과 lower level을 함께 업데이트 한다.
- replacement를 간단하게 만들어주지만, write buffer을 필요로한다.
- Write-back
- 현재 upper level만 업데이트 한다.
- 업데이트 된 block이 교체 될 때, lower level에 업데이트 해야한다.
- 더 많은 상태를 유지해야한다.
- Virtual memory
- 오직 write-back만 가능하다. disk write latency 때문에.
6) Sources of Misses
- Compulsory misses (aka cold start misses)
- block에 처음 접근할 때,
- 처음에는 데이터가 없기에 모두 miss 발생한다.
- Capacty miss
- 유한한 cache size 때문에,
- cache 공간이 부족하기 때문에 행렬 곱에서 blocked cache 사용함.
- 교체된 블럭이 나중에 다시 접근되었을 때,
- Conflict misses(aka collision misses)
- non-fully associative cache에서 발생한다.
- set에서의 entry끼리 경쟁으로 발생한다.
- 전체 크기와 같은 fully associative cache에서는 발생하지 않는다??
7) Cache Design Trade-offs
8. Using a Finite-State Machine to Control a Simple Cache
1) Cache Control
- Example cache characteritics
- Direct-mapped, write-back, write allocate
- Block size: 4 words (16 bytes)
- Cache size: 16 KB (1024 blocks)
- 32-bit byte addresses
- Valid bit and dirty bit per block
- Blocking cache
- CPU는 accee가 완료 될 까지 기다린다.
2) Interface Signals
3) Finite State Machines
- contorl의 단계 진행을 위해서 Finite state machine (FSM)을 사용한다.
- state의 set과 transition을 각 clocke edge마다 한다.
- state의 값은 binary로 encode된다.
- 현재 state는 register에 저장되어 있다.
- 다음 state는, fn(current statem currten input)의 결과로 결정된다.
- Control output signal = f0(current state)
a) Cache Controller FSM
9. Parallelism and Memory Hierarchy: Cache Coherence
1) Cache Coherence Problem
- 2개의 CPU core가 같은 physical address space를 공유한다고 한다면,
- A가 기록한 데이터가 B에는 반영이 안되어있다.
2) Coherence Defined
- Informally: 가장 최근에 쓰여진 값을 read한다.
- Formally:
- P 가 X를 쓰고, P가 X를 읽는다 (개입이 없다.)
- P1이 X를 쓰고, P2가 X를 읽는다 (충분히 늦게)
- P1이 X를 쓰고, P2가 X를 읽는다.
- 모든 프로세스에서 같은 순서에 write하는 것을 본다.
- 결국 X에 대해서 같은 final value를 갖는다?
3) Cache Coherence Protocols
- 멀티프로세서 환경에서 캐시에 의해 동작하는 작업들은 coherence를 보장해야한다.
- data를 local cache에서 주고 받는다.
- 단, shared memory의 bandwidth가 줄어든다.
- read-shared data는 복제한다.
- Snooping protocols
- 한 CPU가 값을 변경할 때, 다른 CPU에게 전달해서 변경을 알 수 있게 한다.
- 각각의 cache가 bus reads/writes를 보고 있다.
- 공유하고 있는 bus 혹은 network가 있어야한다.
- Directory-based protocols
- directory에서 캐시와 메모리가 블록들이 staring status를 recodrd 한다.
- directory에서 각각의 정보를 가지고 있고, 관리한다.
4) Invalidating Snooping Protocols
- cache는 블록에 값을 쓸 때, 독특한 access를 진행한다.
- bus에 invalidate message를 뿌린다.
- 다른 캐시에서는 이후 read에서 cache miss가 발생 한다.
- 소유한 cache에서 업데이트 한 값을 공급해 준다.