오늘 끝나면
캐시의 구조
- ✓캐시의 구조의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 캐시의이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
tag/index/offset·direct/2-way·hit·miss·교체 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
반도체 설계 · 25
캐시의
구조
캐시는 그냥 빠른 메모리가 아니다.
주소를 tag, index, offset 세 토막으로 쪼개 자리를 정하는 구조다.
이 구조가 hit과 miss를 가르고, miss 한 번이 성능을 통째로 잡아먹는다.
주소를 셋으로 쪼갠다, tag·index·offset
캐시는 RAM 전체를 못 담는다. 작은 칸 몇 개에 일부만 들고 있다.
그래서 주소가 들어왔을 때 ‘어느 칸을 볼지’를 빨리 정해야 한다.
그래서 주소를 세 토막으로 쪼갠다.
offset은 한 줄(line) 안에서 몇 번째 바이트인지를 가리킨다. 줄 선택과는 무관하다.
index는 어느 줄(set)로 갈지 정한다. 주소에서 바로 줄 번호가 나온다.
tag는 그 줄에 들어 있는 게 내가 찾는 블록이 맞는지 대조하는 표식이다.
순서가 핵심이다. index로 줄을 한 번에 찾고, 그 줄의 tag만 비교해서 맞으면 hit이다.
한 줄은 offset 비트 수만큼의 바이트를 통째로 담는다. 그래서 가까운 주소는 같은 줄에 같이 들어와 공간 지역성으로 덤 hit가 난다.
이 비트 나눔이 캐시 구조의 전부다.
줄을 몇 개 둘까, direct vs 2-way
같은 index를 쓰는 블록은 한둘이 아니다. 그 충돌을 어떻게 받느냐가 구조를 가른다.
direct-mapped는 index 하나당 줄이 딱 1개다. 주소가 정해지면 들어갈 자리도 한 곳뿐이다.
찾기는 비교 한 번으로 제일 빠르다. 하지만 같은 index의 다른 블록이 오면 무조건 자리를 뺏는다. 이게 conflict miss다.
2-way set-associative는 index 하나당 줄을 2개(way) 둔다.
같은 index라도 way가 둘이라 두 블록이 같이 살 수 있다. 그래서 conflict가 확 줄어든다.
대신 두 way의 tag를 동시에 비교해야 해서 비교기와 면적이 늘어난다.
way를 더 늘릴수록(4-way, 8-way) miss는 줄지만 하드웨어가 커진다. 늘 절충이다. 이 선택이 최종 MyChip 캐시에 들어간다.
셋이 자리 하나를 두고 다툰다. 들어올 때마다 앞 블록을 쫓아낸다(conflict miss)
way가 둘이라 두 블록이 같이 산다. conflict가 줄어든다 (비교기는 2배)
hit·miss·교체, 줄이 꽉 차면
접근 하나가 들어오면 결말은 둘뿐이다. 그 줄에 있으면 hit, 없으면 miss다.
hit은 index로 찾은 줄의 tag가 맞은 경우다. 캐시에서 바로 빠르게 꺼낸다.
miss는 없는 경우다. 느린 메모리에서 그 줄(line)을 통째로 가져온다.
이 가져오는 시간이 miss penalty다. hit보다 한참 비싸다.
줄이 이미 꽉 차 있으면 누군가를 비워야 한다. 그게 교체다.
LRU는 가장 오래 안 쓴 줄을 비운다. 최근 쓴 건 또 쓸 확률이 높으니 살린다.
FIFO는 먼저 들어온 줄을 비운다. 단순하지만 LRU만큼 똑똑하지는 않다.
어떤 정책이든 miss 시 줄을 fetch하는 비용은 똑같이 비싸다. 그래서 miss를 줄이는 게 성능의 핵심이다.
직접 두드린다, 캐시 시뮬
같은 주소 수열을 direct와 2-way에 동시에 태워 hit과 miss, 총 사이클을 나란히 비교한다.
같은 index로 여러 블록이 몰리는 구간에서 direct는 줄이 하나라 자리를 뺏기며 miss가 쌓인다. 2-way는 way가 둘이라 conflict가 줄어 miss가 더 적다.
교체 정책(LRU, FIFO)에 따라 2-way가 어느 줄을 비우는지도 달라진다. 이 구성, 곧 연관도와 교체 정책이 최종 MyChip 캐시로 들어간다.
STEP을 누르면 주소가 tag·index·offset으로 쪼개져 색으로 뜬다. index가 줄을 고르고 tag로 맞는지 비교한다.
끝까지: direct miss 10 · 2-way miss 8 (정책 LRU). miss 한 번에 30사이클을 물어 느린 메모리에서 줄을 통째로 끌어온다(miss penalty). way를 늘리면 conflict가 줄지만 비교기·면적이 늘어난다. 이 절충(연관도 + 교체 정책)이 최종 MyChip 캐시에 들어간다.
왜 구조가 성능의 핵심인가
CPU가 아무리 빨라도 데이터를 기다리면 멈춘다. 그 기다림의 대부분이 캐시 miss다.
hit는 몇 사이클, miss는 수십 사이클이다. 한 자릿수 miss율 차이가 전체 실행 시간을 몇 배로 벌린다.
그래서 같은 명령 수라도 캐시 구조에 따라 체감 속도가 완전히 달라진다.
구조를 잘 짠다는 건 결국 miss를 줄인다는 뜻이다. 줄 크기로 공간 지역성을 살리고, 연관도로 conflict를 줄이고, 교체 정책으로 쓸 줄을 살린다.
24강의 지역성이 ‘왜’였다면, 25강의 tag·index·offset 구조는 그걸 하드웨어로 풀어낸 ‘어떻게’다.
Q. 캐시 miss가 나면 무슨 일이 일어나나?
정답은 느린 메모리에서 해당 줄(line)을 통째로 가져오는 것이다.index로 줄을 찾았는데 tag가 안 맞으면 캐시에 없다는 뜻이다. 메모리까지 다녀와 한 줄을 fetch한다. 이 시간이 miss penalty이고 hit보다 수십 배 비싸다.
줄이 꽉 차 있으면 교체 정책(LRU, FIFO)으로 한 줄을 비우고 그 자리에 새 줄을 채운다. miss를 줄이는 게 캐시 성능의 핵심이다.
| miss율 2% | 3.5사이클 |
| miss율 10% | 5.7사이클 |
| miss율 30% | 11.1사이클 |
평균 = hit×3 + miss율×30. 한 자릿수 miss율 차이가 체감 속도를 몇 배로 벌린다.