상세 컨텐츠

본문 제목

캐시

똑똑한 개발/C++ 게임개발

by 성댕쓰 2021. 8. 7. 19:15

본문

컴퓨터 구조중 하나인 캐시와 파이프라인에 대해 알아보자.

빨간색이 CPU, 노란색이 RAM

RAM에서 CPU로 데이터 전송하는 비용이 크다. 이를 줄이고자 캐시를 도입했다. 캐시는 임시저장소 같은 곳이다.

 


코어에는 연산을 담당하는 ALU부분과 캐시부분이 있고

 

 

캐시는 여러 부분, 피라미드 구조로 되어있다. 레지스터는 용량은 작고 빨라서, L2는 용량은 크지만 상대적으로 느려서 피라미드 구조다. CPU는 사용한 리소스를 캐시에 저장해 놓는다. 캐시를 찾았는데 원하는 내용이 없으면 RAM에서 찾는다.

 

 

캐시를 만드는 캐시 철학

1) Temporal locality : 최근에 사용한 정보를 다시 사용할 가능성이 높다.

2) Spatial locality : 사용한 정보 근처에 있는 정보를 사용할 가능성이 높다.(ex. vector 메모리 접근)

 

Spatial locality를 보여주는 예제코드를 보자.

#include <windows.h>

// [][][][][]  [][][][][]  [][][][][]  [][][][][]

int32 buffer[10000][10000];
int main()
{
	memset(buffer, 0, sizeof(buffer));

	{
		uint64 start = GetTickCount64();

		int64 sum = 0;
		for (int32 i = 0; i < 10000; i++)
			for (int32 j = 0; j < 10000; j++)
				sum += buffer[i][j];

		uint64 end = GetTickCount64();
		cout << "Elapsed Tick : " << (end - start) << endl;
	}

	{
		uint64 start = GetTickCount64();

		int64 sum = 0;
		for (int32 i = 0; i < 10000; i++)
			for (int32 j = 0; j < 10000; j++)
				sum += buffer[j][i];

		uint64 end = GetTickCount64();
		cout << "Elapsed Tick : " << (end - start) << endl;
	}
}

 

두 번째 방법이 첫 번째 방법보다 느리게 동작한다. 사용한 메모리의 근처 공간까지 캐시로 가져왔는데, 두 번째 방법은 캐시로 가져온 메모리를 사용하지 않아 캐시미스가 일어나기 때문이다.

 

참조 : [C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버 - 인프런 | 강의 (inflearn.com)

'똑똑한 개발 > C++ 게임개발' 카테고리의 다른 글

메모리 모델  (0) 2021.08.10
CPU 파이프라인  (0) 2021.08.09
Future  (0) 2021.08.07
Condition variable  (0) 2021.08.07
Event  (0) 2021.08.07

관련글 더보기

댓글 영역