UE5 のビルドを速くする、分散ビルド UnrealBuildAccelerator を使う

UE5 5.4 には UnrealBuildAccelerator (以下 UBA) という分散ビルドツールが付属しています。家に複数台の PC がある場合は、それぞれインストールしておくとことでビルド時間を大幅に短縮することができます。

実際に空いている PC を使って UE5 のビルドがどれくらい速くなるの比較してみました。以下の表は UE5 5.4.2 Win64 Development Editor のエンジンリビルド時間の比較です

CPUARCHCoRE数THREAD数単独ビルド時間分散ビルド利用時ビルド速度
Core i7-13700RaptorLake162448m 00s15m 21s3.1 倍
Ryzen 5 3600Zen261291m 28s16m 28s5.6 倍
UE5 ビルド時間の比較、ビルド時間が短い方が高速

Core i7-13700 では 48分かかっていたビルドが分散ビルド利用時でわずか 15分。単独でビルドしていた場合の 1/3 の時間で完了しています。

コア数が少ない Ryzen 5 3600 の場合はさらに効果が大きく、ビルド速度は 5.6倍にもなります。91分から 16分まで短縮できており、スタンドアロンの場合は Core i7-13700 の倍の時間がかかっていたものが、分散ビルドを使うとほぼ同じ時間で完了しました。

今回分散ビルドで使用した PC は以下のとおりです。

CPUARCHCORE数THREAD数RAM容量
Ryzen 5 2600Zen1+61232 GB
Ryzen 5 3600Zen261264 GB
Ryzen 5 5560UZen361232 GB
Ryzen 7 4750GZen281632 GB
Ryzen 9 3950XZen2163232 GB
Core i7-13700RaptorLake162464 GB
合計58108
ビルドに使用したヘルパー (Agent) PC 一覧

全部で PC 6台、合計 58コア 108スレッド使用しています。

Core i7-13700 でビルドした場合は他の 5台がビルド用のヘルパー (Agent) になります。本体 16コア 24スレッドで、加えて外部の PC が Agent として 42コア 84スレッド分追加される形になります。同じように Ryzen 5 3600 の場合は本体 6コア 12スレッドに対して外部の PC が 52コア 96スレッドです。

非常に効果が大きかったので、PC が複数台ある場合は UBA を使うことでビルド時間をだいぶ短縮できそうです。

以下分散ビルド UBA のインストール方法の詳細です。

インストール手順

インストールにあたってこちらのページを参考にさせていただきました。UBA について詳しくはこちらのページも参照してください。

(1) HordeServer インストール

どれか 1台の PC に HordeServer をインストールします。この手順は GitHub のソースコード版エンジン UE5 5.4 のものです。

  1. UnrealHordeServer.msi を実行してインストールします
    • GitHub 版のエンジンをビルドしている場合は Engine/Extras/Horde/UnrealHordeServer.msi にあります。
    • GitHub からダウンロード直後は Extras フォルダがないので、先に Setup.bat を実行しておく必要があります。
  2. このマシンに Port 13340 でアクセスできるようにしておきます
    • Firewall で制限がかかっている場合は、TCP Port 13340 でアクセスできるように設定しておいてください

(2) HordeAgent のインストール

