ASUS X99-SでBIOSを改造してResizable BARを有効にする方法

PCパーツ

そうだ、AIサーバーを作ろう

我が家でモニターアームを取り付けるためだけの存在となっていた、ThermaltakeのLEVEL 10。
LEVEL 10は、Thermaltakeの創立10周年記念モデルとして2009年に発売されたPCケースです。デザインを担当したのはBMW Group DesignworksUSAで、国内発売時の価格は税込8万9,800円。当時のPCケースとしてはかなりぶっ飛んだ価格ですが、それに負けないインパクトがあり、いま見ても唯一無二といえる製品です。

ただし、設計されたのは2009年。当然ながら、現在のPCパーツとは事情が大きく異なります。
3.5インチベイを6基、5.25インチベイを3基搭載するなど、ストレージや光学ドライブの収納スペースは豊富です。その反面、CPUクーラーの高さは最大150mm、ビデオカードの長さも最大310mmに制限されていますし、フロントに配置されたコネクタもUSB 2.0×4とeSATAという旧規格ばかり。

さらに、マザーボードを収納する部分が独立した箱状になっているため、高さ方向、つまりビデオカードの幅にもほとんど余裕がありません。ブラケットよりもクーラーが大きく張り出した最近のビデオカードは、ケースと干渉して取り付けられない可能性があります。
CPUクーラーについても選択肢は少なく、我が家で確認した範囲では、120mmラジエーターを使った簡易水冷か、背の低いトップフロー型が現実的で、サイドフローの大型CPUクーラーはほぼ全滅。最近の大型パーツを使って組むには、なかなか厳しいケースとなっています。
そんなLEVEL 10には、ASUS X99-Sを使ったシステムを組み込んでいたのですが使い道もなく、いつしかモニターアームを取り付けるための巨大なオブジェと化していました。

さすがにこのままではもったいない。
ということで、ビデオカードを追加し、Linuxを使ったAIサーバーとして復活させることにしました。

購入したのは、VRAMを16GB搭載したIntel Arc A770です。私が購入した時点では4万円ちょっとで、VRAM 16GBのビデオカードとしては比較的リーズナブルでした。
最近のAIブームでVRAMを多く搭載したビデオカードは価格が上がっており、私が4万円前後で探した範囲では、Radeon RX 6800とArc A770が主な候補となりました。
私の用途ではRX 6800の方が無難そうでしたが、せっかくなので、ここはあえて少数派のArc A770を選んでみました。

前置きが長くなりましたが、このArc A770で避けて通れないのが「Resizable BAR」です。
Arc A770はResizable BARが無効でも動作しますが、本来の性能を引き出すには有効化が強く推奨されています。
ところが、今回使用するASUS X99-Sは古い世代のマザーボードなので、通常のBIOS設定画面にはResizable BARの項目がありません。
そこで今回は、X99-SのBIOSを改造し、Resizable BARを使えるようにしてみることにしました。

Resizable BARとは?

Resizable BARは、CPUからビデオカードのVRAMへアクセスできる範囲を広げるPCI Expressの機能です。従来の仕組みでは、ビデオカードが16GBのVRAMを搭載していても、CPUから一度にアクセスできる範囲は一般的に256MB程度に制限されていました。

Arc A770のVRAMを、約1万6,000人を収容できるコンサート会場だとします。これだけ大きな会場があっても、従来の仕組みではCPU側の入り口から一度に案内できるのは、わずか256人分のエリアだけです。残りの座席が使えないわけではなく、最初の256人を案内したら、次の256人、その次の256人…というように、アクセスできるエリアを何度も切り替えながら会場に案内するので、入り口がボトルネックとなります。
Resizable BARを有効にすると、この制限が取り払われ、CPUから会場全体へ一気に約1万6,000人が直接アクセスできるようになります。

つまり、VRAMの容量やPCI Express自体の速度を上げる機能ではなく、CPUからVRAMを効率よく利用できるようにすることで、ボトルネックを解消する仕組みです。
特にIntel ArcシリーズはResizable BARの利用を前提に最適化されています。無効でも動作しますが、性能が大きく低下する場合があるため、Arc A770を使うなら有効にしておきたい機能です。

