Vulkan でのデバイスメモリの管理に慣れていない人もいるかもしれませんが、基本を理解しておくことが大切です。
Vulkan のメモリ管理に関する2つの Khronos のプレゼンテーション、Vulkan Dev Day Montreal (video) と 2018 Vulkanised (video) は、主要なコンセプトを学ぶのに最適です。
メモリ管理は簡単ではありません。Vulkan Memory Allocator などのライブラリを使用するといいでしょう。
サブ割り当ては Vulkan では最も良いアプローチです。また、アプリケーションが同時に使用できるアクティブな割り当て数である maxMemoryAllocationCount が存在することも重要です。OS やドライバレベルでのメモリ割り当てと解放は非常に遅くなる可能性があり、これがサブ割り当てのもう一つの理由です。Vulkan アプリは大きな割り当てを作成し、それを自分で管理することを目指すべきです。
VkPhysicalDeviceType では、主にディスクリートと統合型(UMA(ユニファイド・メモリ・アーキテクチャ)とも呼ばれる)の2タイプの GPU を示しています。この2つの違いを理解することは、パフォーマンスにとって重要です。
ディスクリートのグラフィックスカードは、デバイス上に専用のメモリを搭載しています。データはバス(PCIe など)を介して転送されますが、このバスは通常、データ転送の物理的な速度制限のためにボトルネックとなります。一部の物理デバイスは、データ転送専用のキューを可能にする VK_QUEUE_TRANSFER_BIT
を使用してキューを示します。一般的には、ホストデータをコピーするためのステージングバッファを作成してから、コマンドバッファを経由してデバイスのローカルメモリにコピーします。
UMA システムでは、デバイスとホストの間でメモリを共有しており、これは VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT|VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
の組み合わせで指定されます。デメリットとしては、システムメモリを GPU と共有しなければならないため、メモリの圧迫に注意しなければなりません。主なメリットは、ステージングバッファを作成する必要がなく、転送のオーバーヘッドが大幅に削減されることです。