ASUS ROG Rampage VI ExtremeのPCIe x16をx8/x8に分割して使う方法

PCパーツ

1枚のカードにTesla V100 SXM2 32GBを2基載せたdualカードを購入しました。2基のGPUを正しく認識させるためには、1本のx16スロットを「x8+x8」に分割(いわゆるBifurcation)する必要があり、x16のまま使用すると片方のV100しか認識されません。
最近のマザーボードであれば、BIOSのPCIe設定にx8/x8やx4/x4/x4/x4といった項目があるものも多く、簡単に設定可能です。

シングルのV100用を載せるために購入したASUSのROG Rampage VI Extremeが手元にあるのですが、dualカードを購入したので、どうせなら当時のハイエンドマザーであるRampage VI Extremeを使いたいところ。
1枚の基板に2基のSXM2を搭載しているカードは、1本のPCIe x16をx8/x8に分割して使用する必要があります。しかし、Rampage VI ExtremeはHyper M.2 X16カード向けのx4/x4/x4/x4分割は用意されているのですが、x8/x8は設定不可でした。

ただ、x4/x4/x4/x4分割が出来るのであれば、x8/x8も使用出来るのでは?と思い、claudeに聞いてみたところ、最新BIOSをダウンロードして逆アセンブルまでしてくれて、どうやら設定はあるっぽいことが判明。
BIOSの中身を覗いてみると、分割の設定値そのものはちゃんと存在しており、画面の選択項目に出ていないだけでした。であれば、UEFIシェルから直接その値を書き換えてしまえば良いのです。

というわけで、今回はBIOS本体には一切手を加えず、NVRAMの設定値を1バイトだけ書き換えてx8/x8を有効にする方法をまとめておきます。

Rampage VI Extremeでx8/x8分割を使うメリット・デメリット

メリット

  • BIOSの画面に無いx8/x8分割が使えるようになる
  • BIOS本体は書き換えないので、改造BIOSを焼くようなリスクがない
  • 書き換えるのは1バイトだけ。失敗しても背面のCLR CMOSボタンで元に戻せる
  • 最上段(PCIEX16/X8_1)と中段(PCIEX16/X8_3)のどちらでも分割できる
  • 必要なツールはすべて無料で、GitHubの公式リリースから入手できる

デメリット

  • EFI Shell画面でコマンドを打つ作業があるので、慣れていない方には多少ハードルがある
  • BIOSのバージョンが違うと、書き込む場所がずれる可能性がある(今回は4401で確認)
  • 「Load Optimized Defaults」やBIOS更新、CLR CMOSをすると設定が消え、やり直しになる
  • V100には映像出力が無いので、作業用に表示用のビデオカードが別途必要
  • 当然ながらメーカーサポートの対象外

ROG RAMPAGE VI EXTREMEのPCIeスロット構成

Rampage VI ExtremeのPCIeスロットは、上から順に5本あります。
このうちx8/x8に分割できるのは、最上段のPCIEX16/X8_1と、中段のPCIEX16/X8_3の2本です。

スロット位置x8/x8分割備考
PCIEX16/X8_1最上段可IOU1の16レーンを独占。CPUのレーン数を問わない
PCIEX8_22段目―PCIEX16/X8_3と後半8レーンを共用
PCIEX16/X8_3中段可44レーンCPU限定。PCIEX8_2は空ける必要あり
PCIEX4_14段目―
PCIEX8_4最下段―

迷ったら最上段のPCIEX16/X8_1に挿すのがおすすめです。こちらはIOU1というPCIeコントローラの16レーンを1本で独占していますので、28レーンのCPUでもそのまま分割できます。

中段のPCIEX16/X8_3は、後半の8レーンをPCIEX8_2と共用している関係で、PCIEX8_2に何かカードが挿さっていると後半のx8レーンがそちらに持っていかれます。
また、28レーンのCPUではそもそもx8までしか配線されていませんので、PCIEX16/X8_3を分割して使うには44レーンのCPUが前提になります。