ビルドに使いたい PC それぞれに Agent をインストールします。HordeServer と同じマシンにインストールしても構いません。

  1. ブラウザで HordeServer をインストルした PC にアクセスします
    • 「 http://サーバーPCのIPアドレス:13340/tools 」を開きます
  2. ダウンロードページが開くので「Horde Agent (Windows Installer) 」をダウンロードします
  3. ダウンロードした UnrealHordeAgent.msi を実行してインストールします
    • 「Horde Server URL:」には「 http://サーバーPCのIPアドレス:13340」を入力します
      • 注意: サーバーが自分自身の場合でも絶対に「localhost」や「127.0.0.1」を使わないでください。ここで接続に使用したアドレスが他の PC に配布されるので、localhost だとこの Agent にアクセスできなくなります。
    • 「Sandbox directory: 」はキャッシュとして使うフォルダを指定します
      • 空き容量の多い SSD ドライブをおすすめします。問題なければそのままでも構いません。
  4. インストールが終わると、ブラウザで自動的に「Agent Enrollment」のページが開きます
    • もし開かない場合は、タスクトレイの「U」アイコン (Unreal Engine のロゴ) 右クリックから「Enroll with Server…」を選択してください
  5. しばらくすると Agent Enrollment のページに PC 名が表示されるので、選択して右上の「Enroll Agents」をクリックします
    • PC が表示されるまで時間がかかる場合があります。数分待ってみてください。
  6. 登録が終わったら、「http://サーバーPCのIPアドレス:13340/agents」を開いて PC が表示されていることを確認してください
  7. タスクトレイに UnrealEngine ロゴのアイコン (UnrealHordeAgent) が登録されているので、右クリックして Status を「When Idle」に変更します
    • Status → When Idle
  8. Agent PC に Port 7000~7010 でアクセスできるようにしておきます
    • Firewall の設定で TCP Port 7000~7010 で受信できるようにしておきます

同じ手順で各 PC にそれぞれ HordeAgent をインストールしておきます。今回のテストでは 6台の PC 全てに Agent をインストールしています。

なお VisualStudio などビルド環境のセットアップは不要です。

(3) ビルドするための設定

ビルドを行う側の PC にもさらに追加の設定が必要です。

  1. BuildConfiguration.xml を作成します
    • 特定のエンジンだけで使用する場合は、エンジンフォルダ内の Engine/Saved/UnrealBuildTool/BuildConfiguration.xml に保存します
    • もし全部のエンジンで同じ設定を使いたい場合は、自分のドキュメントフォルダの中に 「ドキュメント\Unreal Engine\UnrealBuildTool\BuildConfiguration.xml」のように入れてください
  2. BuildConfiguration.xml の内容は以下のとおりです
    • xml 内の「サーバーPCのIPアドレス」の部分は置き換えてください。
    • すでに BuildConfiguration.xml が存在する場合は内容を追加してください。
<?xml version='1.0' encoding='utf-8'?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
    <BuildConfiguration>
        <bAllowFASTBuild>false</bAllowFASTBuild>
        <bAllowUBAExecutor>true</bAllowUBAExecutor>
    </BuildConfiguration>
    <Horde>
        <Server>http://サーバーPCのIPアドレス:13340</Server>
        <WindowsPool>Win-UE5</WindowsPool>
    </Horde>
    <UnrealBuildAccelerator>
        <bLaunchVisualizer>false</bLaunchVisualizer>
        <bForceBuildAllRemote>false</bForceBuildAllRemote>
    </UnrealBuildAccelerator>
</Configuration>

これで完了です。この設定をした PC 上で UE5 の C++ ビルドを行うと分散ビルドが行われます。

ビルドを行う場合の注意点

ステータス切り替えについて

HordeAgent には PC の Idle 状態かどうか判定して Status を動的に切り替える機能があります。

ですが負荷の高い作業やゲームのテストプレイ、負荷の調査などを行う場合は、意図しないビルドタスクが割り当てられてしまわないように予め手動でステータスを切り替えておくことをおすすめします。

  1. タスクトレイの「U」(UnrealEngine ロゴ)アイコン右クリック → Status
  2. 普段は「 When Idle 」にしておく
  3. テストプレイ前に「 Disabled 」に切り替え、終わったら「When Idle」に戻す

Horde Agent の設定変更

サーバーの URL やキャッシュフォルダなど、インストール時に入力したパラメータをあとから UI 上で変更する方法が見つかりませんでした。変更したい場合は、もう一度インストーラーを実行し直すのが確実なようです。

ARM CPU の 64bit/32bit 命令対応

最近の ARM CPU Core は 32bit 命令への対応が徐々に無くなりつつあり 64bit 命令のみ動作するようになっています。

