説明
この文章は、DirectX Developer Blog の Jesse Natalie さんによる投稿の「Coming to DirectX 12: More control over memory allocation」の勝手な翻訳です。
DirectX 12 に登場:メモリ割り当ての制御の強化
Windowsの次のアップデートで、D3D12 のD3D12_HEAP_FLAG列挙体に2つの新しいフラグを追加します。新しいフラグは「一時的な」プロパティであり、結果のメモリ自体には影響せず、割り当て方法に影響します。つまり、大切なことですが、これらのフラグは ID3D12Heap::GetDescや、ID3D12Resource::GetHeapProperties に影響しないことに注意してください。深堀りしていきましょう。
D3D12_HEAP_FLAG_CREATE_NOT_RESIDENT
今日、D3Dにヒープやコミット済みリソースを割り当てるように要求すると、オブジェクトが使えるようになる直前に起こることは、常駐メモリの確保です。
これは、実行される ID3D12Device::MakeResident を呼び出すことと同じですが、2つの問題があります:
- MakeResident の設計では、メモリが完全に使えるようになるまで、あなたのCPUスレッドはブロックされます。あなたは、時々この状況を望まないでしょう。
- MakeResident を使用すると、現在のプロセス予算が必要とする範囲を超えて、メモリをコミットし過ぎます。
妙な話ですが、これら2つの理由が、まさに ID3D12Device3::EnqueueMakeResident を追加した理由です。
これにより、CPUではなくGPUを使って常駐待ちをしたり、予算を超過するのではなく常駐操作を失敗させるなど、アプリでさまざまな選択ができます。
非常駐状態のメモリを割り当てられることで、アプリ開発者がリソースを最初に使う際に、これらの利点の両方を享受できるようになりました。
D3D12_HEAP_FLAG_CREATE_NOT_ZEROED
これは、D3Dがこれまで明示的に呼び出したことのない項目の1つですが、一歩踏み込んで、このステートメントを作成します。D3Dによって新規に作成されたコミット済みのリソースやヒープは、ほとんど1常にコンテンツをゼロに初期化します。以前は実装の詳細事項でしたが、WDDM2.0メモリマネージャーの開発中に、プロセスがゼロ化しないメモリ範囲も再利用できるようにすることによるパフォーマンスの改善を試みました。やってみると、これは壊滅的な結果をもたらしました。Windowsエコシステムのアプリケーションは、特定のプロパティを持つ新規リソースはゼロになっているという事実に強く依存していたのです。
そのため、ゼロ化されたメモリを返すことに戻る必要がありました。なぜこれが悪いのでしょうか?高価だからです!これは、メモリマネージャーがメモリを渡す前にメモリに明示的にゼロを書き込む必要があることを意味します。これは、作成呼び出し中に発生するか、メモリに最初にアクセスするまで遅延される可能性はあります。しかし、確実に起きるのです。
ヒープ/リソースの割り当て時にこの新しいフラグを指定するだけで、このコストから開発者が手を引けるようにしました。ただし、これは保証ではなく、最適化要求にすぎないことに注意することが重要です。別のプロセスから使用可能なメモリが送られてきた場合、セキュリティやプロセス分離の目的から必ずゼロ化されたメモリが渡されます。しかし、自分が解放したメモリを再利用するのであれば、そのメモリは再ゼロ化する必要なく安価にリサイクルできます。
初期化されていないメモリにアクセスするためのルールがここで適用されることに注意するのが重要です。配置済みリソースの作成や、予約済みリソースへのタイルのマッピングと同じ事(レンダーターゲットや深度ステンシルフラグを持つリソースは、使う前にクリア、破棄、またはコピーする必要がある)です。 CreatePlacedResource のドキュメントの「要求したリソースの初期化に関する注意」のセクションを読んでください。
これらのフラグは素晴らしく聞こえます。罠はないでしょうか? 唯一の落とし穴は、利用する前に利用可能なことを確認する必要があることです。フラグを使うのに新しいドライバーは要りません。必要なのは、フラグを理解するD3D12のバージョンで実行することだけです。専用のCheckFeatureSupportオプションはありません。ID3D12Device8 が公開されるか、D3D12_FEATURE_D3D12_OPTIONS7 のチェックが成功すれば、いつでも使えます。
はじめよう
あなたのアプリでこれらフラグを有効にするには、Windows Insider Program から最新のWindows 10 Insider PreviewビルドとWindows 10(20H1)用SDK Preview Buildをインストールしましょう。
-
実際には、ゼロ化は、リソースサイズとCPUの可視性(OSリリースごとやCPUアーキテクチャごとの、プロパティの変化の詳細)に依存します。 ↩