Branch Log · Open in interactive viewer →

5 cache (Part II)

5.6 Cache Misses

cache hit의 경우 CPU는 평소대로 동작한다. 하지만 cache miss가 일어나면 item을 refill해야 한다.

예외나 인터럽트와 다르게, cache miss는 penalty로 pipeline stall만 발생한다.

  1. cache miss가 일어난 instruction address(원래의 PC 값)를 가져온다.
  1. memory hierarchy의 lower level에서 data를 읽는다.
  1. cache entry에 작성한다.(data, tag, valid bit별로 작성)

  2. instruction 수행을 첫 단계부터 다시 시작한다.


5.7 Cache Write

cache에 data를 쓸 때, 고려해야 하는 여러가지 문제가 있다. 예를 들어 store instruction에 따라 어떠한 data를 저장할 때, data cache에만 data를 저장하고 memory에는 저장하지 않는다면(data-write hit 방식) inconsistent(불일치)가 발생한다.


5.7.1 Write-Through

cache와 memory에 data를 항상 동시에 update하는 Write-through(즉시 쓰기) 방식을 고려할 수 있다. 그런데 이 방식은 write에 너무 긴 시간이 필요하다.

   📝 예제 2: Write-Through 방식의 성능 저하   

다음 조건에서 write-through 방식에 따른 성능 저하를 계산하라.

base CPI란 cache hit만 일어날 때의 CPI를 뜻한다.

   🔍 풀이   

따라서 10배 이상의 성능 저하가 발생한다.


5.7.2 write buffer

Write-Through의 문제를 해결하는 방안으로 write buffer를 사용할 수 있다. processor는 data를 cache와 write buffer에 동시에 쓴다.

그러나 buffer가 memory에 쓰는 시간이, processor가 buffer에 쓰는 시간보다 느리면 stall이 발생할 수 있다. 혹은 buffer의 쓰기 속도가 memory system이 받아들이는 속도보다 stall이 발생할 수 있다. 따라서 보통 buffer entry를 2개 이상으로 둔다.


5.7.3 Write Back

Write Back이란 data-write hit 때, 오직 cache block만을 update하고 main memory는 늦게 update하는 방식이다.(lazy write)

그렇다면 언제까지 main memory에 update하는 일을 미룰 수 있을까? 바로 cache block 단위로 update(replace)하는 상황이 발생할 때다. cache block이 overwriten될 때 main memory를 update한다.

Write Back의 구현을 위해서 dirty bit를 둔다. dirty bit(status bit)란 해당 data가 새로운 값으로 수정이 되었다는 사실을 나타낸다. update 때 dirty bit를 참고하여, 새로운 값만 main memory에 update하게 된다.


5.7.4 Write Allocation

cache write를 시도했을 때, cache miss까지 일어나는 경우의 정책도 생각해야 한다. write하려는 memory address data가 cache에 존재하지 않는다면, cache에 data를 가져와서 write를 수행할지 말지를 결정해야 한다.

write allocate

no write allocate

Write Back의 경우, 주로 write allocate를 사용한다.


5.8 Split Cache

대부분의 processor는 pipelining의 효율적인 구현을 위해, instruction cache, data cache를 나누는 split cache(분할 캐시) 기법을 사용한다.

일반적으로 split cache를 합친 크기와 동일한 크기의 combined cache(통합 캐시)가 살짝 더 좋은 hit rate를 보이지만, 그럼에도 split cache를 사용함으로써 cache bandwidth(캐시 대역폭)이 두 배로 늘어나게 된다.

split cache의 또 다른 장점으로 conflict miss가 줄어드는 이점도 있다.

이러한 점 때문에 cache performance는 단순히 miss rate만으로 측정하지 않는다.


5.9 Measuring Cache Performance

cache가 가진 성능은 CPU time으로 비교할 수 있다. cache 관점에서 CPU time은 크게 두 종류로 나눌 수 있다.

따라서 전체 CPU time은 다음과 같이 계산할 수 있다.


5.9.1 Memory Stall Cycles

memory stall clock cycles(메모리 지연 클럭 사이클)은 Read-stall cycles, Write-stall cycles의 합으로 나타낼 수 있다.

대부분의 Write-Through 방식 cache에서 write buffer stalls가 충분히 작다면, Read-stall cycles와 Write-stall cycles는 같다고 볼 수 있다. 이 경우 memory stall clock cycles는 다음과 같이 나타낼 수 있다.

   📝 예제 3: I-cache, D-cache miss cycles, Actual CPI 구하기   

일반적으로 I-cache(instruction cache), D-cache(Data cache)의 miss rate를 비교하면, data cache의 miss rate가 더 높다. instruction이 data보다 locality를 더 많이 갖기 때문이다.

I-cache, D-cache의 miss rate는 다음과 같이 가정한다.

두 cache의 miss penalty는 동일하게 100 cycles이라고 가정한다.

base CPI 및 load, store instructions이 차지하는 비중은 다음과 같다.

이때 다음 두 가지를 구하라.

  1. memory-stall miss cycles을 구하라.

  2. Actual CPI를 구하라.

   🔍 풀이   

우선 I-cache에서 instruction miss cycles를 구해보자.

다음은 D-cache에서 data miss cycles를 구해보자.

언뜻 D-cache의 miss rate가 0.04로 더 높아보이지만, 0.36이라는 비율 때문에 penalty는 D-cache가 더 낮다.