X99では公式では使用不可、BIOSを改造すれば使えることも

X99マザーボードが登場したころは、Resizable BARを必要とする一般向けビデオカードはまだ普及していませんでした。そのため、多くのX99マザーボードにはResizable BARを有効にする設定が用意されていません。
ASUS X99-Sも、4GBを超えるアドレス空間を利用する「Above 4G Decoding」には対応していますが、Resizable BARの設定項目はありません。

ただし、設定項目がないからといって、ハードウェア的に絶対使えないとは限りません。有志によって開発されている「ReBarUEFI」というツールを使い、Resizable BARに必要なモジュールをBIOSへ組み込むことで、古いマザーボードでも利用できる場合があります。
簡単にいうと、X99にはResizable BARを利用するための土台はあるものの、それを動かすための処理がBIOSに入っていません。そこでBIOSを改造し、不足している処理を追加すれば使用できる、というわけです。

ただし、すべてのX99マザーボードで利用できるわけではありませんのでご注意を。
BIOSの構造や書き込み制限、必要なアドレス空間を確保できるかどうかなどは、マザーボードによって異なります。改造BIOSを作成できても、正常に書き込めない場合や、書き込み後に起動しなくなる可能性もあります。

LEVEL10で使っているASUS X99-Sについては、ReBarUEFIの動作確認済みマザーボード一覧に掲載されており、GeForce RTX 3070で8GBのResizable BARが動作したと報告がありました。また、別のフォーラムには、Radeon RX 7600でResizable BAR有効化できたという報告もありましたので、ASUS X99-SでResizable BARを動かせる可能性はかなり高そうです。

X99-S 改造済BIOS(4101ベース)ダウンロード

改造するのは面倒、という方向けに、BIOSを置いておきます。
私のX99-Sでは動作していますが、動作しない、最悪マザーボードが壊れる可能性もありますので、完全自己責任にてご使用ください。動作しなくなった場合の責任は負いかねます。

https://review.pastime.ne.jp/zip/ASUS-X99-S-ReBar-Enabled.zip

Resizable BAR有効化方法

この作業はBIOSの書き換えを行います。私の環境で正常動作を確認済ですが、最悪マザーボードの故障に繋がる可能性もありますので、自己責任にて実施してください。不具合が発生した場合でも、当サイトは一切の責任を負いかねますのでご了承ください。

BIOSを書き換えるには fptw64.exe が必要となります。Intel ME System Tools v9.1 で検索し、ツールをダウンロード、fptw64.exe を含むディレクトリ一式(Flash Programming Tool\WIN64)を解凍して上記zipを解凍したbinと同じディレクトリに保存してください。

実行は、コマンドプロンプトから以下のコマンドを実行してください。

CommandPrompt
fptw64.exe -bios -f ASUS-X99-S-ReBar-Enabled.bin

BIOS更新後、電源OFF→コンセントを抜いてCMOSクリア→コンセントを繋いで電源ON。
続いてBIOS設定画面に入り、以下の設定を行います。

場所設定
Advanced → PCI Subsystem SettingsAbove 4G Decoding = Enabled
Boot → CSMLaunch CSM = Disabled

まだ、この状態ではResizable BARは有効になりません。
Windowsが起動したら、ReBarState.exeを使って有効化します。
ReBarState.exeは以下のgitからダウンロードしてください。

Releases · xCuri0/ReBarUEFI
Resizable BAR for (almost) any UEFI system. Contribute to xCuri0/ReBarUEFI development by creating an account on GitHub.

ダウンロードしたら、PowerShellで以下を実行します。

PowerShell
ReBarState.exe

起動すると、

Enter ReBarState Value

と表示されるので、以下の数字を入力します。
VRAM16GB → 14
VRAM32GB → 15
VRAM上限なし → 32
intel Arc A770は16GBなので、「14」を入力します。

14
Writing value of 14 / 16384 MB to ReBarState

