예시로 알아보는 CPU Cache
카테고리:
tag #
2023년 09월 26일
// Links to the libraries needed
안녕하세요! 저는 현재 카카오테크 부트캠프 내에서 CS 세션 발표를 진행하고 있는데요! 프로젝트를 진행하며 캐시에 대한 내용이 많이 나와서 이를 정리하고 가기 위해 발표 주제로 정했습니다!
발표를 준비하며 PPT를 만들고 공부한 내용들을 다시 정리하며 공부하기 위해 오늘 포스팅을 하게 되었습니다!
그러면 캐시의 개념부터 작동 방식, 그리고 왜 필요한지까지 차근차근 살펴보겠습니다.
컴퓨터 시스템에서는 메모리의 속도와 용량이 반비례하는 경향이 있습니다.
이런 계층 구조 때문에, CPU의 빠른 연산 속도를 메인 메모리가 따라가지 못해 병목 현상이 발생할 수 있습니다. 캐시는 이 병목을 완화하기 위해 필수적입니다.
CPU 캐시는 일반적으로 L1, L2, L3 캐시로 구분되며, 각 계층은 속도와 용량에서 차이가 있습니다.
캐시는 하드웨어로 구현된 해시 테이블과 비슷하게 동작합니다.
캐시의 효율은 히트율에 크게 의존하며, 높은 히트율은 시스템 성능 향상으로 이어집니다.
저희는 부트캠프 교육장 내에 간식을 두는 캔틴이라는 공간이 있습니다.
만약 제가 초코파이를 먹고 싶으면 캔틴을 먼저 가겠죠?
캔틴에 만약 초코파이가 있다면 멀리 있는 편의점을 안가도 되게 됩니다. -> Cache Hit
그런데 캔틴에 초코파이가 없다면 멀리 있는 편의점에 가게 되겠죠 -> Cache Miss
그러면 초코파이를 원하는 교육생들이 점점 많아지면 많은 교육생들이 편의점에 가는 것보다 캔틴에 초코파이를 두어 교육생들이 멀리 가지 않고 초코파이를 가져와서 먹을 수 있는 것이 좋겠죠?
이렇게 자주 사용하는 데이터를 캐시 메모리에 두면 작업을 효율적으로 처리할 수 있게 됩니다.
프로그램은 전체 데이터 중 일부(20%)에 자주 접근합니다.
캐시의 효과적인 활용은 지역성(Locality) 원리에 기반합니다.
이러한 지역성을 활용하여 캐시는 데이터 블록을 미리 가져오고 저장하여 성능을 향상시킵니다.
캐시의 공간적 지역성을 이해하기 위해 파이썬 코드를 통해 실험해보겠습니다.
import time
SIZE = 10000
array = [[0] * SIZE for _ in range(SIZE)]
start = time.time()
for i in range(SIZE):
for j in range(SIZE):
array[i][j] += 1
end = time.time()
print("Row-major order: {:.2f} s".format(end - start))
start = time.time()
for i in range(SIZE):
for j in range(SIZE):
array[j][i] += 1
end = time.time()
print("Column-major order: {:.2f} s".format(end - start))
Row-major order: 9.67 s
Column-major order: 23.39 s
따라서 데이터 구조와 접근 방식에 따라 캐시의 효율이 크게 달라질 수 있습니다.
이러한 캐시는 CPU 외에도 다양한 분야에서 사용되며, 성능 최적화에 중요한 역할을 합니다.
캐시가 중요하고 사용을 잘 해야한다는 것은 알고 있었는데 개념부터 다시 정리하니 더욱 더 명확해지는 것 같습니다!
성능 최적화를 위해 다양한 형태의 캐시, 각각의 원리와 적용 방법을 이해하는 것이 중요할 것 같습니다!
앞으로의 프로젝트나 개발 과정에서 캐시를 적절히 활용하여 더 효율적인 시스템을 구축해보도록 노력해야할 것 같습니다!
참고 자료