Vulkan 资源所有权转移与 VK_SHARING_MODE_CONCURRENT 和不同队列系列的性能对比
Vulkan resource ownership transfer vs VK_SHARING_MODE_CONCURRENT & different queue families performance
我有一个计算着色器,它生成顶点缓冲区并绘制间接结构,然后用于绘制一些几何体。
计算着色器不是每帧调用一次,而是每 5-10 帧调用一次。
事实上,我复制了我的顶点和绘制间接缓冲区,因此当我使用 VB1 和 DI1 渲染几何体时,计算着色器能够写入 VB2 和 DI2,然后交换它们,因此计算和绘制调用可能是独立的。
我还有 2 个队列系列:do-everything 和 compute-only。
所以,我可以想到 3 种方法来做到这一点:
- 仅使用一个具有
VK_SHARING_MODE_EXCLUSIVE
个缓冲区的全能队列
- 为计算着色器使用仅计算队列,并使用
VK_SHARING_MODE_EXCLUSIVE
缓冲区和队列之间的所有权转移做所有事情
- 为计算着色器使用仅计算队列,并为使用
VK_SHARING_MODE_CONCURRENT
缓冲区 的绘图做一切事情
我想听听您关于使用什么选项以及它们是什么的建议 pros/cons。
我对此有一些假设,想知道我是否正确:
- 我认为使用单独的系列专用于计算操作可能会提高性能
- 我认为所有权转移是一项繁重的操作,值得只做一次(比如将资源上传到 gpu 内存时),但不是每 5-10 帧一次
- 所以我认为第三个选项对我来说是最好的选择
因为标准有这个明确的警告:
VK_SHARING_MODE_CONCURRENT
may result in lower performance access to the buffer
or image than VK_SHARING_MODE_EXCLUSIVE
.
我会说你应该选择独占模式,除非并且直到你的分析数据表明存在性能问题。毕竟,您说过使用缓冲区和跨队列移动缓冲区之间至少存在 5:1 的比率。因此,您访问缓冲区的频率高于执行队列所有权操作的频率。
我有一个计算着色器,它生成顶点缓冲区并绘制间接结构,然后用于绘制一些几何体。
计算着色器不是每帧调用一次,而是每 5-10 帧调用一次。 事实上,我复制了我的顶点和绘制间接缓冲区,因此当我使用 VB1 和 DI1 渲染几何体时,计算着色器能够写入 VB2 和 DI2,然后交换它们,因此计算和绘制调用可能是独立的。 我还有 2 个队列系列:do-everything 和 compute-only。
所以,我可以想到 3 种方法来做到这一点:
- 仅使用一个具有
VK_SHARING_MODE_EXCLUSIVE
个缓冲区的全能队列 - 为计算着色器使用仅计算队列,并使用
VK_SHARING_MODE_EXCLUSIVE
缓冲区和队列之间的所有权转移做所有事情 - 为计算着色器使用仅计算队列,并为使用
VK_SHARING_MODE_CONCURRENT
缓冲区 的绘图做一切事情
我想听听您关于使用什么选项以及它们是什么的建议 pros/cons。 我对此有一些假设,想知道我是否正确:
- 我认为使用单独的系列专用于计算操作可能会提高性能
- 我认为所有权转移是一项繁重的操作,值得只做一次(比如将资源上传到 gpu 内存时),但不是每 5-10 帧一次
- 所以我认为第三个选项对我来说是最好的选择
因为标准有这个明确的警告:
VK_SHARING_MODE_CONCURRENT
may result in lower performance access to the buffer or image thanVK_SHARING_MODE_EXCLUSIVE
.
我会说你应该选择独占模式,除非并且直到你的分析数据表明存在性能问题。毕竟,您说过使用缓冲区和跨队列移动缓冲区之间至少存在 5:1 的比率。因此,您访问缓冲区的频率高于执行队列所有权操作的频率。