따라서 전체 memory-stall miss cycles = 2I + 1.44I = 3.44I cycles이다.

이제 Actual CPI를 구해보자.

만약 pipeline을 개선해서 base CPI를 1 cycles까지 줄였다면 Actual CPI는 1+ 3.44 = 4.44가 된다. memory -stall으로 듣는 시간의 비중을 계산하면 3.44/5.44 = 63%에서 3.44/4.44 = 77%이 된다.

이러한 사실이 memory system의 개선이 얼마나 중요한지를 보여준다.


5.9.2 Average Memory Access Time

그런데 cache가 어느 정도 큰 사이즈를 갖는 경우, cache hit 상황에서 fetch time이 오래 걸릴 수 있다. 특히 hit rate가 클수록 hit time이 cache performance에서 차지하는 비중이 커진다.

따라서 cache hit, cache miss 양쪽을 모두 고려하는 cache performance 지표로 AMAT(Average Memory Access Time)을 사용한다.

   📝 예제 4: AMAT 구하기   

다음과 같은 조건에서 AMAT를 구하라.

   🔍 풀이   


5.10 Associate Caches

memory block을 cache에 mapping하는 더 다양한 방법을 살펴보자.

cache examples


5.10.1 Fully Associative Cache

fully associative(완전 연관) 방식은 memory block을 어떠한 cache entry와도 연관시킬 수 있다. 따라서 indexing이라는 개념이 없다.


5.10.2 N-way Set Associative Cache

n-way set associative cache(n-way 집합 연관 캐시)에서는, n개 entries(entries)를 포함하는 set 단위를 도입한다. cache block 수가 총 8개 있을 때, 다양한 N-way set 예시를 살펴보자.

n-way set

1-way set은 direct mapped, 8-way set은 fully-associative와 동일하다.

그렇다면 memory block은 어디로 mapping이 되는 것일까? 다음과 같은 계산으로 구할 수 있다.

반면 direct mapped cache는 (block number) modulo (#blocks in cache)였다.

   📝 예제 5: direct mapped, 2-way set associative, fully associative   

block address 0, 8, 0, 6, 8를 순서대로 참조한다고 하자. 1 word 크기의 cache block이 4개 있을 때, direct mapped, 2-way set associative, fully associative 방식에서 각각 cache miss가 얼마나 일어나는지 구하라.

이진수 형태: 0000, 1000, 0000, 0110, 1000

   🔍 풀이   

  1. direct mapped cache

DMC example

  1. 2-way set associative

2-way set example

Least Recently Used(LRU) policy를 통해, Mem[8]이 Mem[6]로 replacement되었다.

  1. Fully associative

fully associative example


5.10.3 Set Associative Cache address subdivision

다음은 4-way set associative cache을 구현한 그림이다. memory address가 주어졌을 때, cache entry를 찾는 과정을 자세히 살펴보자.

associative cache diagram

각 set를 sheet라고도 지칭한다.

set가 늘어날수록(associativity가 높아질수록), index bits 수는 줄고 comparator 수, tag bits 수는 늘어난다.


5.10.4 Miss Rate and Associativity

다음은 associativity(연관 정도)에 따라 miss rate가 얼마나 줄어드는지를 나타낸 예시다. 각 그래프를 구분하는 숫자는 data cache의 크기를 나타낸다. 대체로 associativity가 클수록 miss rate가 낮아지는 것을 확인할 수 있다.

data cache miss rate example


5.11 Replacement Policy

direct mapped에서는 무조건 replacement가 일어나므로 정책이 필요하지 않다. 하지만 set associative에서는 block을 어디에 넣을지 선택해야 하고, 동시에 어떤 block을 교체할 것인지 선택해야 한다.


5.12 Sources of Misses

cache misses의 종류는 크게 세 가지로 나눌 수 있다.

지난 예제의 direct mapped cache에서 cache miss 종류를 구분해 보자.

DMC example


5.13 cache design trade-offs

cache design에 따른 trade-offs를 정리하면 다음과 같다.

design miss rate 영향 단점
cache size ↑ capacity misses ↓ access time ↑
associativity ↑ conflict misses ↓ access time ↑(MUX에서 소모되는 시간도 증가: 4-to-1 -> 8-to-1 -> ...)
block size ↑ compulsory misses ↓ miss penalty ↑

5.14 Multilevel Caches

현대 microprocessor는 Multilevel(다단계) cache를 사용한다. primary cache(1차 캐시, L1 cache)에서 실패를 하면 secondary cache(2차 캐시, L2 cache)에 접근하는 방식이다.

   📝 예제 6: Multilevel caches performance   

다음 조건에서 L1 cache만 있을 때, L2 cache가 있을 때, (1) 각각의 miss penalty와 effective CPI와 (2) L2 cache 추가에 따른 speedup을 구하라.

base CPI: 모든 참조(reference)가 L1 cache에 hit할 때의 CPI

   🔍 풀이   

우선 오직 L1 cache(primary cache)만 있을 때, miss penalty와 effective CPI는 다음과 같이 구할 수 있다.

clock rate = 4GHz이므로, 1 clock cycle = 1/4GHz = 0.25ns

반면 L2 cache가 있을 때, miss penalty와 effective CPI는 다음과 같이 구할 수 있다.

따라서 L2 cache를 추가하면서 2.6배 speedup을 얻었다.(performance ratio = 9/3.4 = 2.6)