PCI Expressの原理 ─ レーン・パケット・ルートコンプレックス
なぜPCIeは世代ごとに帯域を倍増し続けられるのか。シリアル差動レーンと3層パケットプロトコルの内部を押さえれば、x16やNVMeの数字の意味が腑に落ちます。
- 1.PCIeは共有パラレルバスを捨て、送受で独立した差動ペア=レーンを束ねるポイントツーポイントのシリアル接続で、x1〜x16のレーン幅と世代でリンク帯域が決まる。
- 2.通信はトランザクション層(TLP)・データリンク層(DLLP/ACK・クレジット)・物理層(エンコード/シリアライズ)の3層で構成され、TLPがメモリ読み書きや設定アクセスを運ぶ。
- 3.トポロジはルートコンプレックスを頂点にスイッチで分岐するツリー型で、各経路は独立リンクのため帯域競合がなく、世代更新は符号化効率と転送レート改善で帯域を倍々に伸ばしてきた。
なぜパラレルバスを捨てたのか
旧来のPCIは、複数デバイスが1組の配線(パラレルバス)を共有し、全員が同じクロックで歩調を合わせる方式でした。これは速度を上げるほど破綻します。配線本数が多いほど各信号線の長さや負荷のわずかな差がスキュー(到着時刻のずれ)となり、共有ゆえに誰か1台が使うと他は待たされ、帯域は全員で分け合うものでした。
PCI Express(PCIe)はこの前提を反転させます。
| 観点 | 旧PCI(パラレル共有) | PCIe(シリアル・ポイントツーポイント) |
|---|---|---|
| 配線 | 多数の信号線を全員で共有 | 1対1専用リンク |
| クロック | 共通クロックに同期 | データに埋め込み(クロックリカバリ) |
| 帯域 | 接続デバイスで分け合う | リンクごとに独立して占有 |
| 拡張 | 本数増は スキューで頭打ち | レーン本数を束ねて加算的に拡張 |
鍵は、1本の高速なシリアル線へ集約し、クロックを別線で送らずデータの遷移から受信側がクロックを復元する点です。これでスキュー問題が消え、配線あたりの周波数を桁違いに上げられます。
レーン ─ 差動ペアという最小単位
PCIeの物理的な最小単位がレーンです。1レーンは送信用と受信用それぞれの差動ペア(2本1組の信号線)からなり、合計4本の配線で全二重通信を実現します。
1レーン = 送信差動ペア(2本) + 受信差動ペア(2本)
差動 : 2本に逆相の信号を流し、その「差」を読む
-> 同相に乗るノイズが相殺され、高速でも信号品質を保てる
全二重: 送信と受信が別ペアなので同時に双方向通信できる
差動信号は外来ノイズが2本に等しく乗る性質を利用し、受信側で差を取ることで雑音を打ち消します。これが高い転送レートでも安定して伝送できる理由です。
このレーンを複数束ねたものがリンクで、束ねる本数をリンク幅と呼び x1, x4, x8, x16 と表記します。x16なら16レーンにデータをバイト単位で分散(ストライピング)して並列転送し、帯域は理論上ほぼx1の16倍になります。GPUがx16、NVMe SSDがx4を使うのは、各々が必要とする帯域をレーン本数で割り当てた結果です。
リンク幅と世代(転送レート)は固定ではなく、起動時のリンクトレーニングでホストとデバイスが互いの対応能力を交換し、双方が満たせる最大構成へ自動的に収束します。x16スロットにx4デバイスを挿せばx4で、Gen5対応スロットにGen3デバイスを挿せばGen3でリンクします。上位互換が成立するのはこの仕組みのためです。
3層プロトコル ─ TLPはどう運ばれるか
PCIeの通信は3つの層に分かれ、上位の意味を下位が確実な伝送へ落とし込みます。OSIの階層と同様、各層が役割を分担します。
| 層 | 扱う単位 | 主な役割 |
|---|---|---|
| トランザクション層 | TLP | メモリ/IO/設定アクセスの意味を表現。ヘッダにアドレス・種別を載せる |
| データリンク層 | DLLP / TLPへの付加 | シーケンス番号とCRCで到達保証。ACK/NAKと再送、フロー制御 |
| 物理層 | シンボル(ビット列) | エンコード・シリアライズ・差動送出とクロックリカバリ |
実際のデータ転送を担う主役が**TLP(Transaction Layer Packet)**です。CPUがデバイスのレジスタを読む、デバイスがメインメモリへDMA転送する——こうした操作はすべてTLPとして表現されます。
TLPの主な種類
Memory Read / Memory Write : メモリ空間への読み書き(DMA含む)
Configuration Read / Write : デバイスの設定空間(BAR等)へのアクセス
Completion : 読み出し要求への応答(データを返す)
PCIeのメモリアクセスはスプリットトランザクションです。読み出しは「要求TLP」を送って即座に線を解放し、相手の準備ができ次第「Completion TLP」がデータを返します。要求と応答を分離するため、応答待ちの間も他の転送を流せ、リンクを遊ばせません。
各層はTLPに自分の情報を包んで送り、受信側が順に剥がしていきます。これはネットワークのカプセル化と同じ考え方です。
送信時の入れ子(カプセル化)
[ Framing | SeqNum | TLPヘッダ + データ(ペイロード) | LCRC | Framing ]
^DLL付加 ^^^^^^^ トランザクション層が作る ^^^^^^^ ^DLL付加
物理層が全体を符号化してシリアルに送出
PCIeのデータリンク層は、送信前に受信側のバッファ空き容量(クレジット)を把握しており、相手が受け取れる分しか送りません。受信バッファが溢れてから止めるのではなく、溢れる前提を作らない設計です。これによりパケット落ちを原理的に避け、CRCで検出した誤りはACK/NAKによる再送で回復します。到達保証はこの2段構えで成立します。
ルートコンプレックスとツリー型トポロジ
PCIeの接続は1対1リンクの集まりなので、3台以上を繋ぐには分岐が要ります。その頂点に立つのが**ルートコンプレックス(Root Complex)**です。現代のCPUに統合され、CPUコアやメモリコントローラとPCIeの世界を橋渡しします。
CPU / メモリ
|
ルートコンプレックス <- ツリーの根
/ | \
GPU(x16) スイッチ NVMe(x4)
/ \
NIC(x4) その他デバイス
ルートコンプレックスから各デバイスまでが独立したリンクで結ばれ、デバイスが多いときはスイッチで枝分かれさせます。このツリー型トポロジには重要な帰結があります。
- 帯域競合がない: 各リンクは専有なので、GPUへの転送とNVMeへの転送は互いに干渉しない(ただしスイッチ上流の共有区間は除く)。
- アドレスでルーティング: TLPヘッダのアドレスを見て、スイッチが正しい下流ポートへ転送する。経路はツリーをたどって一意に決まる。
- 列挙(enumeration)で全体像を構築: 起動時にルートから木をたどってデバイスを発見し、各々にバス番号とメモリ空間(BAR)を割り当てる。
ルートコンプレックスが提供できるPCIeレーンの総数は有限です。x16のGPUを挿すと16レーンを消費し、残りをNVMeやNICへ配分します。マザーボードで「GPUを2枚挿すと各x8に落ちる」「特定のM.2を使うとSATAが無効化される」といった制約が出るのは、限られたレーン資源を分割している直接の表れです。NVMe SSDが高速なのも、ストレージをこのI/O網へ直結しレーンを専有させたためです。
世代ごとの帯域倍増 ─ なぜ倍々になるのか
PCIeは世代を重ねるたびにレーンあたり帯域をほぼ倍増してきました。その源泉は転送レート(GT/s)の向上と符号化効率の改善の2つです。
| 世代 | 転送レート(GT/s) | 符号化 | x1の実効帯域(片方向) |
|---|---|---|---|
| Gen1 | 2.5 | 8b/10b | 約 0.25 GB/s |
| Gen2 | 5.0 | 8b/10b | 約 0.5 GB/s |
| Gen3 | 8.0 | 128b/130b | 約 1 GB/s |
| Gen4 | 16.0 | 128b/130b | 約 2 GB/s |
| Gen5 | 32.0 | 128b/130b | 約 4 GB/s |
注目すべきはGen2→Gen3です。転送レートは5→8GT/sと1.6倍しか上がっていないのに実効帯域は倍増しました。理由は符号化方式の刷新です。
8b/10b : 8ビットのデータを10ビットで送る -> 20%が制御用オーバーヘッド
128b/130b: 128ビットを130ビットで送る -> オーバーヘッドは約1.5%
Gen3はレート1.6倍 × オーバーヘッド削減(0.8->0.985) ≒ 約2倍の実効帯域
符号化が必要なのは、受信側がデータの0/1遷移からクロックを復元するため、長い同符号の連続(遷移のない区間)を避けたいからです。8b/10bは遷移を確保しやすい代わりに2割を消費しました。128b/130bはスクランブル等で遷移を担保しつつ制御ビットを極小化し、効率を一気に高めました。Gen4以降は主に転送レートを倍化(8→16→32GT/s)して帯域を伸ばしています。
「レーン=送受の差動ペア、リンク幅x1〜x16で帯域が加算」「3層構造とTLPがメモリ/IO/設定アクセスを運ぶ」「ルートコンプレックスを根とするツリー型で各リンクは専有・アドレスでルーティング」「世代ごとの帯域倍増は転送レート向上+符号化効率(8b/10b→128b/130b)」の4点が核心です。実効帯域=レーン数×レート×符号化効率で概算できる点も押さえましょう。
まとめ
- PCIeは共有パラレルバスを捨て、送受独立の差動ペア=レーンを束ねる1対1シリアル接続とし、スキューを排してレーンあたり周波数を大幅に高めた。
- 通信はトランザクション層(TLP)・データリンク層(到達保証とクレジット制御)・物理層の3層で構成され、TLPがメモリ・IO・設定アクセスを運ぶ。
- トポロジはルートコンプレックスを根とするツリー型で、各リンクは帯域を専有し、TLPのアドレスでスイッチが経路を決める。
- 世代ごとの帯域倍増は転送レートの向上と符号化効率の改善(とりわけ8b/10b→128b/130b)の合わせ技で実現されてきた。
同じ差動シリアル+パケットの発想は外部I/OやGPUの帯域設計、ストレージ直結のNVMeにも共通します。CPU側のキャッシュとメモリ階層と併せて見ると、データがどこをどう流れて計算へ届くかの全体像が掴めます。
CPU/メモリ/ディスク Article
PCI Expressの原理 ─ レーン・パケット・ルートコンプレックスを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
PCIe
比較で見る軸
難易度: advanced / カテゴリ: CPU/メモリ/ディスク / タグ数: 5
導入後に効く点
通信はトランザクション層(TLP)・データリンク層(DLLP/ACK・クレジット)・物理層(エンコード/シリアライズ)の3層で構成され、TLPがメモリ読み書きや設定アクセスを運ぶ。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- CPU/メモリ/ディスク
- タグ数
- 5
判断チェックリスト
- 自社の用途が「PCIe / シリアル伝送」に近いか確認する。
- 強みである「PCIeは共有パラレルバスを捨て、送受で独立した差動ペア=レーンを束ねるポイントツーポイントのシリアル接続で、x1〜x16のレーン幅と世代でリンク帯域が決まる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。