-
[Cache] 시간 지역성, 공간 지역성개발/C·C++ 2021. 4. 8. 14:19
CPU는 빠르지만 메인 메모리라고 하는 RAM은 느립니다. 둘의 속도 차이는 병목 현상을 만들고 이는 성능 저하의 원인 중 하나입니다. 물론 데이터에 접근할 때 일어나는 컨텍스트 스위칭 역시도 성능에 영향을 주겠지만요. 캐시는 CPU와 램(DRAM) 사이에서 중간자 역할을 합니다. 자주 사용되는 데이터를 캐시에 저장하면 CPU가 빠르게 꺼내어 사용할 수 있습니다. CPU에서 요청한 데이터가 캐시 안에 있을 때 캐시 히트라고 합니다(cache hit). 캐시에 존재하지 않으면 캐스 미스(miss)라고 합니다.
캐시가 효율적으로 동작하기 위해서는 캐시에 저장할 데이터가 지역성(locality)을 가져야 합니다. 지역성은 시간 지역성과 공간 지역성으로 나뉩니다. 시간 지역성은 데이터의 읽기/쓰기를 위해 특정 메모리가 사용됐을 때 가까운 시일 내에 해당 메모리가 다시 사용될 가능성이 높은 걸 말합니다. 공간 지역성은 특정 데이터와 가까운 주소가 순서대로 접근되는 경우를 말합니다. 한 메모리 주소에 접근할 때 그 주소뿐만 아니라 해당 블록을 전부 캐시에 가져옴으로써 공간 지역성의 효율을 높입니다.
#include <chrono> #include <iostream> using namespace std; int matrix[20240][20240] = {}; int main() { auto start = chrono::high_resolution_clock::now(); for (int i = 0; i < 20240; ++i) { for (int j = 0; j < 20240; ++j) { matrix[i][j] = 1; } } auto end = chrono::high_resolution_clock::now(); auto elapsed = end - start; auto elapsedTime = chrono::duration_cast<chrono::milliseconds>(elapsed); cout << elapsedTime.count() << endl;
위와 같이 어마어마하게 큰 배열의 각 요소에 값을 할당해야 한다고 해봅시다. m[i][j]에 접근하는 방법에서는 1초가 조금 안 걸렸습니다(ms 기준).
m[j][i]로 바꿔서 해보면 메모리에 연속적으로 접근하지 못하게 되면서 시간이 오래 걸립니다. 코드 한 줄 잘못 썼다가 4.5배 차이나는 성능 차이가 발생했습니다.
'개발 > C·C++' 카테고리의 다른 글
[Pointer] 달과 손가락 (0) 2021.04.10 [Enum] 가독성을 위한 약간의 수고 (0) 2021.04.09 'if' you wanna 'switch' something (0) 2021.04.06 음수 표현(feat.2의 보수) (0) 2021.04.03 Sequence point (0) 2021.03.30