CPU 캐시

CPU 캐시(CPU cache)는 CPU 구조에 메모리로 사용하도록 구성된 하드웨어 캐시다. CPU 캐시는 메인 메모리에서 가장 자주 사용되는 위치의 데이터를 갖고 있는, 크기는 작지만 빠른 메모리이다. 대부분의 메모리 접근은 특정한 위치의 근방에서 자주 일어나는 경향이 있기 때문에, 데이터를 크기는 작지만 속도가 빠른 캐시메모리에 복사해 두면 평균 메모리 접근 시간을 아낄 수 있다. 프로세서가 메인 메모리를 읽거나 쓰고자 할 때는, 먼저 그 주소에 해당하는 데이터가 캐시에 존재하는지를 살핀다. 만약 그 주소의 데이터가 캐시에 있으면 데이터를 캐시에서 직접 읽고, 그렇지 않으면 메인 메모리에 직접 접근한다. 이때 대부분의 프로세서는 메인 메모리에 직접 접근해서 전송된 데이터를 캐시에 복사해 넣음으로써 다음번에 같은 주소에 프로세서가 접근할 때 캐시에서 직접 읽고 쓸 수 있도록 한다. 현대의 프로세서는 칩 위에 서로 작용하는 다양한 캐시를 담고 있다. 파이프라인 CPU는 파이프라인 안의 여러 포인트로부터 메모리를 접근한다.: 명령어 패치, 가상을 물리로 변환하는 주소 번역, 데이터 페치. 이 자연스러운 디자인은 이러한 포인트 각각에 다른 물리 캐시를 사용하기 위한 것이며 어떠한 물리 리소스도 이 파이프라인 안의 두 포인트를 서비스하도록 설계되어 있지는 않다. 그러므로 파이프라인은 자연스레 적어도 세 개의 구분된 캐시(명령어, TLB, 데이터)에서 작업이 끝나며 각각 저마다 특정한 역할을 수행한다. 빅팀 캐시(victim cache)는 충돌이나 용량 문제로 CPU 캐시에서 빠져나간 블록을 유지시키는 데 이용하는 캐시이다. 빅팀 캐시는 메인 캐시와 리필(refill) 패스 사이에 위치해 있으며 캐시 쪽에서 나온 문제가 된 블록만 유지시킨다. 이 기술은 캐시에서 초래한 불리한 조건을 줄이기 위해 사용한다. HP PA7200에 있던 원래의 빅팀 캐시는 작고 완전히 연결되어 있는 캐시였다. 나중에 AMD K7과 K8과 같은 프로세서들은 더 큰 2차 캐시를 빅팀 캐시로 이용하였으며 커다란 1차 캐시의 콘텐츠에 데이터가 중복되는 현상을 제거하였다. 트레이스 캐시(trace cache)는 인텔 펜티엄 4 마이크로프로세서에서 찾을 수 있다. 트레이스 캐시는 이미 페치되었거나 디코딩된 명령어의 트레이스를 저장함으로써 명령어 페치 대역을 늘리고 전력 소비량을 줄이도록 설계되어 있다. 맨 초기에 널리 트레이스 캐시를 알렸던 사람들은 에릭 로텐버그, 스티브 베네트, 제임스 스미스로, 1996년 "Trace Cache: a Low Latency Approach to High Bandwidth Instruction Fetching"에 출판하면서 알려졌다. 처음 출판했을 때의 미국 특허 5,381,533에서는 인텔사의 알렉스 펠레그와 우리 와이저가 "Dynamic flow instruction cache memory organized around trace segments independent of virtual address line"라는 설명으로 1994년 3월 30일에 공표하였지만 1992년에 이에 대한 응용 분야가 계속되면서 버려지게 되었다. 트레이스 캐시는 디코딩 된 뒤나 빠져나온 뒤의 명령어를 저장한다. 일반적으로 명령어들은 개별 기본 블록이나 동적 명령어 트레이스를 대표하는 그룹에서 트레이스 캐시들에 추가된다. 기본 블록은 분기가 있는 비분기 명령어들의 한 그룹으로 구성되어 있다. 동적 트레이스 (트레이스 패스)는 결과가 실제로 사용된 명령어들만 포함하고 있으며 분기들을 따라가는 명령어들을 제거한다. (실행 중이 아니기 때문에) 동적 트레이스는 여러 개의 기본 블록이 모인 것으로 표현할 수 있다. 이로써 실행 중에 있는 분기들을 걱정하지 않아도 프로세서의 명령어 페치 장치가 여러 개의 기본 블록을 페치할 수 있다. 트레이스 캐시는 인텔 펜티엄 4와 같은 프로세서에서 쓰이며 이미 디코딩된 마이크로 연산들을 저장하거나 복잡한 x86 명령어를 번역하며, 추후 명령어가 필요하면 다시 디코딩할 필요가 없어진다. 또다른 문제는 캐시의 레이턴시(latency)와 히트 속도(hit rate)를 어떻게 조절해야 하느냐이다. 커다란 캐시는 히트 레이트는 높지만 레이턴시가 길다. 수많은 컴퓨터는 여러 수준의 캐시를 사용하고 있으며 작고 빠른 캐시와 크고 느린 캐시를 가지고 있다. 여러 수준의 캐시는 일반적으로 가장 작은 1차 캐시를 먼저 검사하면서 운영을 하는 것이 보통이다. 이때 캐시를 사용하면 프로세서는 최고 속도로 진행한다. 캐시 문제가 적으면 외부 메모리 검사 전에 L2 캐시를 검사하게 된다. 메인 메모리와 가장 빠른 캐시 사이의 레이턴시 차이가 클수록 일부 프로세서는 세 가지 수준의 칩 위의 캐시들을 최대한 이용하기 시작한다. 이를테면 2003년에 아이테니엄 2가 6 MiB 비공유 3차(L3) 캐시를 칩 위에 장착하기 시작했다. IBM 파워 4 시리즈는 256 MiB L3 캐시를 칩 위에 장착하기 시작했다. 새로운 AMD 페넘 시리즈는 L3 캐시 다이에 2MB를 장착한다. 여러 수준의 캐시는 새로운 설계를 도입하고 있다. 이를테면 일부 프로세서에서 L1 캐시 안에 있는 모든 데이터는 L2 캐시 어딘가에도 존재해야 한다. 이러한 캐시들을 철저한 내부 캐시(strictly inclusive)라고 부른다. AMD 애슬론과 같은 다른 프로세서들은 외부 캐시를 가지고 있으며 데이터는 1차 캐시와 2차 캐시 중 한 곳에만 있을 것을 보증하며 두 곳에 동시에 존재하지는 않는다. 그러나 펜티엄 II, III, 4와 같은 다른 프로세서들은 1차 캐시의 데이터가 L2 캐시에도 상주할 것을 요구하지는 않지만 상주 가능성은 언제든 존재한다. 전반적으로 이러한 중간 정책에 따른 명칭이 존재하는 것은 아니지만 대개 이 경우 기본적인 내부 캐시(mainly inclusive)라고 부른다. 외부 캐시의 이점은 더 많은 데이터를 저장할 수 있다는 데 있다. 이러한 이점은 외부 1차 캐시가 2차 캐시와 비슷할 때 크지만 2차 캐시가 1차 캐시에 비해 여러 배 더 크다면 그 이점은 줄어든다. 1차 캐시에 들어가지 못하고 2차 캐시에 접근할 때 L2 캐시의 라인은 L1 캐시의 라인과 교환하게 된다. 이러한 교환은 단순히 내부 캐시가 하는 것과 같이 L2 라인을 L1으로 복사하는 것보다 더 일이 복잡하다. 철저한 내부 캐시의 한 가지 이점은 외부 장치나 다른 프로세서 (멀티프로세서 시스템에서)가 프로세서로부터 캐시 라인을 제거하기를 바랄 때 프로세서가 2차 캐시를 검사하면 된다는 것이다. 내부 캐시를 수행하지 않는 캐시 계급에서는 1차 캐시 또한 검사해야 한다. 한 가지 단점으로는 L1 캐시와 L2 캐시의 연동의 관계가 있다는 것이다.: 2차 캐시가 적어도 1차 캐시만큼 여러 경로가 없을 경우 1차 캐시의 효과적인 연동은 제한을 받는다. 내부 캐시의 또다른 이점은 캐시가 클수록 더 커다란 캐시 라인을 사용할 수 있어서 2차 캐시 태그의 크기를 줄일 수 있다는 데 있다. (외부 캐시는 두 개의 캐시 모두 같은 크기의 캐시 라인을 가질 것을 요구하며 이 요구를 만족하면 캐시 라인은 L2에 접근할 수 있게 된다.) 2차 캐시가 1차 캐시보다 등급 순서가 더 높다면 캐시 데이터는 캐시 태그보다 등급 순서가 더 높게 된다. 커다란 컴퓨터는 가끔 2차 캐시, 그리고 3차 캐시라 불리는 메인 메모리 사이에 다른 캐시가 존재하기도 한다. 이러한 캐시는 CPU의 별도 칩에 추가되어 있으며 2004년 기준으로 2~256 메가바이트의 크기가 존재했다. 칩 외부에 3차 캐시가 존재할 때의 이점은 응용 프로그램의 접근 패턴에 따라 달라진다. 고급형 x86 워크스테이션과 서버는 3차 캐시를 마이크로프로세서 다이에 옵션으로 사용할 수 있으며 속도를 높이고 비용을 상당히 낮출 수 있다. 이를테면 인텔의 제온 MP 제품의 코드 이름 Tulsa는 16 MiB 용량의 3차 캐시를 다이에 놓고 있으며 두 개의 프로세서 코어가 이를 공유한다. 캐시 Gabriel Torres (2007년 9월 12일). “How The Cache Memory Works”.  메모리 파트 2: CPU 캐시