모든 이야기

DDR4가 같은 bank group에서 읽기를 띄우는 이유

DRAM에서 원하는 행이 모두 열려 있고 요청도 충분하다. 더 이상 ACT 준비를 기다리지 않는다면 데이터 버스를 빈틈없이 쓸 수 있을까? DDR4에서는 연속 column 명령이 같은 bank group으로 향하는지가 또 하나의 조건이다. tCCD_L은 같은 group의 READ→READ 또는 WRITE→WRITE 사이에 필요한 간격을 나타낸다.

한 행을 열어 놓는 것과 그 행의 데이터를 외부 I/O 경로로 계속 꺼내는 것은 다른 작업이다. DDR4는 bank group별 I/O gating 조직을 가지며 column 명령 간격을 same-group과 different-group으로 나눈다. Alliance DDR4 데이터시트 그림 78·79와 AC timing은 같은 group에 tCCD_L, 다른 group에 tCCD_S가 적용되는 명령열을 보여 준다. 같은 열린 행을 읽는다고 이 column 제약이 사라지지 않는다.

데이터를 다 보낸 시간과 다음 명령이 가능한 시간

가상 64bit-wide channel, BL8, tCK=1ns를 놓자. 한 burst는 64bit×8=512bit, 즉 64byte다. 두 edge에서 전송하므로 burst의 시간 폭은 4ns다. tCCD_S=4clock, tCCD_L=6clock이라고 가정하면 group을 바꾸는 READ는 4ns 간격, 같은 group의 READ는 6ns 간격으로 발행할 수 있다.

CL과 추가 latency가 두 명령에 동일하다면 명령 사이 간격은 output burst 시작 사이 간격에도 반영된다. 다른 group을 번갈아 읽는 일정에서는 4ns burst들이 이어질 수 있다. 같은 group만 읽는 일정에서는 4ns를 전송한 뒤 다음 burst까지 가상 2ns 공백이 생긴다.

다만 이 번갈이 일정에서는 동일 group을 다시 읽는 간격이 2×4=8ns여서 L=6ns도 만족한다. 일반적으로 두 group을 S 간격으로 번갈아 읽으려면 2×S가 L 이상이어야 한다. 다른 group의 READ가 사이에 있어도 최근 동일 group의 READ에 대한 long 제약은 남는다. 따라서 실제 schedule은 바로 앞 명령과의 short 조건과 group별 같은 방향 column 명령의 long 조건을 함께 검사해야 한다.

이 조건에서 충분히 긴 요청열의 상한을 계산하면 다음과 같다.

  • different-group: 64byte/4ns = 16GB/s
  • same-group: 64byte/6ns ≈ 10.7GB/s

GB/s는 여기서 10의 9승 byte/s 기준이다. 실제 controller나 제품의 측정 대역폭이 아니라 column timing만 분리한 계산이다. rank 전환, refresh, read/write 전환, command queue, bus overhead, 접근 pattern이 들어가면 결과는 달라진다.

bank를 바꾸는 것만으로는 부족하다

같은 group 안의 B0와 B1을 번갈아 읽으면 bank는 달라져도 tCCD_L 관계는 그대로다. 두 group의 bank를 번갈아 읽어야 different-group 관계가 된다. 주소를 고르게 배치했다는 설명을 듣더라도 어느 주소 bit가 bank group으로 들어가는지 확인해야 하는 이유다.

반대로 요청을 group 간에 퍼뜨리려고 연속 데이터를 지나치게 흩으면 row locality가 나빠져 ACT와 PRE가 늘 수 있다. 가상 계산에서 2ns column 공백을 줄였더라도 행 전환 비용이 더 크면 전체 이득은 사라진다. 이미 열린 행이 충분한 상황과 작은 무작위 접근이 많은 상황을 같은 대역폭 모델로 비교할 수 없다.

이 구분은 tCCD_L을 줄이는 변경과 주소 배치를 바꾸는 변경에도 적용된다. 전자는 특정 group 내부의 column 간격 여유를 바꾸는 일이다. 후자는 정해진 tCCD_L을 유지하면서 짧은 관계의 명령쌍을 더 많이 만드는 일이다. 같은 목표의 성능 개선처럼 보여도 정확성 검증과 적용 범위가 다르다.

peak 수치 앞에 붙일 조건

DDR 전송률로 계산한 theoretical peak는 모든 burst가 빈틈없이 나오는 상태를 가정한다. 그 상태를 만들 수 있는 column schedule인지 먼저 확인해야 한다. 같은 bank group 요청만 충분히 많다고 해도 long interval이 burst 폭보다 길면 bus에 공백이 생긴다.

분석할 때는 각 READ의 group과 output burst 시작을 나란히 표시하자. 긴 공백이 row 준비 때문인지, 같은 group의 column 간격 때문인지, 방향 전환 때문인지 구분할 수 있다. tCCD_L이 지배하는 경우라면 더 많은 bank가 있는 제품으로 바꾸는 것만으로 해결되지 않을 수 있다. group 관계가 달라져야 한다.

열린 행의 수는 병렬 후보를 만들고, tCCD_L은 그중 같은 group의 데이터를 얼마나 촘촘하게 꺼낼 수 있는지 제한한다. 그래서 DDR4 대역폭을 판단할 때는 전송률, bank 수, row hit율에 더해 column 요청의 bank group 관계를 확인해야 한다. bus가 비는 이유를 이 수준까지 나누어야 주소 배치와 timing 중 어느 쪽을 손볼지 결정할 수 있다.

DDR4가 같은 bank group에서 읽기를 띄우는 이유 · ariser