知识卡片
多份栅栏实现CPU与GPU的流水线重叠
内容
如果只用一个缓冲区在CPU和GPU之间传数据,CPU每次写入前都必须等GPU彻底用完,等于把本该并行的两条流水线强行串成了一条。一种解法是把缓冲区切成N份,配N个栅栏,每份数据各自对应一个栅栏:CPU要写第i份数据前,只需要等待第i个栅栏(代表”上一轮用这份数据的GPU工作已经做完”),写完后提交GPU工作并把这个栅栏重置为无信号,通知这份数据”正在被占用”。这样CPU在GPU处理第0份数据的同时,就可以立刻准备第1份、第2份,只要没有轮到复用某一份时,两边完全不需要互相等待。这本质上是双缓冲/环形缓冲技术的推广,核心思路是”用多份状态换取生产者和消费者的并行”,同样适用于任何生产者速度和消费者速度不完全同步、又想让两者尽量重叠工作的场景(比如任务队列、日志缓冲区)。
参考来源
《Vulkan 应用开发指南》第11章《同步》