Apple はすでに iOS11 の段階で 64bit に完全移行しており 32bit のアプリが動作しません。同時にプロセッサも 32bit 命令が廃止されており、Apple A11 (iPhone8/X) 以降は AArch32(ARMv7) 命令非対応となっています。

同じように ARM の CPU Core も完全な 64bit 化が進んでいます。ARM Core の世代と 32bit/64bit への対応状況をまとめてみました。

ARMv8 世代の CPU までは 32bit/64bit 両方の命令に対応していますが、ARMv9 世代になってからは段階的に 32bit 命令が廃止されてきていることがわかります。

Apple の watchOS のように、ILP32 で 32bit OS ながら対応命令が 64bit (AArch64) のみとなっているものもあります。(詳しくはこちら「Apple Watch Series 6 と CPU 性能の測定」)

関連エントリ

IvyBridge と N100 を比較する

OS サポートが切れた 12年前の Mac mini をずっと Linux マシンとして使用していましたが、今なら Intel N100 の方が速いのではないかと思い速度を比べてみました。N100 は AlderLake (第12世代) の E-Core のみ搭載した CPU です。

以下は Ubuntu 22.04 におけるコンパイル時間 (clang 14) を比較したものです。

PCCPUTDPClockCoreThreadコンパイル時間
Mac mini Late2012Core i7-3615QM45W3.3GHzIvyBridge4C 8T69.57
Mini PCIntel N10020W3.2GHzAlderLake(E)4C 4T59.67
  • ↑コンパイル時間の数値が小さい方が高速

ストレージもメモリもクロックもちょうど同じくらいの性能でしたが、N100 の方が 10秒ほど早くビルドが終わっています。N100 は Atom 系の省電力コアながら、第3世代 Core の IvyBridge よりも速いことがわかります。

搭載されているメモリとストレージは以下の通りです。

PCCPURAM 容量メモリの種類メモリ速度STORAGE
Mac mini Late2012Core i7-3615QM16GBDDR3-1600 x225.6 GB/sSATA SSD
Mini PCIntel N10016GBDDR4-3200 x125.6 GB/sSATA SSD

なお N100 の TDP はスペックを見ると 6W ですが、テストした PC の UEFI (BIOS) では PL1=20W, PL2=無効 に設定されていたため今回の結果は 20W 時の値になっています。

さらに N100 で vfpbench の値も調べてみました。IvyBridge と比較してみます。

PCCPUTDPClockSingle SpSingle DpMulti SpMulti Dp
Mac mini Late2012Core i7-3615QM45W3.3GHz51.7G26.1G193.4G97.0G
Mini PCIntel N10020W3.2GHz54.2G27.1G185.0G92.6G
  • ↑数値の単位は FLOPS、値が大きい方が高速

すべての結果は以下の場所にあります。

掲載した表の数値はピーク値のみです。これを見るとどちらもあまり差が生じていないように見えますが、その内訳は大きく異なっています。

IvyBridge は 256bit の浮動小数点演算パイプを 2本持っており、それぞれ加算と乗算を受け持ちます。FMA には非対応ですが AVX 256bit の add と mul 命令を同時に実行できるため、この組み合わせがピーク値になります。add または mul 命令単独の場合は片方のみが使われるため効率は半減します。

N100 は FMA に対応しているため 1命令で積和演算が可能です。その代わり 256bit の AVX 命令はクロックあたりひとつしか実行できず、256bit fma がピーク値になります。128bit の AVX/SSE であれば 2命令実行できているため、浮動小数点演算の実行パイプラインは 128bit が 2本あることがわかります。この構成は AMD の Jaguar 系と似ています。

これらの結果より FMA や AVX2 があるので互換性の面でも N100 が有利ですが、fma 以外の 256bit AVX 浮動小数点演算が混在するようなケースでは IvyBridge の方がスループットが高くなる可能性があります。

大まかに両者の性能がわかったところで、他の PC ともコンパイル時間を比較してみたいと思います。

以下の表は同じ Linux 上での比較です。Ubuntu 22.04 Clang 14。SteamDeck は Distrobox を使用しています。

