CPU: 실제 연산을 수행
RAM: 데이터가 저장되는 메모리 영역
CPU는 연산에 필요한 데이터를 메모리에서 가져온다.
CPU에서 연산하는 작업보다 메모리에서 데이터를 가져오는데 더 큰 비용이 소모될 수 있다.
그래서 CPU는 내부에 캐시메모리라는 임시저장공간에 데이터들을 잠시 저장한다.
CPU 코어에 가까운 캐시메모리일수록 저장공간이 작고 속도가 빠른 경향이 있다.
캐시메모리는 데이터 저장시 데이터 지역성의 원리를 이용한다.
1. 시간 지역성: 한번 참조된 데이터는 잠시 후에 또 참조될 가능성이 높다
ex) for문의 i는 계속 사용된다.
2. 공간 지역성: 참조된 데이터 근처에 있는 데이터가 잠시 후에 사용될 가능성이 높다
ex) 메모리가 연속적인 배열에서 arr[0]의 데이터를 메모리로부터 가져올 때, arr[1]을 같이 가져온다.
3. 순차적 지역성: 명령어들이 메모리에 저장된 순서대로 실행하는 특성을 이용한 원리로 순차적일 수록 다음 순서의 데이터가 사용될 가능성이 높다
이러한 캐시메모리에서 데이터를 가져올 경우 캐시히트라고 불리우며, 메모리에서 데이터를 가져와 연산하는 것보다 속도가 빠르다.
캐시히트: 다음 불러올 데이터가 캐시에서 발견된 경우
캐시메모리의 속도 측정
#include "pch.h"
#include "CorePch.h"
#include <iostream>
#include <thread>
#include <mutex>
#include <future>
#include <windows.h>
int32 buffer[10'000][10'000];
int main()
{
memset(buffer, 0, sizeof(buffer));
{
uint64 start = GetTickCount64();
int64 sum = 0;
for (int32 i = 0; i < 10'000; i++)
for (int32 j = 0; j < 10'000; 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 < 10'000; i++)
for (int32 j = 0; j < 10'000; j++)
sum += buffer[j][i];
uint64 end = GetTickCount64();
cout << "Elapsed Tick: " << (end - start) << endl;
}
}
첫 번째 출력은 캐시메모리의 공간지역성 덕분에 캐시히트가 계속 발생하여 속도가 빠르다.
'Server > C++' 카테고리의 다른 글
메모리 모델과 원자적(atomic) 연산 (0) | 2024.07.31 |
---|---|
CPU 파이프라인 - 명령어 파이프라인 (0) | 2024.07.30 |
Future와 Asynchronous (0) | 2024.07.30 |
조건변수 (Condition Variable) (0) | 2024.07.30 |
커널 오브젝트 Event를 사용한 프로그램 동작 (0) | 2024.07.30 |