저번에 핫했던 글도 그렇고 다른사이트에서도 좀 몇번 시끄러웠던 이야기인지라 생각난김에 시스템에서의 메모리 접근 레이턴시가 정확히 어떻게 결정되는가에 대한 이야기를 정리해봅니다.
일반적인 시스템에서 메모리에 접근하는데 소요되는 레이턴시는 아래와 같습니다.
(이미지 출처 : https://www.anandtech.com/show/2427/5 )
적당히 세부요소들이 제대로 나와있는 마땅한 그림을 찾지 못해서 쌍팔년도[...] 그림을 가져왔는데, 뭐 현재도 크게 다르진 않습니다. MCH가 이제는 CPU 다이 속으로 들어왔다는 것과, 고리짝시절의 굼뱅이 같은 FSB가 지금은 훨씬 더 빠른 링버스/메시/인피니티패브릭/CCI 등의 On-die 버스로 대체되었다는 것을 제외하면 기본 틀은 동일합니다.
A : CPU가 데이터 요청을 발행하는 단계입니다. 모든것의 시작점입니다.
B : 이제 CPU가 캐시들을 뒤적거려서 없으면 멤컨에 요청하는 단계입니다. 각 캐시의 레이턴시가 누적됩니다.
C : MCH가 코어에서 명령을 받아서 실제 메모리의 물리적인 주소와 필요한 명령으로 변환하는 단계입니다.
D : 명령이 이제 램 뱅크로 내려갑니다.
E : 램 모듈에 내려진 명령이 처리되어 데이터가 버퍼를 거쳐 MCH로 전송됩니다. 여기서 관여하는게 바로 램타입니다. 제가 설명하기엔 솜씨가 부족하기에 정말 친절하게 설명된 유튜브 영상 링크로 대체합니다.
링크 -> https://youtu.be/x3jGqOrXXc8
F : MCH가 램에서 보내지는 데이터를 CPU와 연결된 데이터 버스의 클럭과 박자를 맞춰줍니다.
(그림에선 FSB고, 요즘의 CPU에선 링버스/메시/IF/CCI 등의 각 제조사의 On-die 버스가 되겠습니다.)
G : MCH가 CPU로의 데이터 전송을 마무리 합니다.
현대의(물론 최소 10년도 더 전의 이야기지만) CPU들에서 멤컨이 통합되면서 데이터버스와 멤컨 자체의 작동속도가 비약적으로 향상되면서 멤컨 자체와 데이터버스에서 소요되는 레이턴시가 많이 줄었지만 반대로 L3캐시가 추가되어 캐시가 한단계 더 늘기도 했고, 데이터 버스에서 각 코어간의 일관성을 유지시키는 과정에서 발생하는 레이턴시도 있어서 실질적으로 그시절이나 지금이나 또이또이 하긴 한데 근소하게 좀 더 줄긴 했습니다.
그래서 POP라던가 MCP처럼 단순히 메모리 칩을 가까이 붙여놓기만 하는걸론 레이턴시가 줄지 않는 겁니다. 규격 내에서 요구되는 물리적인 수준을 충족시킬 수 있다면 레이턴시 자체는 정말 한뼘도 채 안되는 그 짧은 거리에 영향을 받는게 아니니까요. 메모리 접근 레이턴시를 단순히 물리적인 거리로 오해하는 분들과 키배가 많이 발생하는 부분입니다.
물론 메모리를 빠르게 하기 위해선 가까이 있어야 하는것은 사실입니다. 물리적으로 가까우면 우선 더 적은 전력으로 더 안정적으로 더 빠르고 넓게 작동할 수 있습니다. 클럭이 높을수록, 버스 폭이 넓을수록 물리적으로는 더 민감해지는데, 거리가 멀어질수록, 중간에 다른 구성요소가 낄수록 Clock Skew와 노이즈가 심해지고 따라서 당연히 안정적인 작동이 힘들어집니다. 중간에 잡상인(고상하신 말론 오버헤드라고도 합지요...)을 여럿 끼워가면서 거리를 어찌저찌 연장을 할 수는 있습니다만 그만큼의 소비전력과 지연이 발생하고 느려지겠지요.
그리고 이게 캐시나 EDRAM 같이 동작이 더 빠른 메모리일수록 CPU에 밀접하게 배치되어있는 이유입니다. 그만큼 밀접해야 그만큼의 속도를 용이하게 달성할 수 있으니까요. 즉, 가까운 물리적 거리는 낮은 레이턴시와 빠른 작동속도를 위한 "필요조건" 입니다. "충분조건"이 아니고요.