Successfully wrote ReBarState UEFI variable

Reboot for changes to take effect
You can close the app now

と表示されれば有効化できました。PCを再起動してGPU-ZなどでResizable BARが有効になったか確認してください。

GPU-Zの画面ですが、Resizable BARがEnabledになっているのが解ります。

Resizable BARの詳細画面です。Resizable BARがEnabled、詳細がすべてYesになっていて、有効化されているのがわかります。

これで有効化は完了です。

Resizable BAR有無による性能差

Final Fantasy XVベンチマークを利用して、Resizable BAR有無による性能差をチェックしてみました。

BIOS改造前(Resizable BAR無効)

BIOS改造後(Resizable BAR有効)

スコアが7079から8175へと、約15.5%もの大幅な向上となりました。

自力でBIOSを改造したい場合

自力で作業したい方向けに、私の作業時のメモを残しておきます。
※上記zipと最終的に焼くBIOSのファイル名が異なりますので注意してください。

必要となるソフトウェア

ソフト入手先用途
ReBarUEFIgithub.com/xCuri0/ReBarUEFIReBarDxe.ffsReBarState.exe
UEFITool 0.28.0github.com/LongSoft/UEFIToolffs の挿入・抽出・検証
UEFIPatch上と同じリリースに同梱BIOS へのパターンパッチ適用
MMTool 5.02.0024公式配布なし(後述)ffs の置換・挿入
Intel ME System Tools v9.1公式配布なし(後述)fptw64.exe で SPI に読み書き
GPU-Ztechpowerup.com/gpuz結果の確認

UEFITool は 0.28.0 を使ってください。
最新の NE 版は閲覧専用で編集ができません。GitHub のリリースページで少し下にスクロールする必要があります。UEFIPatch も同じリリースの中に入っています。

MMTool と Intel ME System Tools の入手先について
どちらも公式には一般配布されていないもので、BIOS 改造の総本山である Win-Raid フォーラムから辿ることになります。

  • MMTool → 「[Guide] Manual AMI UEFI BIOS Modding」のスレッドから。X99 は Aptio V なので 5.02 系です(Aptio IV 用の 4.50 系とは別物なので注意)
  • Intel ME System Tools → 「Intel (CS) Management Engine: Drivers, Firmware and Tools」のスレッドから。X99 は ME 9.1 系。バージョンが違うものを使ってはいけません

検索するなら winraid MMTool Aptiowinraid ME System Tools 9.1 あたりで出てきます。フォーラムのアカウント登録が必要な場合があります。

手順

1. 現在の BIOS を吸い出す

X99 実機の Windows で、管理者権限のコマンドプロンプトから下記を実行します。

PowerShell
fptw64.exe -bios -d stock_4101.bin

2. UEFIPatch を当てる

ReBarUEFI リポジトリの patches.txt を用意して、以下を実行します。

PowerShell
UEFIPatch.exe stock_4101.bin

stock_4101.bin.patched が出力されます。
X99 でパッチが当たるのは PciBus(BAR サイズ上限の撤廃)と NvramSmiDxe(Socket 2011-v3 専用の NVRAM ホワイトリスト解除)の 2つです。

3. pad file が壊れていないか確認する

ここがASUS X99-Sの罠です。
UEFIPatch の出力をそのまま焼いてはいけません。
UEFITool で stock_4101.bin.patched を並べて開き、下の Messages 欄を見比べます。

オリジナル:
parseSection: section with unknown type 52h
parseFile: non-empty pad-file contents will be destroyed after volume modifications
parseSection: section with unknown type 52h
parseFile: non-empty pad-file contents will be destroyed after volume modifications

パッチ後:
parseSection: section with unknown type 52h
parseSection: section with unknown type 52h

non-empty pad-file の警告が 2件とも消えています。これは「中身の入った pad file を見つけた」ときに出るメッセージなので、消えたということはその中身が破壊されたという意味です。

