Vulkan缓冲内存管理 - 我们什么时候需要暂存缓冲区?

时间:2017-07-06 05:47:31

标签: vulkan

我阅读了很多关于Vulkan内存管理的文章,并且他们都建议使用临时缓冲区来传输到GPU。 但是我们已经可以创建设备本地和主机可见的内存,主机连贯。它可以从GPU读取,也可以从CPU写入。

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

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

2 个答案:

答案 0 :(得分:4)

  

创建一个绑定到内存的大缓冲区,该内存是设备本地,主机可见且连贯。

并非所有设备都有这样的内存堆。因此,如果您想要便于携带,则需要考虑到这一点。

如果您想要/必须放入缓冲区的内存不是主机可见的,那么除了使用临时缓冲区之外别无选择。

答案 1 :(得分:4)

正如棘轮怪说的那样,设备不需要具有设备本地和主机可见的内存类型。即使大多数人这样做,但规模可能有限。也许在过去的几年里情况已经发生了变化,但过去的PCI-E和BIOS限制意味着256 MB或者512 MB就是你能得到的。最后,CPU写入PCI-E的带宽将低于CPU自身的内存。因此,即使使用临时缓冲区使用两倍的总带宽,如果可以在传输队列上异步完成,也可以最大限度地缩短CPU和图形管道在传输上花费的时间。因此,使用登台缓冲区是否会取决于特定的CPU和GPU组合,以及您的应用程序正在做什么。

然而,在移动设备或集成GPU这样的SOC上,使用临时缓冲区很少会成为胜利者。移动GPU不应具有有限的设备本地+主机可见堆大小。看看vulkan.gpuinfo.org上的几个Windows集成GPU,看起来现代的英特尔集成GPU也没有这样的限制,但AMD集成的GPU仍然可以(我只看了几个随机样本,YMMV)。 p>

这一切都很难给出明确的“永远做X”的建议。就个人而言,我通常会这样做:

  • 如果我只想要一个可以在任何地方工作的代码路径并且不担心性能或内存占用,请使用临时缓冲区。这对于分立式GPU来说可能是一个不错的选择,但对于集成/ SOC GPU来说可能不是最理想的。
  • 否则,将登台缓冲区保留为回退路径,但是当有足够大的可用池时,请使用共享设备本地/主机可见池。
  • 当我开始尝试获得最后一点性能时,然后调整上面的内容,优先选择使用异步传输的暂存缓冲区,以便在离散GPU上进行某些类型的上传,当我有数据显示它是一个净胜利时。