設定値を1バイト書き換えるだけでOK

Rampage VI ExtremeのBIOS(バージョン4401)を解析してみると、PCIeの分割設定は「SocketIioConfig」という設定領域に格納されていました。対応関係は以下の通りです。

場所対応するスロット
SocketIioConfig:0x32PCIEX16/X8_3(+PCIEX8_2)
SocketIioConfig:0x33PCIEX16/X8_1
SocketIioConfig:0x34PCIEX8_4

書き込む値の意味はこうなっています。

値分割
00x4/x4/x4/x4
01x4/x4/x8
02x8/x4/x4
03x8/x8
04x16
FFAuto(初期値)

実はBIOS自身も、CPU Storage ConfigurationでPCIEX16/X8_3を「Hyper M.2 X16 (Data)」にすると、0x32に00(x4/x4/x4/x4)を書き込んでいます。仕組みとしては用意されていて、x8/x8の選択肢がメニューに無いだけです。
ですので、メニューに無いならEFI Shellからコマンドを入力して03に設定を変更すればx8/x8になる、というわけです。

つまりやることは、最上段のPCIEX16/X8_1なら0x33、中段のPCIEX16/X8_3なら0x32に「03」を1バイト書くだけでx8/x8の分割が利用出来ます。

では、早速書き換えていきましょう。

用意するもの

EFIシェル(BOOTX64.EFI)

USBメモリから起動するUEFIシェル本体です。GitHubで公開されている「pbatard/UEFI-Shell」のリリースページから入手できます。

ダウンロードした「shellx64.efi」を、「BOOTX64.EFI」という名前にリネームして使います。ここが一番のポイントで、名前を変えずにそのまま置いても起動しません。
ISOイメージも並んでいますが、今回は単体のefiファイルの方で十分です。

setup_var.efi

UEFIシェル上で、BIOSの設定値(UEFI変数)を読み書きするためのツールです。

BIOS 4401のファイル

今回の手順はBIOS 4401で確認しています。バージョンが違うと設定値の位置がずれる可能性が高いので、古いバージョンだった場合はASUSの公式サポートページから4401をダウンロードして最新化しておきましょう。

画面表示用のビデオカードとUSBキーボード

V100には映像出力がありませんし、X299のCPUには内蔵GPUも無いため、表示用のビデオカードが別途必要です。今回はGT1030を利用しました。
シェルではコマンドを打ちますので、USBキーボードも必要です。

USBメモリ

容量は何でも構いませんが、32GB以下のものが扱いやすいです。理由は次で説明します。

USBメモリの作り方とディレクトリ構造

FAT32でフォーマットする

UEFIが起動できるのはFAT32のUSBメモリだけです。exFATやNTFSでは起動できません。
Windowsのエクスプローラーで、USBメモリのドライブを右クリック→「フォーマット」→ファイルシステムを「FAT32」にして開始します。

なお、64GB以上のUSBメモリだとWindows標準のフォーマットではFAT32が選べません。その場合は、小さいUSBメモリを使うか、Rufusなどの無料ツールでFAT32を指定してフォーマットしてください。32GB以下のUSBメモリが便利だ、というのはこれが理由です。

ファイルを保存する

フォーマットしたUSBメモリに、次のようにファイルを置きます。

USBメモリ (R6E:)
├─ EFI
│   └─ BOOT
│       └─ BOOTX64.EFI                       ← UEFIシェル本体(shellx64.efiをリネーム)
├─ setup_var.efi                             ← 設定値を読み書きするツール
└─ ROG-RAMPAGE-VI-EXTREME-ASUS-4401.CAP      ← BIOS 4401(更新が必要なときだけ使う)

「EFI」フォルダと、その下に「BOOT」フォルダを作成してください。
マザーボードは、USBメモリの「EFI\BOOT\BOOTX64.EFI」という決まった場所にあるファイルを自動で読み込んで起動する仕組みになっていますので、フォルダ名とファイル名は上記に合わせる必要があります。

