Cache: 두 판 사이의 차이

youngwiki
26번째 줄: 26번째 줄:
위 코드에서 변수 sum은 매 루프 반복마다 계속 사용되는데, 이는 변수의 temporal locality를 보여준다. 또한 배열 a[i]는 인접데이터에 따라 순차적으로 접근되므로, 이는 변수의 spatial locality를 보여준다. 사실 locality는 변수 혹은 데이터에만 적용되는 개념이 아니고, 코드에도 적용된다. 위 코드에서도 루프 안에 있는 add, cmp, jle 등의 명령어는 반복 실행되므로 temporal locality가 적용된다. 또한 위 코드의 명령어들은 메모리에 연속적으로 존재하며, 순서대로 실행되므로 역시 spatial locality가 적용될 수 있다.
위 코드에서 변수 sum은 매 루프 반복마다 계속 사용되는데, 이는 변수의 temporal locality를 보여준다. 또한 배열 a[i]는 인접데이터에 따라 순차적으로 접근되므로, 이는 변수의 spatial locality를 보여준다. 사실 locality는 변수 혹은 데이터에만 적용되는 개념이 아니고, 코드에도 적용된다. 위 코드에서도 루프 안에 있는 add, cmp, jle 등의 명령어는 반복 실행되므로 temporal locality가 적용된다. 또한 위 코드의 명령어들은 메모리에 연속적으로 존재하며, 순서대로 실행되므로 역시 spatial locality가 적용될 수 있다.


==Multi-Level Cache==


==각주==
==각주==

2025년 5월 27일 (화) 00:53 판

상위 문서: 컴퓨터 시스템

개요

캐시(Cache)는 기본적으로 음식, 무기, 보물 등을 저장하는 숨겨진 저장 공간이라는 뜻이다. 컴퓨터 시스템에서는 좁은 의미에서, CPU와 메인 메모리 사이에 위치한 중간 저장소를 의미하며, 최근에 사용된 데이터나 명령어를 저장한다. 이때 캐시는 메인 메모리보다 훨씬 작은 저장 공간을 가지지만, 메인 메모리보다 훨씬 빠르게 접근할 수 있어서 CPU와 메모리 사이의 병목 현상을 줄여준다. 캐시는 컴퓨터 공학 전반에서 더 넓은 의미로 사용되기도 하는데, 두 시스템 사이에서 데이터를 빠르게 전달하기 위한 어떤 중간 저장소도 포함한다. 이런 의미에서 사용되는 예시가 웹 캐시이다. 해당 문서에서는 좁은 의미에서의 캐시에 대해서 다룬다.

Necessity of Cache

캐시가 필요한 핵심적인 이유는, CPU 성능의 발전 속도와 DRAM 메모리 성능의 발전 속도의 차이이다. CPU 성능은 매년 약 55% 향상되지만, DRAM 메모리 성능은 매년 약 7% 향상된다. 이는 CPU와 메모리 사이의 병목 현상을 일으키는 주요 원인이다. 예를 들어 어떤 CPU가 1사이클에 약 256 바이트를 처리할 수 있고, 메모리는 1사이클에 2바이트를 전송 가능하며, 해당 데이터가 메모리에서 CPU까지 도착하는데 10사이클 이상이 소요된다고 가정하자. 이 경우, CPU의 성능과 관계 없이 메모리로부터 적기에 데이터를 전송 받지 못해서 동작이 지연하는 현상이 발생할 것이다.

이때 핵심적인 관찰사항이 하나 존재한다. 이는 "CPU가 어떤 메모리 주소를 한번 접근했다면, 곧 같은 주소를 다시 접근할 가능성이 높다"라는 것이다. 이러한 성질을 temporal locality라고 하며, 이를 바탕으로 CPU가 자주 쓰는 데이터에 대해서 빠르게 접근할 수 있도록 개발된 것이 캐시이다.

Management of Cache

Figure 1. Cache Hit

캐시는 하드웨어에 의해서 자동으로 관리된다. 즉, 캐시는 전적으로 CPU 설계에 따라 동작할 뿐, 어셈블리어등으로 조작될 수는 없다. 또한 캐시는 메모리와 비교했을 때, 그 크기는 작지만 CPU로부터의 접근 시간은 짧다. 따라서 공간이 작기 때문에 메인 메모리 데이터 전체가 아닌 일부만 저장 가능하며, 자주 접근하는 데이터만을 저장해야 한다. 이때 메인 메모리와 캐시 사이에서 데이터를 주고 받은 단위를 block이라고 하며, CPU 설계자가 block의 크기를 결정한다.

Figure 2. Cache Miss

Figure 1, 2는 각각 캐시 히트(hit)와 캐시 미스(miss)의 상황을 보여준다. 먼저 figure 1은 CPU가 블록 14번을 요청했는데 캐시에 이미 14번 블록이 존재하는 상황이다. 이를 캐시 히트라고 하며, CPU는 캐시에서 바로 데이터를 읽어올 수 있고, 메인 메모리에 접근할 필요가 없어 속도가 빠르다. 반면, figure 2는 CPU가 블록 12번을 요청했는데 캐시에 12번 블록이 없는 상황이다. 이를 캐시 미스라고 하며, CPU는 메모리로부터 블록 12번을 가져와야 한다. 하지만 현재의 캐시 공간은 가득 차있기 때문에 기존의 블록 하나를 내보내야(evict) 한다. 이때 캐시 공간에 대한 replacement policy가 적용되고, 해당 예제에서는 블록 9번이 제거된다. 최종적으로 블록 12번이 캐시에 저장되고, 이것이 CPU에 전달된다.

Locality

Locality란 프로그램이 실행되는 동안 같은 데이터나 인접한 데이터에 반복해서 접근하는 경향이다. 캐시는 이 특성을 이용하여 성능을 향상시킨다. 먼저 temporal locality란 어떤 데이터가 한 번 참조되었다면, 곧 다시 해당 데이터가 참조될 가능성이 높다는 것이다. 또한 spatial locality란 어떤 데이터가 첨조되었다면, 그와 가까운 주소에 있는 데이터들도 곧 참조될 가능성이 높다는 것이다. 캐시는 이 두 가지 지역성을 활용해, 메인 메모리 접근을 줄이고 성능을 높인다. 아래는 locality 특성을 보여주는 예시 코드이다:

sum = 0;
for (i = 0; i < n; i++) {
    sum += a[i];
}
return sum;

위 코드에서 변수 sum은 매 루프 반복마다 계속 사용되는데, 이는 변수의 temporal locality를 보여준다. 또한 배열 a[i]는 인접데이터에 따라 순차적으로 접근되므로, 이는 변수의 spatial locality를 보여준다. 사실 locality는 변수 혹은 데이터에만 적용되는 개념이 아니고, 코드에도 적용된다. 위 코드에서도 루프 안에 있는 add, cmp, jle 등의 명령어는 반복 실행되므로 temporal locality가 적용된다. 또한 위 코드의 명령어들은 메모리에 연속적으로 존재하며, 순서대로 실행되므로 역시 spatial locality가 적용될 수 있다.

Multi-Level Cache

각주