我有一些关于队列/队列系列、命令缓冲器/池的GPU用法的问题。我正在读这本书:Vulkan Programming Guide: The Official Guide to Learning Vulkan。我不明白的是GPU的使用是如何基于列出的项目的:
我如何理解它是如何工作的:有队列族(我的硬件有3个家族),它们可以处理不同的事情。在那里,我应该在我的计划能够工作的最低限度的支持下使用这个家庭。所以在不做图形的情况下,我应该使用没有图形支持的家庭。那就好了!在同一家族中的队列之间使用相同的资源,除了同步之外,对性能没有负面影响。
问题1:每个队列家族是否都有GPU的全部过剩?也就是说,当只使用一个队列时,GPU可以100%使用吗?
问题2:如果任务是呈现场景(队列图形)并将完成的映像传输到CPU以保存为文件(队列传输),那么使用来自不同家族的2个队列(图形和传输)是否有意义?我之所以这么问是因为我的图形队列家族也有一个传输位。因此,也许最好只使用这一个图形队列。
问题3:书中说命令缓冲区属于命令池。当使用具有多个缓冲区的一个池而不是使用每个具有一个缓冲器的多个池时,有什么不同?是因为有障碍吗?或者,在使用多个池时,是否存在性能问题或访问问题?如果有人能写一些关于池和缓冲区的文章(我很怀念这本书),那就太好了。
问题4:我不认为这个问题有一个普遍的答案,但也许是一些经验法则?使用Vulkan时,应该使用多线程,以避免阻塞CPU.据我所知,每个命令池使用一个线程,因为每个池的屏障(最小的同步工具)都能工作。这有意义吗?还是每个队列使用一个线程更好?或者每个排队的家庭?我还考虑让每个队列有一个线程,即控制每个命令池一个线程,以保持同步的简单性(每个队列线程就像每个命令池线程的主线程)。但是在这里,我感到困惑,因为命令池属于队列家族(而不是队列本身)。因此,来自同一家族的两个队列可以使用相同的命令池。
如果我写错了,请纠正我。我是Vulkan的新手,但我从OpenGL / DirectX 11开始工作。我还想获得一些链接,以便更好地解释队列和命令缓冲器/池层次结构,以及有关Vulkan应用程序的线程处理的一些内容。在回答问题时,如果可能的话,请给出一个例子(看看它会产生什么不同)。非常感谢!
发布于 2021-11-17 13:09:02
Vulkan队列没有那本书让他们听起来那么隔离。如果您非常仔细地查看规范,您将注意到必须至少有一个队列支持图形、传输和计算。因此,您将在每台机器上找到一个组合的Graphics/Transfer/Compute队列。有些机器只会有这一个队列。然后是专门的队列,比如专门用于计算的队列和专用的传输队列。
一些GPU有一个专用的硬件单元,只支持传输。该单元实际上无法访问GPU的其余部分,因此,要回答问题1:不是每个队列都可以访问100%的GPU。
但是,这些专用的硬件也给了我们程序员分配工作的权力,这就回答了问题2:要充分利用硬件,就需要将工作分散到队列中。越好的软件可以做到这一点,我们可能获得更多的性能。
问题3:命令缓冲区不是线程安全的,写入带有vkxCmd*函数的缓冲区会导致内存分配。这些内存分配返回到池中。然后,池管理其所有命令缓冲区的内存。因此,从单个池写入多个命令缓冲区将导致内存争用,并可能导致使用比所需内存多得多的内存池。使用多个池允许定期释放内存(通过重置池),它还允许多个线程更有效地管理它们的池/缓冲区。这里还有一些其他细节,但是内存争用和线程安全是在池中拆分缓冲区的主要原因。
问题4:在命令池之间拆分线程是可行的方法,在队列之间拆分线程也是一个很大的胜利,但是可以利用它的硬件更少。对于高端硬件,您需要可以管理异步计算、专用传输和多个命令池以及图形队列的线程。
https://computergraphics.stackexchange.com/questions/12346
复制相似问题