setup_var.efiとBIOSのCAPファイルは、USBメモリの一番上に保存します。

作業の流れ

PCを組み立て、起動することを確認する

V100カードと表示用のビデオカードを挿して、まずはBIOS画面に入れることを確認します。この時点ではV100は1基しか見えていないか、認識されていなくても問題ありません。
なお、V100カードをRampage VI Extremeに取りつけた場合、Above 4G Decodingを有効にしないと起動しませんので、装着前にAbove 4G Decodingを有効にしてください。

BIOSのバージョンを確認する

BIOS画面を開いたら、F7キーを押しAdvanced Modeを表示します。
「Main」タブにBIOS Versionが表示されます。4401より古ければ、「Tool」タブの「ASUS EZ Flash 3 Utility」から、USBメモリのCAPファイルを選んで更新しておきます。

Secure Bootを「Other OS」にする

「Boot」タブ→「Secure Boot」→「OS Type」を「Other OS」に変えて保存します。USBメモリのシェルにはASUSの署名が付いていませんので、Secure Bootが有効なままだと起動を拒否されます。

なお、「Advanced」→「CPU Storage Configuration」の項目には触らないでください。ここを操作すると、これから書き込む値がAutoに上書きされてしまいます。

USBメモリからシェルを起動する

「Boot」タブの一番下にある「Boot Override」から「UEFI: (USBメモリの名前)」を選びます。黒い画面に英語が表示され、最後に「Shell>」と表示されれば成功です。

現在の値を確認して、03を書き込む

シェルで、まずUSBメモリのドライブ(fs0:)に移動して、現在の値を読み出します。
1行ずつ、以下のコマンドを入力してください。
なお、キーボードレイアウトが英語配列になりますので、日本語キーボードを使っている場合はキーの印字と入力文字がズレるので要注意です。

fs0:
setup_var.efi SocketIioConfig:0x30(8)

「00 00 FF FF FF FF FF 00」という8バイトが表示されれば、想定通りのBIOSです。3番目(0x32)が中段、4番目(0x33)が最上段の設定で、FF(Auto)になっていることが確認できます。
ここで違う並びが出た場合は、BIOSのバージョンが違う可能性がありますので、作業を中止してください。

確認できたら、V100カードを挿したスロットに合わせて値を書き込みます。

setup_var.efi SocketIioConfig:0x33=0x03      ← 最上段(PCIEX16/X8_1)の場合
setup_var.efi SocketIioConfig:0x32=0x03      ← 中段(PCIEX16/X8_3)の場合

書き込んだあと、setup_var.efi SocketIioConfig:0x32 (中段の場合)と入力し、「03」と出れば成功です。最後に「reset -s」と入力して電源を切り、10秒ほど待ってから電源を入れ直します。
分割の設定は起動時の初期化で読み込まれますので、再起動ではなく一度電源を切る必要があります。

EFIシェルが起動できないとき

一番つまずきやすいのがここかと思います。Boot Overrideに「UEFI:」の項目が出てこない、選んでもシェルが立ち上がらずにWindowsが起動してしまう、あるいは「EXIT」メニューからLaunch EFI Shell from USB drivesを選ぶと注意書きが表示されて再起動できない。こういった場合は、以下を順に確認してみてください。

Secure Bootのキーを削除する

OS Typeを「Other OS」にしただけでは、Secure Bootが無効化されずにLaunch EFI Shell from USB drivesを選択出来ません。その場合は、Secure Bootのキーそのものを削除します。

「Boot」タブ→「Secure Boot」→「Key Management」を開き、「Clear Secure Boot keys」を実行します。キーが無くなるとSecure BootはSetup Modeという状態になり、署名の無いシェルでも起動できるようになります。

作業が終わったら、同じKey Managementの画面で「Install Default Secure Boot keys」を実行すれば、工場出荷時のキーに戻せます。Windows 11を使っている場合や、BitLockerを有効にしている場合は、作業後に忘れずに戻しておいてください。
BitLockerを使用している場合、Secure Bootの状態が変わると回復キーを求められることがありますので、事前に回復キーを控えておくと安心です。

