Vulkan缓冲区内存管理-什么时候需要登台缓冲区?

4 vulkan

我阅读了很多有关Vulkan内存管理的文章,所有这些文章都建议使用登台缓冲区传输到GPU。但是我们已经可以创建内存,该内存是设备本地的,并且主机可见,主机一致。它可以从GPU读取,也可以从CPU写入。

我认为这是合理的-创建一个大缓冲区绑定到设备本地,主机可见且一致的内存。现在,对于所有动态缓冲区,我们仅继续使用该缓冲区中的内存,并在该偏移量处绑定该缓冲区。

但是在大多数示例中,它们创建一个主机可见缓冲区和一个gpu可见缓冲区,并使用copyBuffer操作进行传输。与仅使用一个cpu和gpu都可以访问的缓冲区相比,这有什么优点?我只在谈论缓冲区,而不是纹理。

Jes*_*all 5

正如棘手怪癖所说,设备不需要具有本地和主机可见的内存类型。即使大多数这样做,大小也会受到限制。在过去的几年中,情况可能发生了变化,但是过去,PCI-E和BIOS的限制意味着您可能获得的最大内存为256 MB或512 MB。最后,通过PCI-E进行CPU写入将比通过CPU自己的内存写入带宽更低。因此,即使使用登台缓冲区占用的总带宽是原来的两倍,但如果可以在传输队列上异步完成,则可以最大程度地减少CPU和图形管道在该传输上花费的时间。因此,使用暂存缓冲区是否可以赢钱将取决于特定的CPU和GPU组合以及您的应用程序在做什么。

但是,在移动设备或集成GPU之类的SOC上,很少有机会使用暂存缓冲区。移动GPU不应具有受限的设备本地+主机可见的堆大小。在vulkan.gpuinfo.org查看几个Windows集成GPU ,看起来现代的Intel集成GPU也没有这种限制,但是AMD集成GPU仍然有(我只看了几个随机样本,YMMV)。

所有这些使得很难给出明确的“总是做X”建议。就个人而言,我通常会这样做:

  • 如果我只希望一个代码路径在任何地方都可以使用并且不担心性能或内存占用,请使用临时缓冲区。对于离散GPU,这可能是一个不错的选择,但对于集成/ SOC GPU,这不是最佳选择。
  • 否则,请将登台缓冲区保留为备用路径,但在有足够大的可用池时,请使用共享的设备本地/主机可见池。
  • 当我开始尝试获得每一个性能的最后一点时,然后调整上面的参数,以优先选择具有异步传输功能的暂存缓冲区,以便在离散GPU上进行某些类型的上载时,我得到的数据表明这是净赢。