TL

メモリコントローラの原理 ─ スケジューリングとバンク並列性

DDRの理論帯域が出ない理由を、コマンドの並べ替え・行バッファ・バンク並列性・リフレッシュの観点で原理から解きほぐし、実効帯域を読み解く目を養えます。

応用DRAMメモリコントローラFR-FCFSバンク並列性リフレッシュ最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.DRAMはACT(行活性化)→RD/WR→PRE(プリチャージ)の手順を踏み、各操作にtRCD・tRP・tRASなどのタイミング制約があるため、コントローラはこれを守りつつコマンドを発行する。
  • 2.FR-FCFSは行バッファヒットするコマンドを優先し、Ready(タイミング充足)かつ古い順に発行することで行アクセスの再利用を稼ぎ、実効帯域を引き上げる。
  • 3.バンク/ランク並列性で複数アクセスのレイテンシを重ね、リードライト切替のバスターンアラウンドとリフレッシュ停止がスループットの上限を削る。

なぜ理論帯域は出ないのか

DDR メモリのスペック表には「DDR5-6400 で 51.2 GB/s」のような理論ピーク帯域が並びます。ところが実アプリでの実効帯域はその 6〜8 割、ランダムアクセスでは半分以下まで落ちることが珍しくありません。原因は DRAM が「読み書きの前に準備動作が要る」素子だからです。メモリコントローラは、この準備動作の制約(タイミング)を守りながら、複数の要求をいかに重ね、いかに無駄な準備を省くかを競うスケジューラです。実効帯域はメモリの素の速度ではなく、このスケジューリングの巧拙で決まります。

DRAM セルは1個のキャパシタに電荷として1ビットを蓄えます。読み出しは破壊的(電荷が抜ける)で、しかも電荷は漏れて消えるため定期的な再書き込みが要ります。この物理的制約が、以下のコマンド手順とタイミングを生みます。

DRAMの基本コマンドとタイミング

メモリへのアクセスは、いきなり「番地を指定して読む」のではなく、段階を踏みます。DRAM はバンクごとに「行(ロウ)」と「列(カラム)」の二次元構造を持ち、アクセスの単位はこの座標で表されます。

コマンド意味代表的な制約効果
ACT(Activate)指定行をセンスアンプ(行バッファ)へ読み出すtRCD後にRD/WR可行を「開く」
RD / WR開いた行の指定列を読み書きCL後にデータ到達(RD)実データ転送
PRE(Precharge)行バッファを書き戻し閉じるtRP後に次ACT可行を「閉じる」
REF(Refresh)電荷を再書き込みtRFC間そのランク使用不可保持の維持

ある行を読むには、まず ACT でその行をセンスアンプ(行バッファ)に展開します。ACT から実際に RD/WR を出せるまでに tRCD だけ待つ必要があります。別の行を読みたくなったら、現在開いている行を PRE で閉じ、tRP 待ってから新しい ACT を出します。さらに ACT してから PRE できるまでには tRAS という最短保持時間があります。これらは ns 単位の物理制約で、コントローラは全バンク・全ランクについてこれを並行に追跡し、「いま発行可能(Ready)なコマンドはどれか」を毎サイクル判定します。

同じ行を続けて読む(行バッファヒット):
  ACT(行X) ─tRCD→ RD(列a) RD(列b) RD(列c) ...   ← ACTは1回で済む

別の行に移る(行バッファミス/コンフリクト):
  ... PRE ─tRP→ ACT(行Y) ─tRCD→ RD(列d)         ← PRE+ACTの往復が挟まる

この対比が示す通り、同じ開いている行に当たり続ければ ACT/PRE を省け、列アクセスだけが連続して帯域が出ます。逆に行が毎回変わると tRP+tRCD の準備時間が支配的になり、帯域が崩れます。DDR世代の比較で見るバースト長やバンクグループも、この準備コストを償却する工夫です。

行バッファとオープン/クローズポリシー

センスアンプに展開された行(行バッファ)は、いわばバンクごとの1行ぶんの小さなキャッシュです。次のアクセスが同じ行なら準備不要でヒット、別行ならコンフリクト、何も開いていなければミスになります。ACT の直後に行を開いたままにするか即座に閉じるかがページポリシーです。