原因は圧縮です。UEFIPatch のパターン置換自体は同じ長さの置き換えなのですが、対象モジュールが LZMA 圧縮セクションに入っているため、再圧縮でサイズが動いてボリュームが再配置され、pad file が巻き添えを食らいます。この状態で焼くとBIOSが壊れ起動できなくなります。

4. パッチ済みモジュールを ffs として取り出す

.patched を UEFITool で開き、GUID で検索して 2つのモジュールを Extract as is… で保存します。

モジュールGUID
PciBus3C1DE39F-D207-408A-AACC-731CFB7F1DD7
NvramSmiDxe54B070F3-9EB8-47CC-ADAF-39029C853CBB

念のため、オリジナル側からも同じ 2つを取り出してハッシュを比べておくと確実です。違っていればパッチが当たっている証拠になります。

PowerShell
Get-FileHash .\*_stock.ffs, .\*_patched.ffs | Format-Table Hash, Path

5. MMTool で移植する

ここからは .patched を捨てて、無傷の stock_4101.bin のコピーに対して作業します。
MMTool 5.02.0024 を管理者権限で起動して Load Image

  1. Replace タブ → 下のリストで対象モジュールの行を先に選択 → ffs を指定 → Replace as is(PciBusとNvramSmiDxeの2つ)
  2. Insert タブ → PciBus と同じボリューム(私の環境では Volume 03)の最後のモジュールを選択 → ReBarDxe.ffsInsert as is
  3. Save Image as… で別名保存

as is を選ぶのが重要です。ffs 側にすでに圧縮セクションが入っているので、MMTool にもう一度圧縮させると二重圧縮で壊れます。
保存時に Saving secure rom as unsigned と警告が出ますが、これはASUSの署名が付かないという意味になりますので問題ありません。(このためAsusの EZ Flash では焼けません)

保存したら必ず UEFITool で開き直して検証します。

  • Full size が元と同じか(E80000h
  • non-empty pad-file の警告が 2件とも残っているか
  • Text 検索で ReBarDxe がヒットするか

2番目が最重要です。ここが減っていたら MMTool でも同じ破損が起きているので、焼いてはいけません。

なお、今回の作業で一番どハマりしたのがここで、MMToolは古いアプリなのと、日本語環境が原因なのか不明ですが、ボタンが隠れていて操作できません。
今回の作業のためにVMWare上にWindows7、WindowsXP環境も構築してみたりしましたが症状は同じ。PowerShellで強引にウィンドウサイズを変更することもできましたが、毎回コマンドを入力する必要もあり面倒でした。

よくよくMMToolを見てみたら、かろうじてクリック出来るサイズで、ボタンの一部が表示されていましたので、気合いでこのボタンをクリックすることで作業可能です。

6. 書き込む

PowerShell
fptw64.exe -bios -f stock_4101-ReBar.bin
PowerShell
Platform: Intel(R) C610 Series Chipset
Flash Descriptor: Valid
    --- Flash Devices Found ---
    W25Q128BV    ID:0xEF4018    Size: 16384KB (131072Kb)
- Erasing Flash Block [0x201000] - 100% complete.
- Programming Flash [0x201000]    4KB of    4KB - 100% complete.
(中略)
- Verifying Flash [0x1000000] 14848KB of 14848KB - 100% complete.
RESULT: The data is identical.
FPT Operation Passed

書き込み後の設定

  1. シャットダウン(再起動ではなく完全に電源を落とす)
  2. CMOS クリア(CLRTC ジャンパ、または電池を抜く)
  3. 起動。初回は POST に時間がかかったり勝手に再起動することがありますが、正常です
  4. BIOS で Above 4G Decoding = EnabledLaunch CSM = Disabled
  5. Windows が UEFI + GPT で入っていること(Legacy / MBR だと ReBar は効きません)

CMOS クリアで XMP なども初期化されるので、メモリ設定は入れ直しになります。
最後に Windows 上で ReBarState.exe を管理者権限で実行し、32(制限なし)、または14(VRAM16GB)、15(VRAM32GB)を入力して再起動。
GPU-Z の Resizable BAR が Enabled になっていれば成功です。

コメント

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