起動デバイスがUSBメモリになっているか確認する

「Boot」タブの「Boot Option #1」が、USBメモリになっているかを確認します。ここがWindowsのドライブのままだと、Boot Overrideを使わない限りそちらが優先して起動します。
「UEFI: (USBメモリの名前)」を1番目に設定して、F10で保存してください。

ここで注意したいのは、同じUSBメモリが「UEFI:」付きと付かないものの2つ表示される場合があることです。選ぶのは必ず「UEFI:」付きの方を選択してください。付いていない方はレガシー起動になりますので、シェルは起動しません。

BIOSの設定を変えずに済ませたい場合は、起動時にF8キーを連打してブートメニューを出し、そこから「UEFI: (USBメモリの名前)」を選ぶ方法が手っ取り早いです。

動作確認

OSが起動したら、V100が2基とも見えていて、それぞれx8で接続されているかを確認します。

nvidia-smiの実行結果です。2基のTesla V100-SXM2-32GBが正しく認識されているのが解ります。
3番目のビデオカードは、画面表示用のGT1030です。

元に戻す方法と注意点

元に戻す方法は2通りあります。どちらもBIOS本体には影響しません。

ひとつは、シェルからAutoに戻す方法です。同じようにシェルを起動して、書き込んだ場所に0xFFを書き戻し、reset -sで電源を切ります。

setup_var.efi SocketIioConfig:0x33=0xFF      ← 最上段の場合
setup_var.efi SocketIioConfig:0x32=0xFF      ← 中段の場合

もうひとつは、電源を切った状態で背面パネルのCLR CMOSボタンを押す方法です。BIOSの設定がすべて工場出荷時に戻り、今回の値もAutoに戻ります。画面が映らなくなった、起動しなくなった、というときはこちらが一番確実です。

逆に言うと、以下の操作をすると設定がAutoに戻ってしまいますので注意してください。

  • BIOSの「Load Optimized Defaults」を実行
  • BIOSを更新
  • CLR CMOSボタン押下
  • 「CPU Storage Configuration」の項目変更

これらを行った場合、シェルでの書き込みをやり直す必要があります。一度USBメモリを作っておけば数分で済む作業ですので、USBメモリは捨てずに取っておくことをおすすめします。

頻繁に書き換えるのが面倒であれば、BIOSを改造してしまう(Hyper M.2 X16カード用のメニューを乗っ取ってx8/x8分割に変えてしまう)ことも可能ですが、BIOSの書き換えを伴うのでリスクが高いと言えます。

まとめ

BIOSの画面に無い設定を、UEFIシェルから直接書き換えてしまう、と聞くとリスクが高そうにも思えますが、実際にやっていることは「BIOSの設定値を、別の値で上書きする」だけです。BIOS本体を書き換える改造BIOSと比べれば、リスクはずっと低いと思います。
失敗してもCLR CMOSボタン一発で戻せる、というのも安全です。

X299やX99といった古いHEDTのマザーボードは、x16スロットが潤沢にありますので、複数のGPUカードを利用したり、今回のように分割前提のカードを載せるプラットフォームとしてはかなり便利です。ところが、当時はBifurcationという機能自体がまだ一般的ではなかったため、BIOSの画面では選べないことが少なくありません。
諦めて新しいマザーボードを買う前に、BIOSの中に設定値が眠っていないか、BIOSの解析を行ってみる価値はあるかと思います。AIを使えば自動的に見つけてくれますので便利です。

今回の値はRampage VI ExtremeのBIOS 4401を用いた場合の設定方法となります。他のマザーボードやBIOSバージョンでは設定箇所が異なる、あるいはそもそも分割出来ない場合もありますので、必ずそのBIOSを解析して分割可能か確認してから作業を行ってください。
リスクはあまり高くない作業ですが、自己責任にてお願いいたします。

コメント

タイトルとURLをコピーしました