캐시 크기, 라인 크기, 연관도를 입력하면 주소가 태그, 인덱스, 오프셋으로 어떻게 나뉘는지를 비트 수와 막대로 보여 줍니다. 히트 시간, 미스율, 미스 페널티로 평균 메모리 접근 시간(AMAT)도 계산하므로 캐시 구성이 성능에 어떤 영향을 주는지 확인할 수 있습니다.
결과
주소 분할 (왼쪽이 상위 비트)
캐시 크기, 라인 크기, 연관도에는 2의 거듭제곱을 입력하고, 크기가 라인 크기 × 웨이 수로 나누어떨어지도록 하십시오. 오프셋 비트와 인덱스 비트의 합이 주소 폭을 넘는 경우에도 분할을 계산할 수 없습니다.
라인 수
–
세트 수
–
태그
–
인덱스
–
오프셋
–
평균 메모리 접근 시간 (AMAT)
–
그래프로 보기
다른 입력은 현재 값 그대로 두고, 선택한 입력만 현재 값의 1/4~4배 범위에서 바꿨을 때의 결과입니다. 빨간 점이 현재 값입니다.
주소를 세 개의 필드로 나누기
캐시는 메인 메모리의 데이터를 라인(블록)이라는 단위로 보관합니다. 라인 수는 크기 ÷ 라인 크기이고, 세트 수는 라인 수 ÷ 연관도입니다. 주소의 하위 비트부터 보면, 오프셋은 라인 안의 바이트를 선택하며 log₂(라인 크기) 비트를 차지하고, 인덱스는 세트를 선택하며 log₂(세트 수) 비트를 차지하며, 나머지 상위 비트가 태그가 됩니다. 기본값인 32비트, 32 KB, 64 B, 8웨이에서는 라인이 512개, 세트가 64개이므로 오프셋 6비트, 인덱스 6비트, 태그 32 − 6 − 6 = 20비트가 됩니다.
연관도가 바꾸는 것
크기와 라인 크기가 같을 때 연관도를 두 배로 하면 세트 수가 절반이 되므로 인덱스는 1비트 줄고 태그는 1비트 늘어납니다. 1웨이는 다이렉트 매핑 캐시이고, 웨이 수를 라인 수(기본값에서는 512)와 같게 하면 세트가 하나뿐이고 인덱스가 0비트인 풀 연관 캐시가 됩니다. 연관도를 높이면 주소가 같은 세트에 몰려서 생기는 충돌 미스가 줄어들지만, 더 많은 태그를 병렬로 비교해야 하므로 비교기의 면적, 전력, 히트 시간이 늘어납니다.
평균 메모리 접근 시간 (AMAT)
캐시는 미스율만이 아니라 평균 메모리 접근 시간으로 비교해야 합니다. AMAT = 히트 시간 + 미스율 × 미스 페널티이며, 기본값에서는 4 + 0.05 × 100 = 9사이클입니다. 미스율이 5%에 불과해도 페널티가 크기 때문에 평균은 두 배 넘게 늘어납니다. 캐시를 키우거나 연관도를 높여 미스율을 낮추더라도 히트 시간이 늘어나면 모든 접근이 그 비용을 치르므로 효과가 없습니다. 다단 캐시에서는 L1 미스 페널티를 L2 히트 시간 + L2 미스율 × L2 미스 페널티로 바꾸어 계산합니다.
설계에서의 활용과 주의점
라인을 크게 하면 공간적 지역성을 활용해 미스율이 낮아지지만, 미스 한 번에 옮기는 데이터가 많아져 미스 페널티가 커지고 라인 수가 줄어 충돌이 늘어나므로, 현재 대부분의 CPU는 64 B를 사용합니다. L1 캐시는 TLB가 주소를 변환하는 동안 세트를 읽는 VIPT(가상 인덱스·물리 태그) 방식을 사용하는 경우가 많습니다. 인덱스와 오프셋을 페이지 오프셋 안에 두려면 크기가 페이지 크기 × 연관도로 제한되며, 예를 들어 4 KB × 8웨이 = 32 KB입니다. 태그 폭은 태그 저장 영역의 크기도 결정합니다.
라인 수는 32 KB ÷ 64 B = 512입니다. 4웨이에서는 하나의 세트에 4개의 라인이 들어가므로 세트 수는 512 ÷ 4 = 128 = 2⁷이 되고, 인덱스는 7비트, 태그는 32 − 7 − 6 = 19비트가 됩니다. 512는 라인 수 자체이며 다이렉트 매핑일 때의 세트 수입니다. 연관도를 높이면 세트 수가 줄고 그만큼 태그 비트 수가 늘어나며 비교기도 늘어납니다. 32는 라인 크기 64를 잘못하여 웨이 수로 나눈 값입니다.
평균 메모리 접근 시간 = 히트 시간 + 미스율 × 미스 페널티 = 2 + 0.04 × 150 = 2 + 6 = 8사이클입니다. 히트 시간은 모든 접근에서 소요되고, 미스했을 때만 미스 페널티가 더해진다고 생각합니다. 6사이클은 미스 분량만 계산하고 히트 시간을 더하는 것을 잊은 값입니다. 152사이클은 미스한 접근 1회에 걸리는 시간이며 평균이 아닙니다. 미스율이 겨우 4%여도 평균이 4배가 된다는 것을 알 수 있습니다.
오프셋은 64 = 2⁶이므로 하위 6비트, 인덱스는 세트 수 64 = 2⁶이므로 그 위의 6비트입니다. 0x1234 = 4660을 64로 나누면 4660 ÷ 64 = 72 나머지 52이므로 라인 번호는 72입니다. 세트 번호는 라인 번호를 세트 수로 나눈 나머지로, 72 mod 64 = 8이 됩니다. 52는 64로 나눈 나머지로 라인 내 위치(오프셋)를 나타내는 값입니다. 4는 주소 16진수의 마지막 한 자리를 꺼낸 것뿐인 값이며 세트와는 관계가 없습니다.
자주 묻는 질문
라인 크기 64 B, 32비트 주소인 32 KB 다이렉트 매핑 캐시의 태그는 몇 비트입니까?
0비트입니다. 세트가 하나뿐이므로 오프셋을 제외한 모든 비트가 태그이며, 태그를 모든 라인과 비교합니다. 이 계산기에서 연관도를 라인 수와 같게 설정하면 확인할 수 있습니다.
미스율을 절반으로 줄이는 것과 히트 시간을 1사이클 줄이는 것 중 어느 쪽이 더 효과적입니까?
기본값(히트 시간 4사이클, 미스율 5%, 미스 페널티 100사이클)에서 미스율을 2.5%로 하면 AMAT가 9사이클에서 6.5사이클로 줄고, 히트 시간을 3사이클로 하면 8사이클이 되므로 여기서는 미스율 쪽이 더 중요합니다. 미스 페널티가 작으면 결과가 뒤바뀔 수 있으므로 AMAT 공식으로 비교하십시오.