캐시의 동작 : 예시

LeeTaeHwa·2022년 3월 4일
0

CPU의 캐시는 하드웨어 수준에서 제어가 된다. 때문에 프로그래머가 직접적으로 이를 통제 할 수는 없다. 하지만 간접적으로는 제어할 방도가 있다. 먼저, 다음과 같은 코드를 보도록하자.

int arr[MAX][MAX];

for(int i = 0; i < MAX; i++)
	for(int k = 0; k < max; k++)
    	std::cout<<arr[i][k];
        
for(int k = 0; k < MAX; k++)
	for(int i = 0; i < max; i++)
    	std::cout<<arr[i][k];

첫 번째로 볼 부분은 2차원 배열값이다. 배열이 저장 될 때에 행과 열 중에 열을 우선적으로 메모리에 할당한다. 그렇기 때문에 arr[0][0 ~ MAX-1] 까지의 값들이 메모리에 저장되고, 그 다음에 arr[1][0 ~ MAX-1]의 값들이 저장 된다. 그래서 MAX를 4라고 가정 할 경우에 메모리에 저장 된 값들은 다음 그림과 같다.

그렇다면 위 코드의 2개 루프 중에서 어느 것이 더 성능이 우수할까? 두 번째 루프보다는 첫 번째 것이 더 성능이 우수하다. 왜냐하면 캐시는 인접한 데이터들을 저장한다는 것을 생각해보자. 그렇기 때문에 첫 번째 루프는 인접한 데이터들을 접근하기 때문에 캐시 히트 확률이 더 높다.

첫 번째 루프의 예시를 보도록하자. 캐시가 비어있는 상태에서 arr[0][0] 접근을 한다고 해보자, 이때에는 캐시에 적재되어 있는 상태가 아니기 때문에 미스가 발생한다. 이때 메인 메모리에서 가져 올 때에 arr[0][0] ~ arr[0][3] 까지의 내용을 가져오기 때문에 다음 3번은 캐시 히트가 된다. 그리고 나머지의 동작에 대해서도 동일하다고 한다면 캐시 미스는 4번이라고 볼수 있다.

두 번째 루프의 경우에는 arr[0][0], arr[1][0], arr[2][0], arr[3][0] 의 순서로 접근하게 된다. 4개 모두 인접하지 않은 데이터이기 때문에 캐시 미스가 발생하게 되는데, 매번 데이터에 접근 할 때마다 캐시미스가 생기기 때문에 16번의 미스가 발생 된다고 볼 수 있다.

물론, 이 예시는 매우 간략화하고, 단순화 한 것이기 때문에 대략 이런 느낌이라는 것 정도로 생각하면 된다.

profile
하늘을 향해 걸어가고 있습니다.

0개의 댓글