Linuxで4枚の32GB Resizable BARをPCIeスイッチの背後に収めた話

Fitting Four 32 GB Resizable Bars Behind a PCIe Switch on Linux

Linuxで4枚の32GB Resizable BARをPCIeスイッチの背後に収めた話

Broadcom PEX88096のPCIeスイッチにRadeon AI PRO R9700を4枚とRTX 3090を2枚接続した構成で、ROCmのP2Pを有効にするには各カードの32GB全体をマッピングする必要がある。しかしLinux 7.0のpbus_size_mem()は子ウィンドウのサイズを単純合計するため、BARとドアベル間の隙間が計算に入らず「can't assign; no space」で失敗。Ilpo Järvinenの修正パッチと、initramfsからBARサイズを設定して再スキャンする自作カーネルモジュールで解決した。

カーネルはスイッチのウィンドウを子の単純合計としてサイズ設定していた。つまりそのうち4つに3090の288MBウィンドウ2つを加えたものだ。
  1. dougcalobrisi

    これは私の投稿です。要するに、4枚のR9700間でテンソル並列サービングのためにP2Pが必要で、つまり各カードに32 GBのBARが必要でした。GPUを6枚すべて挿すとBIOSがそれらをマッピングできず、Linuxはスイッチのウィンドウを小さくサイズ設定しすぎたため、BARが割り当てられたのは2枚だけでした。投稿のモジュールはそれを回避します。P2Pをオフにすると、prefillは約半分の速度でした。

  2. zir_blazer

    こういうのはCorebootで試すと楽しいはずです。4年以上前にMSI PRO Z690-A DDR4向けのDasharoが出たとき、Radeon 5600XTを2枚挿すと問題がありましたが、開発者がMMIO関連のパラメータをいくつか調整した後に修正されました: https://github.com/Dasharo/dasharo-issues/issues/245

    PCIeスイッチを何段までチェーンでき、とんでもないMMIO要件のカードを何枚まで動かせるかは、興味深い実験になるでしょう。

    この10年ほどで、ファームウェアのMMIO関連の問題をたくさん見てきました。SR-IOV対応の特定のNIC(たいていi350などのIntel製やその他のエンタープライズ向け部品)が、コンシューマー向けマザーボードでサポートされるすべてのSR-IOV仮想機能を作成するのに十分なMMIOを確保できないのを覚えています。多くの場合、SR-IOVは動かせても、ハードウェアが16個サポートしていても収まるのが4個程度のVFしか作成できないという制限がありました。これは本質的にすべてファームウェアの問題でハードウェアの問題ではありませんでしたが、MMIO割り当てのようなかなり込み入ったことを修正するためにBIOS改造に必要なスキルを持つ人はほとんどいません。要するに、ファームウェアの問題を別のところで回避しようとしているわけです。

  3. bombela

    BARという語や頭字語は34回言及されているのに、一度も定義されていません。

この日のほかの記事

2026-11-12