CXLとメモリ拡張・コヒーレント接続の原理
メモリをCPUに固定せず必要な分だけ束ねたい。CXLがPCIe物理層の上にコヒーレンシを載せ、メモリ拡張・プーリングを成立させる原理を押さえれば、データセンターのメモリ分離の意味が腑に落ちます。
- 1.CXLはPCIe物理層を共有しつつ、CXL.io(PCIe互換I/O)・CXL.cache(デバイス→ホストメモリの一貫キャッシュ)・CXL.mem(ホスト→デバイスメモリの一貫アクセス)の3プロトコルを多重化する。
- 2.ホスト側のコヒーレンシエンジンが全コピーの所有権を一元管理する非対称設計により、デバイスがホストメモリをキャッシュしても、また外付けメモリをロード/ストアで直接読み書きしても一貫性が崩れない。
- 3.CXL.memでメモリをCPUから切り離してプール化・階層化でき、容量と帯域をコアと独立に増減できる。これがデータセンターのメモリ分離(ディスアグリゲーション)を支える原理。
なぜPCIeの上に別物が必要なのか
PCIeはデバイスとホストを高速につなぐ標準ですが、その通信はパケット(TLP)を介したメッセージ型I/Oです。デバイスがホストメモリへアクセスするにはDMA要求を投げ、ホストもデバイスメモリを「I/O空間」として扱います。ここには根本的な制約があります。PCIeデバイスはCPUのキャッシュコヒーレンシ網の外側にいるということです。
アクセラレータ(GPUやAI演算器)がホストメモリ上のデータを処理するとき、PCIe越しではデータを自分のローカルメモリへコピーし、結果を書き戻す必要があります。CPUとデバイスが同じデータを共有しても、互いのキャッシュは整合されません。コピーのたびに帯域とレイテンシを浪費し、プログラムモデルも複雑になります。
CXL(Compute Express Link)は、この壁を取り払うために生まれました。鍵は物理層をPCIeから借りる点です。CXLはPCIeの差動レーン・リンクトレーニング・電気的仕様をそのまま使い、同じスロット・同じケーブルで動きます。その上に、コヒーレンシを前提とした独自のプロトコルを載せます。
CXLデバイスは起動時のリンクトレーニング中に、相手がCXL対応かをネゴシエーション(Alternate Protocol negotiation)で判別します。対応していればCXLモードで、していなければ通常のPCIeデバイスとして動きます。物理層・電気層を共有するため、CXL 1.1/2.0はPCIe 5.0、CXL 3.0はPCIe 6.0の物理層を土台にしており、世代ごとの帯域はPCIeに追従します。
3つのプロトコルを1本のリンクに多重化する
CXLは1本のリンク上に、役割の異なる3つのサブプロトコルを動的に多重化します。FlexBusと呼ばれる仕組みが、リンクの各スロット(時間枠)を3者へ振り分けます。
| プロトコル | 土台 | 向き | 用途 |
|---|---|---|---|
| CXL.io | PCIe(TLP)とほぼ同一 | 双方向 | デバイス検出・設定・割り込み・DMA。初期化に必須 |
| CXL.cache | 新規・低レイテンシ | デバイス→ホストメモリを一貫キャッシュ | アクセラレータがホストメモリをコヒーレントに参照 |
| CXL.mem | 新規・低レイテンシ | ホスト→デバイスメモリへ直接ロード/ストア | 外付けメモリをホストのアドレス空間へ編入 |
CXL.ioは実質PCIeで、デバイスの列挙やレジスタ設定、割り込みを担います。どのCXLデバイスも最低限これを使うため、CXL.ioは常に存在します。残る2つがCXLの核心です。
1本のCXLリンク(PCIe物理層)
├─ CXL.io : 設定・列挙・DMA(PCIe TLPとして流れる)
├─ CXL.cache : デバイスがホストメモリのコピーをキャッシュ保持
└─ CXL.mem : ホストがデバイス上のメモリをロード/ストアで直読み
FlexBusがリンクスロットを3者へ多重化し、優先度の高い
.cache/.memを低レイテンシ枠で運ぶ
CXL.cacheとCXL.memがTLPより薄く低レイテンシなのは意図的です。メモリアクセスのレイテンシは性能に直結するため、PCIeのトランザクション層オーバーヘッドを避け、固定長に近い小さなメッセージで往復を短縮します。
非対称コヒーレンシ ─ ホストが所有権を握る
CXLの一貫性が成立する仕組みは、CPUコア間のMESIによる対称コヒーレンシとは設計思想が異なります。CXLは**非対称(ホスト主導)**です。
CPUコア同士は対等にスヌープし合い、誰もが他者へ無効化要求を出せます。CXLではホスト側に置かれたコヒーレンシエンジンが唯一の調停者となり、あるキャッシュラインを今どのエージェントが所有し、どんな状態(M/E/S/I相当)かを一元的に追跡します。デバイスは自分でスヌープを発行せず、ホストへ要求し、ホストが既存コピーを無効化してから許可を返します。
CXL.cache の所有権獲得(デバイスがホストメモリを書きたい)
1. デバイス → ホスト : このラインのE/M所有権がほしい(要求)
2. ホスト : 他コア/他デバイスのコピーを無効化(スヌープ)
3. ホスト → デバイス : 所有権を付与(データ+状態を返す)
4. デバイス : ローカルにキャッシュして書き込み
逆向き(ホストがデバイス保持ラインを必要とする)も
ホストがデバイスへスヌープ(バックインバリデート)して回収
なぜ非対称にするのか。対称コヒーレンシは全エージェントが対等にスヌープを撃ち合うため、エージェント数が増えるとスヌープトラフィックが組み合わせ的に増大します。データセンターでは多数のデバイスが1ホストへ集まるため、調停をホスト1点に集約する方が状態管理が単純でスケールします。デバイス側のハードウェアも軽くなり、参入障壁が下がります。
CXLデバイスはどのプロトコルを使うかで3型に分類されます。Type 1(.io+.cache)はキャッシュを持つアクセラレータ(NIC等)、Type 2(.io+.cache+.mem)はローカルメモリも持つGPU/AI演算器、Type 3(.io+.mem)はメモリ拡張専用デバイスです。メモリプーリングの主役はType 3で、コヒーレンシのために.cacheを実装せずに済むため最も単純です。
CXL.memとメモリ階層 ─ DRAMの先に層を足す
CXL.memの本質は、デバイス上のメモリをホストの物理アドレス空間へ編入することです。CPUは普通のload/store命令でそのメモリを読み書きでき、ソフトウェアからは「少し遅いDRAM」に見えます。DMAやI/O APIは要りません。
ただしアクセスはCXLリンクを1往復するため、ローカルDRAMより遅延が乗ります。そこでメモリ階層に新しい層が加わります。
| 層 | おおよその相対レイテンシ | 役割 |
|---|---|---|
| L1〜L3キャッシュ | 数〜数十サイクル | ホットデータを隠す |
| ローカルDRAM | 基準(約80〜100ns) | 主記憶 |
| CXL接続メモリ | ローカルの約2〜3倍 | 容量を拡張する遠いメモリ層 |
| NVMe/SSD | 数十μs〜 | 永続ストレージ |
この「ローカルDRAMより遅いが、ストレージよりは桁違いに速い」位置づけが重要です。OSはこれを**メモリ階層化(ティアリング)**として扱い、よく触るページを近いDRAMへ、冷たいページをCXLメモリへ自動的に移動させます。CPUから見れば連続したメモリ空間ですが、内部ではNUMAの遠ノードに似た距離差を持つ層として管理されます。
ページの自動配置(OS/ファームウェアのティアリング)
ホットページ → ローカルDRAM(速い・容量小)
コールドページ → CXLメモリ (遅い・容量大)
アクセス頻度を監視し、昇格/降格でページを移動
→ 容量はCXLで稼ぎ、速度は局所性で取り戻す
CXLメモリは「普通のメモリ」に見えますが、レイテンシがローカルの数倍ある点を無視すると性能が崩れます。レイテンシ依存の処理(ポインタ追跡など)をCXLメモリに置くと顕著に遅くなる一方、帯域律速で局所性の低い処理(大規模な走査)には向きます。透過的に見えても配置の意思決定は依然として性能を左右します。
メモリプーリングとディスアグリゲーション
CXL 2.0以降が開く最大の地平がメモリプーリングです。従来サーバーはメモリをCPUソケットに固定し、足りなければサーバーごと増設するしかありませんでした。実際には多くのサーバーが割り当てたメモリを使い切れず、**ストランディング(取り残し)**として遊休化します。
CXL 2.0はスイッチを導入し、複数ホストと複数メモリデバイスを網目状に接続します。共有メモリプールから、各ホストへ必要量を動的に切り出して割り当てられます。
Host A Host B Host C
\ | /
+--- CXLスイッチ ---+
/ | \
メモリ メモリ メモリ
デバイス デバイス デバイス
(共有プール:各ホストへ容量を動的割当)
これがメモリ分離(ディスアグリゲーション)です。コア(演算)とメモリ(容量)を別々の資源として独立に増減でき、ワークロードに応じて配分を変えられます。メモリ集約型のジョブには厚く、演算集約型には薄く割り当てれば、ストランディングが減り全体の利用率が上がります。CXL 3.0はさらにマルチレベルスイッチとファブリック化を進め、複数ホストが同一メモリ領域を真に共有(コヒーレントに)する構成まで踏み込みます。
「CXLはPCIe物理層を共有し、CXL.io/.cache/.memの3プロトコルを多重化」「.cacheはデバイス→ホスト、.memはホスト→デバイス方向の一貫アクセス」「ホスト主導の非対称コヒーレンシでホストが所有権を一元管理」「Type 3+スイッチでメモリプーリング=ディスアグリゲーション」の4点が核心です。CXL.memのメモリは普通のload/storeで届くがレイテンシは数倍、という性質も押さえましょう。
まとめ
- CXLはPCIeの物理層を借り、その上にコヒーレンシ前提の3プロトコル(CXL.io/.cache/.mem)を多重化することで、PCIeでは越えられなかった「デバイスがコヒーレンシ網の外」という壁を取り払う。
- CXL.cacheはデバイスがホストメモリを一貫キャッシュし、CXL.memはホストがデバイスメモリをload/storeで直読みする。整合はホスト主導の非対称コヒーレンシでホストが全所有権を一元管理して保つ。
- CXL.memはデバイスメモリをホストのアドレス空間へ編入し、ローカルDRAMの先の遅いが大容量な階層を作る。OSはティアリングで局所性を取り戻す。
- スイッチによるメモリプーリングでコアとメモリを切り離し、利用率を上げるディスアグリゲーションを実現する。これがデータセンターのメモリ設計の新潮流。
土台となる物理層はPCIeの原理が、整合の比較対象となるコア間一貫性はキャッシュメモリの原理が、そして演算側がメモリ待ちをどう隠すかはアウトオブオーダー実行が掘り下げます。
CPU/メモリ/ディスク Article
CXLとメモリ拡張・コヒーレント接続の原理を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
CXL
比較で見る軸
難易度: advanced / カテゴリ: CPU/メモリ/ディスク / タグ数: 6
導入後に効く点
ホスト側のコヒーレンシエンジンが全コピーの所有権を一元管理する非対称設計により、デバイスがホストメモリをキャッシュしても、また外付けメモリをロード/ストアで直接読み書きしても一貫性が崩れない。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- CPU/メモリ/ディスク
- タグ数
- 6
判断チェックリスト
- 自社の用途が「CXL / メモリプーリング」に近いか確認する。
- 強みである「CXLはPCIe物理層を共有しつつ、CXL.io(PCIe互換I/O)・CXL.cache(デバイス→ホストメモリの一貫キャッシュ)・CXL.mem(ホスト→デバイスメモリの一貫アクセス)の3プロトコルを多重化する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。