16

私はそれを理解しようとしていますが、私は少し立ち往生しています。

タイプとヒープの関係は単純ですが、少し奇妙です。(なぜメンバーを与えないVkMemoryHeapVkMemoryTypeですか?)

私はすべてのVkMemoryPropertyFlags意味を理解していると思います。それらはかなり単純に見えます。

しかし、VkMemoryHeap.flagsメンバーはどうですか?どうやら、ゼロ以外の有効な値が 1 つだけありVkMemoryHeapFlagBits.VK_MEMORY_HEAP_DEVICE_LOCAL_BIT、それ自体はそれほど奇妙ではありませんがVkMemoryPropertyFlagBits.VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT、ヒープのメモリ タイプに存在する可能性のある もあります。

メンバーとは何VkMemoryHeap.flagsを意味し、メンバーとどのように関係していVkMemoryType.flagsますか?

4

1 に答える 1

21

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_LOCALMEMORY_DEVICE_LOCAL

それがここでの唯一の関連する意味です。

メモリ ヒープがデバイス ローカルであるが、そうでないメモリ タイプがある場合の例が必要な場合は、独自のメモリを持たない GPU を検討してください。ヒープは 1 つしかないため、MEMORY_DEVICE_LOCAL.

ただし、ホストが認識できるようにそのプールからメモリを割り当てると、そのメモリへのデバイス アクセスのパフォーマンスが低下する可能性があります。したがって、そのようなハードウェアの場合、同じヒープのホストから見えるメモリ タイプは を使用しませんPROPERTY_DEVICE_LOCAL

繰り返しになりますが、他のハードウェアはメモリをホストから見えるようにしてもパフォーマンスが低下しません。そのため、使用可能なすべてのプロパティを備えた 1 つのメモリ タイプしかありません。Intel の場合、オンチップ GPU は CPU のキャッシュのあるレベルにアクセスできるようです。

于 2016-04-05T21:04:38.187 に答える