PCCPUTDPThreadCoreSTORAGEコンパイル時間
Mac mini Late2012Core i7-3615QM45W4C 8TIvyBridgeSATA SSD69.57 秒
Mini PCIntel N10020W4C 4TAlderLake(E)SATA SSD59.67 秒
SteamDeck LCDCustom APU 040515W4C 8TZen2NVMe 452.31 秒
Desktop PCRyzen 5 260065W6C 12TZen1+SATA SSD29.78 秒
  • ↑コンパイル時間の数値が小さい方が高速

以下の表は同じ Ubuntu 22.04 Clang 14 ですが Windows 上の WSL2 を使用しています。同じ N100 や Ryzen 5 2600 で比べるとわかるように、Native の Linux よりも若干遅めの数値になります。

CPUTDPTHREADCORESTORAGEコンパイル時間
Intel N10020W4C 4TAlderLake(E)NVMe 367.26 秒
Core i5-940065W6C 6TCoffeeLakeNVMe 355.86 秒
Core i7-4790K88W4C 8THaswellSATA SSD39.77 秒
Core i7-6700K65W4C 8TSKyLakeSATA SSD35.83 秒
Ryzen 5 5560U25W6C 12TZen3NVMe 335.04 秒
Ryzen 5 260065W6C 12TZen1+NVMe 332.10 秒
Ryzen 5 360065W6C 12TZen2NVMe 322.78 秒
Ryzen 7 4750G45W8C 16TZen2NVMe 322.36 秒
Ryzen Z1 Extreme25W8C 16TZen4NVMe 417.33 秒
Ryzen 9 3950X105W16C 32TZen2NVMe 39.17 秒
Core i7-1370065W16C 24TRaptorLakeNVMe 48.39 秒
  • ↑コンパイル時間の数値が小さい方が高速

やはりコア数が多い CPU や新しいアーキテクチャの CPU、消費電力の高い CPU は性能が上がります。

下の表はさらに Android 上の Termux (Clang 18.1.7) での計測してみた結果です。モバイルデバイスも CPU もコア数が多いので今回のケースでは速度が出ています。ただし RAM 容量が少ないことや放熱の問題があるので、大きなプロジェクトや長時間の連続稼働にはおそらく向きません。

PCCPUTHREADCOREコンパイル時間
iPlay 50 Mini ProHelio G998C 8T (2+6)A76 / A5553.68 秒
iPlay 50 ProHelio G998C 8T (2+6)A76 / A5547.45 秒
Huawei P30 ProKirin 9808C 8T (4+4)A76 / A5527.73 秒
Pixel 8aTensor G39C 9T (1+4+4)X3 / A715 / A51021.94 秒
Pixel 8Tensor G39C 9T (1+4+4)X3 / A715 / A51020.35 秒
  • ↑コンパイル時間の数値が小さい方が高速

N100 搭載 PC は安価で入手できることもあり人気があります。Raspberry Pi 5 を一通り揃えても同じくらいの価格帯になりますので、入手のしやすさは魅力といえます。IvyBridge の Core i7-3615QM との比較でも十分 N100 の方が速いことがわかりました。

ただし思ったよりも差は少なく、他の PC と比べると性能には限界があります。もし少ない価格差で Ryzen 5 5560U にアップグレードできるならビルド時間は約半分、浮動小数点演算性能も数倍になりますので、用途によってはこちらの方がコストパフォーマンスは良いかもしれません。

関連エントリ

SteamDeck の Linux Desktop で日本語入力環境を作る

前回 SteamDeck には簡単に Linux 環境をインストールできることがわかりました。SteamOS には最初から distrobox コマンドがインストールされており、コマンド一つで各種 Linux 環境を入れることができます。

例えば Ubuntu をインストールするならコマンドラインから「distrobox create -i ubuntu:22.04」のように実行するだけです。apt 経由で各種ソフトウエアを利用できるので開発環境の構築なども簡単です。またインストールした環境はコンテナなので、失敗しても削除できますしすぐやり直すことができます。気軽にテストすることができます。

