後ろへ向かって前進 Act.2

www.ragemax.com

(更新: 2017年3月30日)

Haswell-EP Xeonのバグを突いて、いつもより高いクロックで動かしてみる話

 ことし2017年の始めごろ、海外Anandtechのフォーラムで
『Haswell-EP世代(E5-26xx v3)のXeonにあるエラッタ(不具合)を利用して、
全コアTurboBoost動作時のクロックを通常より引き上げる』というハックが披露されました。

 Twitterでこのスレッドを見つけた筆者、自分の環境でも試せるんじゃないかと思い
四苦八苦した結果、なんとか動くようになりましたので結果を残しておきたいと思います。
筆者の場合、全コア動作時2.3GHzだったクロックが、全コア2.9GHz前後で動くようになりました!

 なお、手順については**ASUS・Z10PE-D8 WS+Windows 10 64bit**
**(UEFIでインストール済み)**のものであり
他の環境では細かい点で異なることがあります。
詳しくは上記のスレッドを参照してください。

[内容]

  •  動作の概要
  •  準備
  •  手順

※実行する際は自己責任でお願いします。
何があっても責任はとれません。

※3/29追記:抜けていた項目(UEFIモードの記述・EFI Shell起動用環境の準備)が
あったので追記しました。
※※3/30追記: EFI Shellの構文を修正しました。

[動作の概要]

 上記で紹介したAnandtechのフォーラムで解説されていますが、おおむねこういう感じです。

  • Haswell-EPには、TurboBoostの動作にエラッタがあり
    CPUの初期化後、ターボ時最大周波数が誤った数値で設定されてしまう。ただし、CPUマイクロコードの更新で修正されている。
  • このエラッタを利用するため、マザーボードのBIOSからHaswell-EPのCPUマイクロコードを
    削除し、その上で全コア動作時のTurboBoostクロックを変更するドライバを
    UEFI上で適用させて、OSを起動する。
  • OSもCPUマイクロコードファイルを持っているが、これを使わせないようにして
    エラッタを利用できる任意のマイクロコードを使うように設定しておしまい
  • これで、複数コア動作時に通常より高い周波数でターボブーストを利用できる。

細かい内容については省きましたが、このような手順を経ることで動作クロックが変化します。

筆者の家にある E5-2686v3(18コア、2GHz/ターボ時最大3.5GHz)これが作業前です。

Multiplier(倍率)が最大23になっています

作業後はこうなります。

Multiplierの値が最大23から35に変わりました

最小値はともかく、最大時の倍率が上がっています。
とはいえ、全コア35倍で動くわけではないですが……

 実際のところ、CPUの動作コア数によって最大値はある程度決まっているようです。
たとえばHaswell-EP最大コア数である、E5-2699v3(18コア、2.3GHz/ターボ時最大3.6GHz)の場合は
通常だと9コア以上時の最大クロックは2.8GHzになりますが、ハック後は以下のように動きます。

動作コア数
最大クロック
1-10コア3.6GHz
12コア3.5GHz
14コア3.4GHz
16コア3.2GHz
18コア3.1GHz

 これはC612のデュアルソケットマザーだけでなく、X99のようなシングルソケットマザーでも使えます。
Anandtechのスレッドでも、X99での動作確認が多いです。

なお、以下の注意点があります。

  • これが動くのは、CPUIDが0306F2のHaswell-EPです**。**
  • Broadwell-EPでは動作しません。これは同じエラッタが最初から修正されているからです。
  • OSがUEFIモードでインストールされている必要があります。

[準備]

anandtechのフォーラムのこのポストから、以下のファイルをダウンロードしておきます。

  • VMwareのマイクロコードアップデートツール(VMWare Toolと書いてある)
  • マイクロコードファイル(0x27,0x39のファイル、microcode_amd.bin、microcode_amd_fam15h.bin)
  • EFI Shell起動用の環境を作っておく。
    ①ここから Shell.efi をダウンロード、BOOTx64.EFI  にリネームする。
    ②FAT32フォーマットしたUSBメモリに EFIフォルダを作る。
    ③さらにその中に Boot フォルダを作り、そこへ BOOTx64.EFIをコピーしておく。