ポリシーACT後の挙動得意なアクセス不得意なアクセス
オープンページ行を開いたまま保持局所性の高い連続アクセスランダムで毎回別行
クローズページ列アクセス後すぐPREランダム・低局所性同一行の連続再利用
適応型近傍履歴で動的に選択混在ワークロード(予測外れ時のみ)

オープンページは空間的局所性に賭ける方式です。同じ行への後続アクセスは tRCD すら払わず即座に列アクセスでき、行バッファヒット率が高いと実効帯域は理論値に近づきます。ただしヒットしなかった場合は「開いていた行を閉じる PRE(tRP)」が遅延として丸ごと乗るため、行が毎回変わるランダムアクセスでは最悪になります。

クローズページは列アクセスが終わったら自動で PRE し、次は必ず ACT から始める前提にします。ヒットの旨味は捨てる代わり、ミス時に PRE 待ちが見えないよう先回りで閉じておけるので、局所性の乏しいワークロードで安定します。実機の多くは履歴に応じて両者を切り替える適応型を採り、行バッファヒット率を最大化します。

行バッファヒット率が帯域を左右する

1回の ACT を償却できる列アクセス数が多いほど、準備コストの割合が下がり実効帯域は上がります。逆に行バッファミス率が高いと、tRP+tRCD(合計で数十 ns)が転送ごとに割り込み、バスのデータ占有率が大きく低下します。コントローラのスケジューリングは突き詰めれば「いかに行バッファヒットを増やすか」の最適化です。

FR-FCFS:行ヒットを優先する並べ替え

コントローラは到着順(FCFS)どおりに発行する必要はありません。タイミング制約さえ守れば、後から来た要求を先に出してもプログラムの正しさは保たれます(同一アドレスの順序は別途保証)。この自由度を活かす古典的アルゴリズムが FR-FCFS(First-Ready, First-Come-First-Served) です。優先順位は2段階です。

FR-FCFSの発行ルール(優先順):
  1. First-Ready : いま発行可能(タイミング充足)なコマンドだけを候補に
  2. 行ヒット優先 : 候補のうち、開いている行に当たる列アクセスを最優先
  3. FCFS        : 同条件なら古い要求を先に

肝は2番目で、現在開いている行にヒットする RD/WR を、後着でも優先します。こうすると ACT/PRE を出さずに列アクセスが連続し、行バッファの再利用が最大化されて帯域が伸びます。タイミング上まだ出せないコマンド(tRCD 待ちなど)は候補から外れるので、バスを遊ばせずに済みます。

スループットと公平性のトレードオフ

行ヒット優先は帯域には効きますが、同じ行を叩き続けるスレッドが行を「占有」し、別行を待つスレッドのコマンドが後回しにされ続ける飢餓(スターベーション)を招きます。マルチコアでは1つのコアが共有メモリ帯域を独占しかねないため、実機の FR-FCFS は古い要求を強制昇格させる上限(バッチ化やエイジング)を併用し、スループットと公平性・QoS を両立させます。

バンク・ランク並列性でレイテンシを隠す

単一バンクは tRC(ACT から次の同バンク ACT までの周期)に縛られ、連続行アクセスでは長い空き時間が生じます。ここで効くのがバンク並列性です。1つのチップには複数のバンク(DDR4 で 16、DDR5 はバンクグループ込みで 32)があり、各バンクは独立に行を開閉できます。バンク A が tRCD 待ちの間にバンク B へ ACT、バンク C を読む、と異なるバンクの準備動作を時間的に重ねることで、データバスを途切れさせずに使い切れます。

バンク並列なし(単一バンク直列):
  ACT(A) ─tRCD→ RD  ────PRE/tRP/ACT────  RD  ...   ← 準備中バスは空き

バンク並列あり(4バンクをインターリーブ):
  ACT(A)        RD(A)        RD(B)  RD(C)  RD(D) ...
       ACT(B)        ACT(C) ...                     ← 準備を裏で重ねる