今回は Debian で GUI の日本語入力環境を整えてみます。

先に USB または Bluetooth キーボードを接続しておいてください。マウスもあった方が良いですが、SteamDeck 右側のタッチパッド + R2(左クリック) / L2(右クリック) でも代用できます。

(1) SteamOS のデスクトップに切り替える

  1. 「STEAM」ボタン → 「電源」→「デスクトップに切り替え」

以降再起動でゲーミングモードに戻った場合は、再びこの操作でデスクトップに切り替えてください

(2) 日本語表示に切り替える

  1. デスクトップ左下の Application Launcher アイコン → Settings → System Settings
  2. Regional Settings → 一番上にある Language 右端の「Modify…」
  3. 「Change Language」→「日本語」を選択
  4. 右下の「Apply」→ 右上の「Restart now」→「OK」
  5. 再起動するので、再びデスクトップに切り替えておきます。

(3) キーボードを日本語配列に切り替える

接続したキーボードが日本語配列の場合以下の設定を行います。英語配列キーボードを使用していて不要な場合はスキップしてください。

  1. デスクトップ左下の「アプリケーションランチャー」アイコン → 設定 → KDE システム設定
  2. 入力デバイス →「レイアウト」タブを選択 → 「レイアウトを設定」にチェックを入れる
  3. 「+Add」ボタン → Search欄に「109」を入れて「日本語 (OADG 109A)」を選択 → OK
  4. もとからあった英語配列を削除します。”英語(US) ” を選択して「-Remove」ボタンで削除
  5. 右下の「適用」クリック → 設定ウィンドウを閉じる

(4) ホームディレクトリに .distroboxrc を作成

  1. デスクトップ左下の「アプリケーションランチャー」アイコンから「ユーティリティ」→「KWrite」を開く
  2. メニューの「ファイル」→「新規」
  3. 以下の内容を書き込む
xhost +si:localuser:$USER
export PIPEWIRE_RUNTIME_DIR=/dev/null
  1. メニューの「ファイル」→「名前をつけて保存」
  2. 左上の「場所」の中から「ホーム」をクリックして選択
  3. 下の「名前(N):」の欄に「 .distroboxrc 」と入力
  4. 右下の「保存(S)」をクリック
  5. KWrite のウィンドウを閉じる

(5) ホームディレクトリの .bashrc を編集

  1. 画面左下のアプリケーションランチャーアイコンから「ユーティリティ」→「KWrite」を開く
  2. メニューの「ファイル」→「開く」
  3. 下の「名前(N):」の欄に「.bashrc」を入力して右下の「開く」をクリック
  4. 一番下に以下の内容を入力
export LANG=ja_JP.UTF-8
export DefaultIMModule=fcitx
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
  1. メニューの「ファイル」→「保存」を選択してから KWrite のウィンドウを閉じる

(6) ターミナルから Debian をインストール

  1. 画面左下のアプリケーションランチャーアイコンから「システム」→「Konsole」を開く
  2. ターミナル (Konsole) 内で以下のコマンドを実行
    • (“$” はプロンプトを意味するので、$ を除いた空白以降 “distrobox create ~” 部分を入力して Enter を押します。以後同じです)
$ distrobox create -i debian:12 -n debian
  1. “Do you want to pull the image now? [Y/n]:” と表示されたら「Y] を入力

(7) Debian 環境に入る

  1. 同じようにコンソールのコマンドラインから以下のように実行します。
$ distrobox enter debian

初回はインストールが入るので時間がかかります。

Debian 環境に入るとプロンプトが「(deck@steamdeck ~)$」から「deck@debian:~$」に変わります。

(8) Debian 上で環境構築

以後同じプロンプト「$」で表現していますが Debian に入った状態で行います。

  1. 以下のコマンドを実行します
$ sudo apt update
$ sudo apt upgrade -y
$ sudo apt install -y locales
$ sudo dpkg-reconfigure locales
  1. 言語選択画面になるので、キーボードから [j] キーを入力
  2. ja_JP.UTF-8 が選択されているので [SPACE] キーを押して選択状態にします (“*” マークが付きます)
  3. 同時に下段の < OK > が選択されているはずなので、そのまま [Enter] を 2回押して終了します
  4. 同じようにコンソールから以下のコマンドを実行します
