Vulkan は、メモリに関して 2 つの異なる概念を認識しています。デバイスが通信できる RAM の実際の物理的な部分があります。次に、これらの RAM プールの 1 つからメモリを割り当てる方法があります。
ヒープは、RAM の特定の部分を表します。VkMemoryHeap
デバイスが通信できる RAM の利用可能なヒープの 1 つを記述するオブジェクトです。特定のヒープを定義するものはそれほど多くありません。その RAM ストレージのバイト数と、Vulkan デバイスに対するストレージの位置 (ローカルと非ローカル) の 2 つだけです。
メモリータイプは、特定のヒープからメモリーを割り当てる特定の手段です。VkMemoryType
メモリを割り当てる特定の方法を記述するオブジェクトです。また、ヒープからメモリを割り当てる方法については、より多くの説明的なフラグがあります。
より具体的な例として、ディスクリート GPU を備えた標準的な PC セットアップを考えてみましょう。デバイスには独自のローカル RAM がありますが、ディスクリート GPU も CPU メモリにアクセスできます。したがって、Vulkan デバイスには 2 つのヒープがあります。1 つはローカル、もう 1 つは非ローカルです。
ただし、通常は 2 つ以上のメモリタイプがあります。VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
通常、セットを持たないローカル メモリを表す 1 つのメモリ タイプがあります。つまり、メモリをマップできません。他のメモリタイプ(またはレンダリング操作など)からの転送操作を介してのみアクセスできます。
しかし、同じ非ローカル ヒープを使用する 2 つのメモリ タイプが存在することがよくあります。それらは両方とも になるVK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
ため、マッピングが可能になります。ただし、そのうちの 1 つはVK_MEMORY_PROPERTY_HOST_CACHED_BIT
フラグが設定されている可能性が高く、もう 1 つはVK_MEMORY_PROPERTY_HOST_COHERENT_BIT
です。これにより、キャッシュされた CPU アクセス (したがって、変更されたメモリの範囲の明示的なフラッシュが必要) またはキャッシュされていない CPU アクセスが必要かどうかを選択できます。
ただし、これらは 2 つの異なるメモリ タイプですが、どちらも同じヒープから割り当てます。VkMemoryType
これが、割り当て元のメモリのヒープを参照するインデックスを持っている理由です。
私が得ていないのは、2 つのDEVICE_LOCAL
フラグがどのように相互作用するかだけです。
仕様は見ましたか?これがどのように機能するかを正確に隠しているわけではありません。
propertyFlags
ビットが設定されている場合VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
、このタイプで割り当てられたメモリは、デバイス アクセスに最も効率的です。このプロパティは、セットを持つヒープに属するメモリ タイプに対してのみ設定されますVK_MEMORY_HEAP_DEVICE_LOCAL_BIT
。
メモリがローカルである場合、そのメモリに対応するすべてのタイプがローカルであるということですか、それともローカルである可能性があるということですか?
あなたはこれらのものに間違った意味を押し付けようとしているようです. 仕様に書かれていることを見て、額面どおりに受け取ってください。
PROPERTY_DEVICE_LOCAL
最高のデバイス アクセス パフォーマンスを達成するメモリ タイプを示します。これと の間の唯一の接続は、を使用するメモリ ヒープにのみ関連付けMEMORY_DEVICE_LOCAL
られるメモリ タイプです。PROPERTY_DEVICE_LOCAL
MEMORY_DEVICE_LOCAL
それがここでの唯一の関連する意味です。
メモリ ヒープがデバイス ローカルであるが、そうでないメモリ タイプがある場合の例が必要な場合は、独自のメモリを持たない GPU を検討してください。ヒープは 1 つしかないため、MEMORY_DEVICE_LOCAL
.
ただし、ホストが認識できるようにそのプールからメモリを割り当てると、そのメモリへのデバイス アクセスのパフォーマンスが低下する可能性があります。したがって、そのようなハードウェアの場合、同じヒープのホストから見えるメモリ タイプは を使用しませんPROPERTY_DEVICE_LOCAL
。
繰り返しになりますが、他のハードウェアはメモリをホストから見えるようにしてもパフォーマンスが低下しません。そのため、使用可能なすべてのプロパティを備えた 1 つのメモリ タイプしかありません。Intel の場合、オンチップ GPU は CPU のキャッシュのあるレベルにアクセスできるようです。