さらに上位のランク並列性は、複数の DRAM チップ集合(ランク)を同一チャネルに載せ、ランクをまたいでアクセスを分散します。コントローラはアドレスをチャネル・ランク・バンク(グループ)・行・列へ写像するアドレスインターリーブで、連続アドレスが異なるバンク/ランクへ散るよう配置し、並列性を引き出します。チャネル自体を増やせばデータパスが物理的に増え、帯域は線形に伸びます。並列度が実効帯域を支える点は、メモリ階層全体の遅延と容量の中でも下層ほど顕著です。

ターンアラウンドとリフレッシュという天井

並列化を尽くしても、データバスの向きを切り替える瞬間と、保持のための停止は避けられず、これがスループットの実質的な上限を作ります。

  • リード/ライトターンアラウンド: データバスは双方向で一度に一方向しか使えません。読みから書きへ(または逆へ)切り替えるたびに、バスを空ける tWTR(書き→読み)や tRTW 相当の隙間が必要です。リードとライトが細かく交互に来ると、このバスターンアラウンドの空き時間が積み重なって帯域を食います。対策として、コントローラはリードをまとめて処理し、たまったライトをある閾値で一括して掃き出す**ライトドレイン(ライトバッファのバッチ書き)**を行い、切替回数を減らします。
  • リフレッシュ: キャパシタの電荷が漏れる前に全行を REF で再書き込みします。リフレッシュ中の対象(ランク全体、または一部バンク)は tRFC の間アクセスできず、その時間はまるごと帯域の損失です。容量が大きいほど tRFC は長く、温度が上がると周期 tREFI が短く(頻度が高く)なるため、高温・大容量ほどリフレッシュの占有率が増します。
試験・実務のポイント

「ACT→RD/WR→PRE の順序と tRCD・tRP・tRAS の役割」「FR-FCFS は First-Ready かつ行ヒット優先で帯域を稼ぐ」「バンク/ランク並列で準備動作を重ねレイテンシを隠す」「リード/ライト切替(ターンアラウンド)とリフレッシュ(tRFC)が実効帯域の天井」は頻出です。実効帯域 ≒ 理論帯域 × 行バッファヒット率 × バス占有率(ターンアラウンド・リフレッシュ・並列度で決まる)という直感を持つと応用が利きます。

まとめ

  • DRAM は ACT→RD/WR→PRE の手順と tRCD・tRP・tRAS などのタイミング制約を持ち、行が変わるたびに準備コスト(tRP+tRCD)が乗る。
  • 行バッファ(センスアンプ)のオープン/クローズポリシーがヒット率を左右し、ヒット率が実効帯域をほぼ決める。
  • FR-FCFS は発行可能かつ行ヒットするコマンドを優先する並べ替えで ACT/PRE を償却し、帯域を引き上げる(公平性とのトレードオフはエイジングで緩和)。
  • バンク/ランク並列性で準備動作を重ねてレイテンシを隠し、リード/ライトターンアラウンドとリフレッシュ(tRFC)が最終的なスループットの上限を画する。

メモリへ要求が殺到する前段で需要を減らすのがプリフェッチ機構キャッシュメモリの原理で、両者とコントローラのスケジューリングは「メモリの壁」に対する補完的な防御線です。

CPU/メモリ/ディスク Article

メモリコントローラの原理 ─ スケジューリングとバンク並列性を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

DRAM

比較で見る軸

難易度: advanced / カテゴリ: CPU/メモリ/ディスク / タグ数: 5

導入後に効く点

FR-FCFSは行バッファヒットするコマンドを優先し、Ready(タイミング充足)かつ古い順に発行することで行アクセスの再利用を稼ぎ、実効帯域を引き上げる。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
CPU/メモリ/ディスク
タグ数
5

判断チェックリスト

  • 自社の用途が「DRAM / メモリコントローラ」に近いか確認する。
  • 強みである「DRAMはACT(行活性化)→RD/WR→PRE(プリチャージ)の手順を踏み、各操作にtRCD・tRP・tRASなどのタイミング制約があるため、コントローラはこれを守りつつコマンドを発行する。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

DRAMメモリコントローラFR-FCFSバンク並列性リフレッシュDRAMメモリコントローラFR-FCFS
参考: 公式情報