cache hit rate

캐시히트율 올리는 방법

메모리에는 캐시 메모리가 있었고, cpu가 처리 할 것을 예상해서 저장하는 것이 캐시 메모리의 역할이라고 언급했었다. 그리고 저장한 내용이 예상 값과 일치한 것이 캐시 히트 (Cache Hit) 이고 일치하지 않는다면 캐시 미스 (Cache Miss) 라고 했다. 또한 예상 일치한 통계가 캐시 히트율 (Cache Hit rate) 라고 했는데, 이 것들을 향상시키기 위해선 지역성의 원칙을 활용하면 향상 시킬 수 있다고 했었다. 그렇다면 이러한 방법밖에 없는가?

캐시 히트율을 향상시키는 여러 방법

캐시 히트율을 향상 시키기에는 지역성의 원칙 또한 중요하지만, 캐시 크기를 키우거나 블록 크기를 조정하는 방식도 있다. 여러 방면에서 본다면 캐시 히트율을 높이는 방법은 여러 Layer에서 협력해서 이루어진다는 것이다.

우선 지역성의 원리를 포함해서 여러 방법들을 알아보자.

  1. 지역성의 원칙 활용 이전에 언급한 내용과 같이 지역성의 원칙은 크게 시간 지역성공간 지역성으로 나누어 볼 수 있다.
    • 시간 지역성은 최근 사용한 데이터를 곧 또 사용한다는 가능성을 기반하는 것이다. 즉, 자주 접근하는 데이터 일 수록 캐시 메모리에 저장되어 있으면 캐시 히트율이 향상될 수 있다.
    • 공간 지역성은 인접한 데이터를 사용한다는 가능성을 기반하는 것이다. 데이터를 연속적으로 배치해서 불러온다면 캐시 히트율이 향상될 수 있음을 의미한다. 가령 엑셀 표의 경우 행 단위로 불러오는 경우가 많기에 이런 데이터들을 캐시 메모리에 적용하는 것과 마찬가지다.

  2. 캐시 크기를 키우는 방법 애초에 캐시 크기를 키운다면 더 많은 데이터를 저장할 수 있기 때문에 캐시 히트율이 높아질 것이다.

  3. 캐시 블록 크기 조정 캐시 블록 (라인) 크기를 조정하는 것도 중요하다. 너무 작다면 자주 메모리에 접근해야 하고, 너무 크면 필요 없는 데이터까지 불러와 낭비가 발생한다. 따라서 프로그램 패턴에 맞추어 적절한 블록 크기를 고르는 것이 중요하다.

  4. 캐시 교체 정책 최적화 아예 데이터를 교체하는 식으로 관리하는 방법도 있다. 예를 들어 LRU(Least Recently Used)같은 정책을 사용하여 오래 안쓰면 데이터를 교체하는 방식을 의미하다. 적절한 교체 정책을 사용하면 히트율을 향상시킬 수 있다.

  5. 프리 페칭 기법 CPU가 먼저 언급하는 전략이다. CPU가 다음 번에 사용할 것 같은 데이터를 미리 캐시 메모리에게 전달하여 미리 불러오는 전략이다. 이 기법은 예측이 정확해야 히트율이 올라가지만, 설계를 잘 한다면 효과가 크다

  6. 프로그램 최적화 프로그램 설계도 꽤나 중요하다. CPU가 메모리 접근 패턴을 개선하게 하는 것이다. Array 접근 패턴을 순차적으로 접근한다면 공간 지역성의 원리를 사용하는 것과 마찬가지이다.

어떤 레벨에서 협력될까

여러 Layer를 통해 협력하여 캐시 히트율이 향상된다고 언급했었다. 즉, 하드웨어, 운영체제, 컴파일러, 프로그래머의 여러 계층을 통해 향상된다. 하드웨어의 경우는 빠르고 큰 캐시를 만들면 되고, 운영체제는 메모리 캐시 정책, 컴파일러는 코드를 친화적으로, 프로그래머는 코딩할 때 캐시 사용을 고려하는냐에 따라 달라진다.

범주방법설명
하드웨어 (CPU설계)- 캐시 크기 확대
- 캐시 레벨 분할 (L1~3)
- 고급 교체 정책
- 프리페칭 회로 설계
CPU 제조사가 캐시를 크게 만들거나
더 잘 예측할 수 있도록 설계
운영체제 (OS)- 파일 시스템 캐시
- 메모리 매핑 최적화
- 캐시 플러시/클리어 정책
파일 읽기/쓰기 시 디스크 대신 캐시 메모리를 쓰게 하거나
효율적으로 페이지를 관리하는 것
컴파일러- 메모리 접근 최적화
- 캐시 친화적 코드 재배치
컴파일할 때 CPU 캐시를 잘 활용하도록 코드를 자동으로
바꿔주는 최적화 (루프 순서 변경 등)
프로그래머- 데이터 구조 최적화
- 연속 메모리 접근
- 지역성 고려
직접 코딩 시 캐시를 잘 활용할 수 있도록 신경 쓰는 방법



참고자료

※ 이 글은 『이것이 컴퓨터 과학이다』 책을 기반으로, 다양한 자료를 참고해 작성했습니다.