また、anandtechのフォーラムのこのポストから、V3X2.EFI というファイルをダウンロードしておきます。

これは、CPUIDが0306F2であるHaswell-EP Xeon(QS品、製品版)の
ターボブースト時周波数を変更するためのものです。
ES品のように、CPUIDが0306F1である場合は使えません。
(対応するファイルがフォーラムにあるかもしれませんが……)

ダウンロードしたファイルは、EFI Shell環境を作ったUSBメモリに入れておきます。

ASUSのサポートページから、Z10PE-D8 WSのUEFIファイル(バージョン3304、直リンク)をダウンロードして
保存しておきましょう。

Z10PE-D8 WSのUEFIをバージョン3204にダウングレードしておいてください。
ダウングレードには、FAT32のUSBフラッシュメモリに該当バージョンのUEFIファイルを入れ
Z10PEWS.CAP にリネームしたあと、USB BIOS Flashback 機能を使って更新します。

[手順]

バイナリエディタでUEFIファイル(Z10PE-D8-WS-ASUS-3304.CAP)を開き、以下を編集して保存。
 ・0xEBD0CE 03 → 05
 ・0xEBD116 03 → 01

赤枠2点を書き換え

Z10PE-D8-WS-ASUS-3304.CAP を Z10PEWS.CAP にリネームし、FAT32フォーマットの
USBメモリのルートに放り込む。

USB BIOS Flashback機能を使ってUEFIを更新する。

更新が終わったら起動し、UEFIの設定をする。このとき、以下の設定をしておく

保存して再起動し、EFI Shell環境を作ったUSBメモリからブートする。
[startup.nsh]の処理はESCキーを押してスキップする。

EFIファイルが動くかどうかテストするため、load fsx:\V3X2.EFI と打ってエンターキーを押す。
(x=USBフラッシュメモリのパーティション番号、環境によって違う)
v3 - All Turbo Set
v3 - All Turbo Set
Image ~ - Success と出れば問題なし。

EFIファイルをブートドライブの領域にコピーするため、以下のコマンドを打ってエンターキーを押す。
cp fsx:\V3X2.EFI fsy:\EFI\BOOT\
(y=ブートドライブのブートパーティション番号、環境によって違う)

コピーしたファイルを起動時に動くよう登録するため、以下のコマンドを打ってエンターキーを押す。
bcfg driver add 0 fsy:\EFI\BOOT\V3X2.EFI “V3 all Turbo”
9.
reset と打ってエンターキーを押すと、再起動する。
(再起動後、UEFI画面に入って[Boot]タブを見ると、ドライバーとして[V3 all Turbo]が追加されている。)

これが起動時に読み込まれる

Windowsが起動したら、OSが持っているマイクロコードファイルをリネームして使えなくします。
ファイルは、c:\Windows\system32\mcupdate_GenuineIntel.dllです。
リネームして mcupdate_GenuineIntel.dllbak とでも変更しましょう。
うまく名前が変更できない場合は、リカバリディスクやその他の起動ディスクから起動し
なんとか名前を変更しましょう。

特定のマイクロコードファイルを、マイクロコードアップデートツールを使って更新します。
ダウンロードしたマイクロコードはどちらかを使います。以下のような傾向があるようです。

0x27……パフォーマンス重視。
0x39……安定性重視。

使う方を決めたら、使うファイルを microcode.dat にリネームし、
microcode_amd.bin、microcode_amd_fam15h.bin と一緒に
マイクロコードアップデートツールのフォルダへコピーし、フォルダ内の install.bat を
右クリック→[管理者として実行]でインストールします。

インストールが終わったら再起動して、完了です。
これで、通常より高いクロックで動作できるようになります。

以上です。