컴퓨터에는 CPU 레지스터, CPU 캐시, RAM, SSD, HDD 등 다양한 장치에서 데이터를 읽고 쓸 수 있다. 일반적으로 이러한 계층구조는 피라미드 형태를 띄며, 피라미드에서 위로 갈수록 빠르고, 작고 비싸다. 아래로 갈수록 느리고, 크고, 싸다. 아래 그림은 컴퓨터에서 메모리가 어떻게 계층구조를 이루는지 그림으로 보여준다.
이 글에서는 실제 하드웨어에서 계층별로 어느 정도의 성능이 나오는지를 알아본다. 물론 하드웨어에 따라서 성능이 다르기 때문에 대략적인 성능만 알아본다. 다시 강조하지만 구체적인 수치는 다를 수 있다. 특히 예전 하드웨어랑 비교할수록 훨씬 느려보일 것이다.
CPU Register
레지스터는 컴퓨터에서 가장 빠른 메모리로 CPU 내부에 존재한다. 레지스터에 데이터를 읽고 쓰는 것은 0~1 CPU 사이클이 필요하므로 약 0ns ~ 0.25ns의 지연 시간(latency)이 생긴다.
레지스터의 크기는 CPU가 32비트냐 64비트냐에 따라 다른데 요즘엔 거의 64비트 CPU를 사용하므로 레지스터 하나는 8바이트이다.
CPU Cache
CPU는 메모리에 접근할 때 RAM에 직접 접근하는 게 아니라 L1 -> L2 -> L3 -> RAM 순서대로 접근한다. L1 캐시에 원하는 데이터가 없으면 L2 캐시에서 불러오고, L2 캐에도 없으면 L3에서 불러오고, L3에도 없으면 RAM에서 불러오는 식이다. CPU는 L1 캐시만 직접 접근하므로 뒤에서 말하는 'RAM 접근의 지연시간'은 L1 <- L2 <- L3 <- RAM 순서대로 불러오는 총 시간이다. L2, L3에 대해서도 똑같다.
L1 Cache
L1 캐시의 크기는 일반적으로 8 ~ 32 KB 정도이다. 캐시 라인 하나의 크기는 32바이트 또는 64 바이트이며, L1 캐시 접근에는 1~5 사이클 정도가 필요하므로 지연 시간은 0.5ns ~ 2.5ns 정도이다. 아, 참고로 L1 캐시는 명령어 캐시와 데이터 캐시가 나누어져있다. L1 캐시는 보통 CPU 코어마다 각각 존재한다. '보통'이라고 굳이 덧붙이는 이유는 아키텍처에 따라 캐시 계층 구조가 다를 수 있기 때문이다.
L2 Cache
L2 캐시는 L1 캐시와는 달리 데이터와 명령어가 분리되어있지 않으며 보통 CPU 코어마다 각각 존재한다. L2 캐시의 크기는 일반적으로 256KB ~ 8MB 사이이며 접근할때 7~14 사이클이 필요하므로 지연 시간은 3.5ns ~ 7ns이다.
L3 Cache
L3 캐시부터는 CPU 외부에 있다. L3 캐시는 보통 CPU 코어 사이에서 공유한다. 크기는 보통 10MB ~ 64MB 이며 접근할때 40 ~ 50 사이클이 필요하므로 지연시간은 20ns ~ 26ns이다.
Main Memory (RAM)
메인 메모리 부터는 모든 CPU 사이에서 공유한다. 일반적으로 로컬 RAM에 접근하는 지연 시간은 약 100ns 정도이다. 대역폭(bandwidth)은 메모리 성능에 따라 다른데, DDR3의 경우 25~50GB/s, DDR4의 경우 50GB/s, DDR5의 경우 최대 138GB/s까지 나온다고 한다.
Solid State Drive (SSD)
SSD는 어떤 인터페이스를 사용하느냐에 따라서 성능이 크게 달라진다. SATA3 인터페이스를 지원하는 SSD의 경우에는 대역폭이 약 550MB/s, 지연 시간은 약 수십 ~ 수백 마이크로초 정도이다.
M.2 NVMe SSD의 경우 순차적 읽기/쓰기는 약 5~7GB/s, 지연 시간은 약 수 마이크로초 ~ 수십 마이크로초이다.
Hard Disk Drive (HDD)
하드 디스크 드라이브는 순차적 읽기/쓰기에서 50~200MB/s의 대역폭을, 지연 시간은 수십 밀리초 정도가 걸린다. 하드 디스크는 현재 헤드의 위치에 따라 지연 시간이 매우 차이나므로 I/O 요청의 패턴에 따라 성능이 매우 상이할 수 있다.
Conclusion
계층 구조별로 속도 차이가 난다는 건 알고 있었지만 구체적으로 얼마나 나는지는 몰라서 정리해봤다. 메모리 계층 구조를 이해하면 더 효율적으로 프로그램을 작성할 수 있다고 생각한다. 실제로 나는 이런 계층 구조를 아예 몰랐을 때 변수 값 하나만 바껴도 바로 디스크에 쓰도록 하는 프로그램을 짠 적도 있다. 혹시 프로그램을 짤 때 CPU 캐시를 잘 활용하는 방법에 관심이 있다면 The Element of Cache Programming를 읽어보자.
References
Numbers Every Programmer Should Know By Year (colin-scott.github.io)
Cornell Virtual Workshop: Memory Access Times
performance - Cache or Registers - which is faster? - Stack Overflow
DDR5-6400 RAM Benchmarks Show Major Performance Gains Over DDR4 | Tom's Hardware (tomshardware.com)
https://condusiv.com/sequential-io-always-outperforms-random-io-on-hard-disk-drives-or-ssds/
'Computer Architecture' 카테고리의 다른 글
다시 정리하는 NUMA (1) | 2022.01.21 |
---|---|
LEGv8 ISA - 특징과 명령어 포맷 (0) | 2021.12.02 |
Instruction Set Architecture vs Microarchitecture (0) | 2021.12.01 |
The Elements of Cache Programming Style (0) | 2021.10.07 |
NUMA: Non-Uniform Memory Access (0) | 2021.09.30 |
댓글