前回、1台のミニPCで内蔵GPU(統合メモリ)と外付けGPUを切り替えて、AIとゲームの性能を比べました。書きながら、ひとつ気になっていたことがあります。
「切り替える」んじゃなくて、「両方同時に使う」ことはできないのか。
ゲームは外付けのRTX 3060に任せて、その裏で内蔵のRadeon 780MにローカルAIを喋らせる。GPUが2つあるなら、仕事を分ければいいのでは——という発想です😊
結論から言うと成立しました。ただし、代償の出方が予想と違ったのが面白いところでした。
・2つのGPUに仕事を分ける具体的な設定方法(GUI不要)
・★代償は平均fpsではなく「フレームの安定性」に出る
・★犯人はGPUではなくメモリコントローラだった
・AI側も削られるが、生成と読解で削られ方が違う
・どういう用途なら実用的かの線引き
・★計測の罠:fpsがぴったり60になる現象の正体
GPUが2つあるなら、両方同時に使えないか
今回の環境は前回と同じです。
- ミニPC(Ryzen 7 7840HS / RAM 32GB / Windows 11 Pro)
- RTX 3060(12GB) — OCuLink接続の外付けGPU。ここでゲーム
- Radeon 780M — CPU内蔵GPU。システムのメモリを共有する。ここでAI
普通のPCなら「GPUは1つ」なので、ゲームとAIを同時に動かせば奪い合いになります。ですが器が2つあるなら話が変わるはずです。
用語集
| 用語 | 意味 |
|---|---|
| 1% Low | fpsの悪かった下位1%の平均。平均が同じでもここが低いと「カクつく」と感じます。体感に直結する指標 |
| フレームタイム | 1枚の絵を出すのにかかった時間。これがバラつくとカクつきに見える。平均fpsだけでは見えません |
| メモリコントローラ | CPUの中にある、メインメモリとのやり取りを仕切る部品。今回の主犯です |
| pp / tg | pp=プロンプト処理(読ませた文章を理解する段階・演算が主役)、tg=生成(返事を書く段階・メモリ帯域が主役) |
| ボーダーレス ウィンドウ | 枠のない全画面風のウィンドウ表示。切り替えが速い代わりに、状況によって描画経路が変わります(後半のつまずきの原因) |
仕事の分け方
やることは単純で、アプリごとに使うGPUを指名するだけです。
ポイントはこの向きで割り当てることです。画面が繋がっているGPUでゲームを動かすのが正解で、逆にすると描いた絵をもう一方のGPUへ転送する手間が余計にかかります。
設定方法(GUIを使わない)
Windowsには「グラフィックの設定」画面がありますが、レジストリに直接書いたほうが確実で、記事にも残しやすいです。
# ゲームを外付けGPU(高パフォーマンス)に固定 # 場所: HKCU\Software\Microsoft\DirectX\UserGpuPreferences # "<ゲームの実行ファイル>" = "GpuPreference=2;" # 1 = 省電力(内蔵GPU) / 2 = 高パフォーマンス(外付けGPU)
AI側は、llama.cppに使うGPUを名指しできる指定があります。
# まずどちらが何番かを確認する llama-server.exe --list-devices # Vulkan0: NVIDIA GeForce RTX 3060 # Vulkan1: AMD Radeon 780M Graphics # 内蔵GPU(Vulkan1)を指名してAIを起動 llama-server.exe -m <モデル.gguf> -ngl 99 \ --device Vulkan1 \ --host 127.0.0.1 --port 8080
番号は環境によって入れ替わるので、--list-devicesでの確認は必ずやったほうがよさそうです。
結果:ゲーム側
Warframeを同じ場面で60秒、AIを動かさない場合と裏でAIを動かした場合で測りました。同時稼働は再現性を見るため2回計測しています。
| 指標 | AIなし | AIあり | 変化 |
|---|---|---|---|
| 平均 fps | 150.4 | 126.8 | -15.7% |
| 1% Low fps | 132.7 | 75.3 | -43.3% |
| 0.1% Low fps | 127.4 | 66.4 | -47.9% |
| GPU実働 ms/フレーム | 6.65 | 7.57 | +13.8% |
平均fpsは-15.7%で済んでいます。150fpsが127fpsになった程度で、これだけ見れば「ほとんど影響ない」と言えそうです。
ところが1% Lowは-43.3%、0.1% Lowは-47.9%。落ち込み幅が平均の3倍あります。
なぜ平均より下位が落ちるのか
この差が何を意味するのか、図にしました。
つまり「全体的に遅くなった」のではなく、「ときどき大きく引っかかるようになった」ということです。
大半のフレームは無事なので平均はあまり下がりません。ですが人間が感じるのはこの引っかかりのほうです。「平均fpsの数字ほど軽くない」——それが今回の実測の意味するところでした。
犯人はGPUではなかった
ここで疑問が出ます。GPUは別々なのに、なぜ引っかかるのか。
データを見ると、GPU実働時間の増加はわずか+13.8%です。1% Lowの-43%に比べると小さすぎます。GPU同士は、ほとんど競合していません。
GPUは2つに分かれていても、メインメモリとその窓口は1つしかありません。
・内蔵GPUのAI推論は、システムメモリを猛烈に読み続けます(モデルがそこにあるため)
・ゲームのCPU側処理も、同じメモリを使います(描画の指示を組み立てる作業)
→ この取り合いがフレームタイムのスパイクとして現れる
最初の図で「メインメモリは1つしかない = 後で効いてくる」と書いたのは、これのことでした。器(GPU)を分けても、通り道(メモリ)は共有だったわけです😳
この構図は前回やエッジAIチップの回で繰り返し出てきた「AIの速度を決めるのは計算力よりメモリ帯域」という話と、根が同じです。AI推論はとにかくメモリを読む処理なので、その影響が隣の作業にまで及んだ、ということになります。
結果:AI側
逆に、AI側はどれだけ割を食ったのかも測りました。
| 指標 | ゲームなし | ゲームあり | 変化 |
|---|---|---|---|
| プロンプト処理 t/s | 112.88 | 89.41 | -20.8% |
| 生成 t/s | 13.37 | 12.21 | -8.7% |
生成は-8.7%で済んでいます。返事が来るのを待つ用途なら、ほぼ気づかないレベルです。
一方プロンプト処理は-20.8%と、2倍以上削られています。これは前回と同じ構図で、プロンプト処理は演算量が支配的なので、競合の影響を受けやすいということです。
つまずき:ぴったり60fpsになる謎
計測中に、不可解な現象がありました。
同じ場面・同じ設定なのに、あるときは150fps、あるときは「ぴったり60.0fps」になるのです。VSync(画面の更新に合わせる機能)は切ってあるはずなのに。
調べると、計測ツールの出力に違いがありました。
| 状態 | 描画の経路 | 結果 |
|---|---|---|
| 前面にある | Hardware: Independent Flip | 150 fps |
| 前面を失う | Hardware Composed: Independent Flip | ぴったり60.0 fps |
原因はボーダーレスウィンドウの仕様でした。前面にあって他のウィンドウに覆われていないときだけ、GPUが画面へ直接描き込めます。フォーカスを失うとWindowsの合成処理を経由する経路に落ち、ディスプレイの更新頻度(60Hz)に張り付きます。
fpsが「ぴったり60.0」「ぴったり120.0」のように、ディスプレイの更新頻度と同じ数字に張り付いていたら、まず計測条件を疑ったほうがよさそうです。VSync設定とは別に、ウィンドウの状態でも起きます。
ちなみにプログラムから強制的に前面へ持ってくる方法は失敗しました。Windowsは「最後にユーザーが操作したプログラム」しか前面にできない仕組みになっているためです。人間が実際にクリックするのが確実でした😅
実用上の線引き
測ってみて、こういう整理になりました。
| 使い方 | 判定 | 理由 |
|---|---|---|
| AIに質問して待つ (チャット的な使い方) | 問題なし | AI側の劣化は生成-8.7%。待ち時間が1割伸びる程度で、体感しにくい |
| ソロ・協力プレイ のゲーム | 実用的 | 多少の引っかかりが致命傷にならない用途なら十分動く |
| 対戦ゲーム | 避けるべき | 1% Lowが-43%。フレームの安定性が勝敗に関わる場面には向きません |
| 大きいモデル (14GB級)と同時 | 厳しい | AIに14GB+ゲーム約3GB+OSで32GBを使い切ります。7B級(4.4GB)までが現実的 |
「AIを常時動かしておいて、空いた時間に軽めのゲームを遊ぶ」——そういう使い方なら、十分ありだと思います😊
まとめ
- 2つのGPUに仕事を分ける同時稼働は成立する。ゲームを外付けGPU、AIを内蔵GPUに割り当てるだけ
- ★代償は「平均fps」ではなく「フレームの安定性」に出る。平均-15.7%に対し、1% Lowは-43.3%、0.1% Lowは-47.9%
- ★犯人はGPUではなくDDR5メモリコントローラ。GPU実働の増加は+13.8%だけで、器を分けても通り道は共有だった
- AI側は生成-8.7%・プロンプト処理-20.8%。演算量が支配的な読解のほうが大きく削られる
- 設定はレジストリとコマンド指定だけ。GUIを使わずに済む(
GpuPreferenceと--device) - ★この向き(画面が繋がったGPUでゲーム)が正解。逆にすると転送の手間で損をする
- ★計測の罠:ボーダーレスのゲームは前面を失うとぴったり60fpsに張り付く。VSyncとは別の原因
やってみて面白かったのは、「GPUを分けたのに、GPUではないところがボトルネックになった」という点でした。前回から続けて、結局いつもメモリの話に行き着くのが印象的です😊
そして平均fpsだけ見ていたら「ほぼ影響なし」と結論づけていたはずで、そこも収穫でした。1% Lowまで見ないと、体感は測れない。数字の選び方ひとつで結論が変わってしまう、といういい例だったと思います。
それでは、今回はここまで。最後までありがとうございました😊
【実測環境】Windows 11 Pro 25H2 / Ryzen 7 7840HS / RAM 32GB / Radeon 780M(内蔵GPU)/ GeForce RTX 3060 12GB(OCuLink接続の外付けGPU)/ゲームは Warframe を PresentMon 2.5.1 で60秒キャプチャ(1920x1080・VSyncオフ・同一シーンで静止)。同時稼働は再現性確認のため2回計測し平均。AIは Qwen2.5-Coder-7B Q4_K_M を llama.cpp Vulkan(LM Studio 0.4.20 同梱版)で prompt 512トークン・生成128トークン・3回平均。数値は2026年7月時点の実測値で、ドライバやソフトの版により変わる可能性があります。