GPU のページトラッカー
オプトインのページトラッカーは 16 KiB のゲストのページを監視します。最初のネイティブの CPU 書き込みでフォールトが起き、世代を進めて GPU 側のコピーを無効化するため、変化のないページを毎フレームハッシュしてアップロードすることがなくなります。
2026年10月10日 までのリポジトリノート
解決する問題
ゲストのメモリにあるレンダーターゲットや頂点バッファは、GPU に届ける必要があります。割り当て全体を毎フレームアップロードするのは正しいものの高コストです。変化していないことを確かめるために割り当て全体をハッシュするのも高コストです。ページトラッカーは代わりに、追跡する書き込み可能なページを読み取り専用にし、最初の書き込みで CPU にフォールトを起こさせます。
フォールトのハンドラーはページを記録し、ゲストの本来の保護を戻し、そのページの世代を進めます。後の描画で世代を比較します。変化のないページはデバイスに留まり、世代が進んだページはアップロードされます。PS5_GPU_PAGE_TRACKER=1 でこの仕組みが有効になります。この変数か実験的な設定一式を指定しない限り無効です。
フォールトの正体
このフォールトはゲストのバグではなく、無効化の合図です。ページを読み取り専用にしたのは、ホストが書き込みを観測するためだけです。その後、ゲストの書き込みはタイトルが求めた保護のもとで完了できます。追跡していないページは通常のアップロードの経路を保ちます。
同じアドレス、サイズ、物理オフセット、CPU の権限で作り直されたダイレクトメモリのマッピングは、ホスト側のビューを保ちます。この再利用があるからこそ、世代がフレームをまたいで意味を持ちます。裏付けや権限が変わると通常の置き換えの経路を通り、トラッカーは新しいマッピングを観測します。
行わないこと
トラッカーはタイトルの内部解像度を下げず、シェーダーもコンパイルしません。CPU が書き込まなかったページの繰り返しの転送をなくすだけです。毎フレームバッファを書き直すタイトルは、そのバッファのコストを引き続き払います。
フォントアトラスの書き込みやそのほかの HLE の書き込みは、ゲストのメモリを変更する前に監視を無効化するため、ファームウェアの書き込みが GPU から見えなくなることはありません。トラッカーは、アーキテクチャの概要で説明している実験的な GPU 機能のひとつです。
実装済みのこと
- PS5_GPU_PAGE_TRACKER=1 のときの、16 KiB のゲストのページごとの世代。
- ゲストの保護を戻し、常駐しているコピーを無効化する、最初の書き込みでのフォールト。
- 世代がフレームをまたいで残るよう、同一のダイレクトメモリのビューを再利用。
- HLE 自身が監視対象のページに書き込んだときの無効化。
まだ足りないこと
- トラッカーはオプトインです。既定の互換性の経路はこれに依存しません。
- CPU が毎フレーム書き直すページは、引き続きアップロードされます。
- 圧縮メタデータのサーフェス内での GPU から GPU への一貫性はカバーしません。
関連するしくみ
これらのページについて