$ sudo apt install -y task-japanese
$ sudo apt install -y fonts-noto-cjk
$ sudo apt install -y fcitx-mozc
$ fcitx

これで Debian 側でインストールしたアプリケーションは日本語入力が可能になります。

(9) キーボード配列の設定その2

タスクバーの右下あたりにキーボードのアイコンが追加されていることを確認します

  1. タスクバーにあるキーボードのアイコン右クリック→「設定」
  2. 「入力メソッド」のタブに、以下のように Mozc が並んでいれば OK です
キーボード - 日本語 - 日本語(OADG 109A)
Mozc

  1. もし日本語キーボードを使用しているのに、上の段が「キーボード ~ 日本語 (OADG 109)」になってない場合は切り替えてください
    • 画面下の「+」ボタンから新たに「日本語」配列を追加して、「-」ボタンで不要なものを削除しておきます
  2. タブを「全体の設定」に切り替えます
  3. 入力メソッドのオンオフ」の部分で、日本語入力切り替え方法を確認します
    • デフォルトでは「Ctrl+Space」が設定されているはずです。
  4. 設定ウィンドウを閉じます

これであとは Debian 側でインストールしたアプリケーションは日本語入力ができます。日本語入力への切り替えは「Ctrl」を押しながらスペースキーです。

注意点としては、デスクトップ左下のアプリケーションランチャーからは起動できず、Debian のコマンドラインから起動する必要があります。またこの手順では自動起動のの設定をしていないので、再起動後は手動で fcitx を起動する必要があります。

再起動後やゲームモードから切り替えた場合に再び Debian 環境に入る手順

  1. Konsole を起動し、ターミナル内で「 distrobox enter debian 」を実行
  2. Debian 環境に入ったらコマンドラインで「fcitx」を実行

タスクバーにキーボードのアイコンがない場合は手動で fcitx を起動してください。

以下アプリケーションごとのインストール例

あくまで例なので必要に応じてどうぞ。

Firefox

Debian 環境に入った状態で以下のようにインストールします。インストールが終われば firefox コマンドで起動できます。この firefox 上では [Ctrl] + [SPACE] で日本語入力ができます。

$ sudo apt install -y firefox-esr
$ firefox

起動時に「KDE ウォレットサービス」の画面が表示された場合はとりあえずキャンセルします。

なお、この Firefox は SteamOS 側のアプリケーションランチャーやタスクバーからは起動できないので注意が必要です。必ず distrobox enter debian で Debian 環境に入ったあとに、コマンドラインから firefox を起動してください。

Chrome

  1. firefox で Chrome for Linux をダウンロードします。「64bit .deb (Debian/Ubuntu 用)」を選択します
  2. ダウンロードしたファイルは Downloads フォルダに入っているので、Debian 環境に入ってからコマンドラインで以下のようにインストールします
$ sudo apt install -y $HOME/Downloads/google-chrome-stable_current_amd64.deb
$ google-chrome
  1. インストールが終わったら「google-chrome」コマンドで起動できます

gnome-terminal

  1. Debian 環境に入ってからインストールします
$ sudo apt install -y gnome-terminal
$ dbus-launch gnome-terminal
  1. ターミナルを起動するには「dbus-launch gnome-terminal」コマンドを実行します

Debian 側から起動したこのターミナルでは日本語入力ができます

VSCode

chrome と同じようにブラウザ上で「~.deb」ファイルをダウンロードし、「apt install 」コマンドでインストールします

  1. firefox で https://code.visualstudio.com を開いて 「.deb」ボタンから VSCode をダウンロードします
  2. ダウンロードが完了すると Downloads フォルダに入っているので、apt コマンドでインストールします (バージョンによってファイル名は異なります)
