由于描述符本质上是对资源的指针/引用,因此设置主机端(概念上是 CPU)以告诉设备(GPU)每个描述符指向(设备本地/GPU)缓冲区/内存,这实际上是如何实现的发生?我问这个的原因是因为通常程序员确切地知道数据从主机传输到设备的时间,因为它被记录到命令缓冲区然后提交到队列。 vkUpdateDescriptorSets 不是命令缓冲区命令,人们说描述符集会立即更新。这实际上是如何工作的?
描述符集在描述符池中分配,就像命令缓冲池驻留在主机端一样。所以本质上,当您记录命令时,您将写入主机端内存,直到您提交命令缓冲区。 vkUpdateDescriptorSets 是否以相同的方式工作,因为它正在写入主机端内存,然后在提交命令缓冲区时将数据传输到 GPU?或者它会立即传输到 GPU 吗?在描述符是数组的情况下,我编写描述符绑定(bind)数组元素 [1] 和元素 [4091] Vulkan 是否需要将整个数组传输到 GPU,或者这会导致两次小传输吗?
请解释一下我的想法是否正确。需要将书面描述符写入 GPU,因为这是资源指针所在的位置。
最佳答案
描述符集本质上是一个黑盒子。它们的工作方式就是规范如何描述它们的工作方式。除此之外的任何内容都是特定于实现的。
它们是在 GPU 内存还是主机内存中?这取决于实现。
如果您正在使用更新的 Vulkan 实现的描述符索引功能,则实现不可能在调用 vkUpdateDescriptorSets
后批量更改描述符集。因此,该函数所做的更改必须对任何引用已添加到 CB 但尚未提交的描述符集的命令可见。因此,实现必须以 GPU 可见的方式修改数据。这也放宽了上述功能的同步要求。
In the case of a descriptor which is an array and I write descriptor binding array element [1] and element[4091] does Vulkan need to transfer the entire array over to the GPU or will this result in two small transfers?
实现可以做它想做的事。因此,您必须依靠分析来判断这是否是您感兴趣的平台上的性能问题。
关于vulkan - Vulkan如何将描述符集写入GPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71520279/