캐시 적중률 99%면 충분할까: 평균 접근시간이 숨긴 비용
책상에서 못 찾은 한 번의 무게
자주 읽는 책을 책상 위에 두면 서고까지 걸어갈 일이 줄어든다. 그러나 책상이 너무 넓고 복잡해지면 그 위에서 찾는 일도 느려진다. CPU 캐시는 이런 작은 작업 공간이다. 빠른 메모리에 필요한 데이터 일부를 보관해, 더 멀고 느린 메모리까지 가는 횟수를 줄인다.
캐시가 활용하는 성질은 지역성이다. 방금 쓴 데이터를 다시 쓰기 쉬운 시간적 지역성과, 방금 접근한 주소 주변도 곧 읽기 쉬운 공간적 지역성이다. 그래서 데이터를 하나씩만 가져오기보다 일정 크기의 묶음인 캐시 라인으로 옮긴다. 하지만 프로그램이 늘 같은 패턴으로 움직이지는 않는다. 한 번 읽고 버리는 큰 데이터와 작은 배열을 반복하는 작업은 같은 용량의 캐시에서도 결과가 다르다. Cornell CS3410, 캐시와 지역성
적중률을 시간으로 바꾸는 식
원하는 데이터가 캐시에 있으면 적중, 없으면 미스다. 적중률만으로 성능을 판단하기 어려운 이유는 실패 한 번의 비용이 크기 때문이다. 이를 묶어 보는 기본 지표가 평균 메모리 접근시간, AMAT다.
AMAT = h + m × p
h는 캐시 확인과 적중 데이터 반환에 걸리는 시간, m은 접근 중 미스 비율, p는 미스일 때 추가로 드는 평균 시간이다. 모든 접근에 기본 h를 쓰고, 실패한 접근에만 p를 더하는 모형이다. 미스 때 걸리는 전체 시간을 p에 넣으면 h를 두 번 세게 되므로 정의를 맞춰야 한다.
설명용으로 h가 1ns, 적중률이 99%, p가 100ns라고 하자. 미스 비율은 0.01이므로 AMAT는 2ns다. 실패는 백 번에 한 번뿐인데, 그 추가 비용이 평균 시간의 절반을 차지한다. 캐시 확인 시간만 20% 줄여 0.8ns로 만들어도 평균은 1.8ns가 되어 개선은 10%다. 어떤 항목을 개선하는지가 중요하다. Berkeley CS61C, AMAT의 정의
더 큰 캐시가 항상 더 빠르지는 않다
용량을 늘리면 작업 중 다시 쓸 데이터를 더 오래 담아둘 수 있다. 대신 저장 배열과 배선이 커지고 탐색 경로도 부담을 받는다. 앞 예에서 큰 캐시가 적중률을 99.5%까지 높였지만 h가 1.8ns가 되었다고 가정하자. p가 같다면 평균은 2.3ns다. 미스는 절반이 되었는데도 전체 접근은 느려졌다. 실제 제품 수치가 아니라, 적중률과 접근 지연을 함께 봐야 한다는 계산 예다.
미스의 이유도 나눠야 한다. 처음 읽는 데이터라서 없는 경우, 작업 데이터가 용량을 넘어 밀려난 경우, 서로 다른 주소가 같은 저장 후보 자리를 다투는 경우가 있다. 마지막 충돌은 한 주소가 들어갈 후보 자리를 늘리는 연관도로 줄일 수 있지만, 주소를 비교하고 결과를 고르는 회로도 복잡해진다.
라인을 크게 만들면 주변 데이터를 미리 얻는 장점이 있다. 반면 쓰지 않을 데이터까지 가져와 전송량을 늘리고, 같은 총용량에서 담을 수 있는 라인 수를 줄인다. 그래서 캐시 크기·라인 크기·연관도는 각각 별개의 설계 손잡이다. 가까운 L1은 빠른 적중에, 그 아래 계층은 더 많은 데이터 수용에 비중을 두는 이유도 여기에 있다. MIT 6.004, 캐시 설계의 상충
평균 지연과 프로그램 실행시간의 간격
계층이 여러 개면 L1 미스의 추가 비용 안에 L2를 확인하고, 필요하면 더 아래로 가는 시간이 들어간다. 이때 L2의 지역 미스율은 L2까지 도착한 요청 중 실패한 비율이다. 전체 요청 중 L2에서도 실패한 비율과 섞으면 계산이 틀어진다.
AMAT가 곧 프로그램 전체의 실행시간인 것도 아니다. 실제 코어는 다른 독립 명령을 실행하거나 여러 메모리 요청을 겹쳐 진행할 수 있다. 반대로 다음 주소를 직전 읽기 결과로 알아내는 작업은 기다림을 감추기 어렵다. 같은 평균 접근시간이라도 의존성과 동시 처리 능력에 따라 체감 성능이 달라진다. IIT 연구진, 동시 접근을 고려한 C-AMAT
캐시 성능을 보려면 얼마나 자주 맞혔는지, 맞혔을 때 얼마나 빨랐는지, 틀렸을 때 얼마를 기다렸는지를 함께 물어야 한다. 그리고 그 기다림 중 실제 계산을 멈춘 부분이 얼마인지까지 확인해야 한다.