$ sudo apt install -y $HOME/Downloads/code_1.85.2-1705561292_amd64.deb
$ code
  1. インストールが完了したら、code コマンドで起動できます。もちろんテキストエディタとして普通に日本語入力できます。

Distrobox の管理

SteamOS 側のコマンドライン上で管理できます。同時に複数の環境を実行しないよう、不要なものは stop しておいてください。

インストールされているコンテナの確認

$ distrobox list

実行中のコンテナの停止

$ distrobox stop debian

名前をつけて別の Debian 環境を作成

$ distrobox create -i debian:12 -n debian2

その他詳しくは公式サイトをご覧ください。

活用など

SteamDeck の SteamOS はタブレットやスマートフォンのように電源ボタンによるスリープができます。いつの間にか電源が入っていて知らないうちにバッテリーを消費しているなんてこともなく安定しています。バッテリーも TDP を 3W まで下げることができるので、色々使えるのではないかと思ってます。

関連エントリ

Intel CPU Core i7-13700 (RaptorLake) の vfpbench 結果

Core i 12世代 (Alder Lake) 以降の Intel CPU は P-Core と E-Core、2種類の異なる CPU Core を搭載しています。ARM 系 CPU と同じように必要な負荷に応じてこれらのコアが使い分けられます。

vfpbench では種類によって計測するコアを区別する必要があるのですが、AlderLake 以降の Intel の非対称コアを今まで正しく認識できていませんでした。今回 Core i7-13700 を入手し、ようやく対応できたので結果を載せてみます。なお Linux では非対称コアを識別しますが、WSL1 上では区別できていないのでご注意ください。

以下は Linux で実行した Core i7-13700 の結果です。

結果からわかるように P-Core のピーク値は AVX 256bit の fma x 2 になっています。ここまでは従来の Skylake/IceLake 系と同じですが、mul + add の組み合わせの場合に 3命令実行できていることがわかります。

Ryzen Zen3/4 のように fma + add の組み合わせにならないためピーク値には影響がありませんが、おそらく AlderLake 以降は最大で 256bit x 3 命令が実行できるように拡張されているものと思われます。

P-Core
AVX vmul+addps (32bit x8) n8      :    0.197   124487.7    15561.0  (  8.0 3.1)
FMA vfmaddps (32bit x8) n8        :    0.371   132011.8     8250.7  ( 16.0 1.6)
FMA vfmaddps (32bit x8) n12       :    0.442   165987.5    10374.2  ( 16.0 2.0)
FMA vfma+mlps (32bit x8) n12      :    0.442   124495.1    10374.6  ( 12.0 2.0)
FMA vfma+adps (32bit x8) n12      :    0.381   144625.0    12052.1  ( 12.0 2.4)

また AVX512 が使用できません。そのため本来は対応していたと思われる fp16 演算や bf16 命令などもなくなっています。VNNI はあります。

E-Core の場合はピークが AVX 256bit fma x1 となっており、サイクルあたりの演算能力は P-Core の半分となっています。128bit 以下の場合は 2命令走っているので、実行パイプラインそのものは 128bit が 2本になっていると思われます。

E-Core
SSE addps (32bit x4) n8           :    0.305    32258.5     8064.6  (  4.0 2.0)
FMA vfmaddss (32bit x1) n12       :    0.525    14067.6     7033.8  (  2.0 1.7)
FMA vfmaddps (32bit x4) n12       :    0.521    56609.3     7076.2  (  8.0 1.7)
FMA vfmaddps (32bit x8) n8        :    0.602    65431.3     4089.5  ( 16.0 1.0)
FMA vfmaddps (32bit x8) n12       :    0.902    65432.2     4089.5  ( 16.0 1.0)
FMA vfma+mlps (32bit x8) n12      :    0.914    48433.6     4036.1  ( 12.0 1.0)
FMA vfma+adps (32bit x8) n12      :    0.914    48434.4     4036.2  ( 12.0 1.0)
128 add128 mul128 fma128 最大256 add256 mul256 fma256 最大
P-Core22232223
E-Core22221111

関連エントリ