第6章 同步机制与并发


文档摘要

第 6 章 · 同步机制与并发 章节摘要:本章跟着一条主线走——把散落在前面各章的同步伏笔收拢成一张完整的因果之网。栅栏管 CPU 与 GPU 的节拍,信号量管队列间的接力,管线屏障管 GPU 内部的读写可见性,事件提供命令间的细粒度锚点;最后把这些原语放进多线程与多队列的真实并发模型里。读通本章,前面所有「等、传、拦」的操作才算真正被理解。 一条主线 主线从一句被重复了多次的话开始:「这个话题第 6 章展开。」2.5 节用栅栏控制帧节奏,3.3 节用屏障迁移图像布局,5.2 节提交时挂上了信号量与栅栏三件套——本章把这些伏笔一次收拢:为什么需要四种原语而不是一种?各自的管辖边界在哪里?拼错时的症状长什么样? 下图标出四种原语的管辖范围。分界记忆法:跨 CPU 与 GPU 用栅栏;

第 6 章 · 同步机制与并发

章节摘要:本章跟着一条主线走——把散落在前面各章的同步伏笔收拢成一张完整的因果之网。栅栏管 CPU 与 GPU 的节拍,信号量管队列间的接力,管线屏障管 GPU 内部的读写可见性,事件提供命令间的细粒度锚点;最后把这些原语放进多线程与多队列的真实并发模型里。读通本章,前面所有「等、传、拦」的操作才算真正被理解。

一条主线

主线从一句被重复了多次的话开始:「这个话题第 6 章展开。」2.5 节用栅栏控制帧节奏,3.3 节用屏障迁移图像布局,5.2 节提交时挂上了信号量与栅栏三件套——本章把这些伏笔一次收拢:为什么需要四种原语而不是一种?各自的管辖边界在哪里?拼错时的症状长什么样?

下图标出四种原语的管辖范围。分界记忆法:跨 CPU 与 GPU 用栅栏;跨队列用信号量;队列内部 GPU 侧的读写次序用管线屏障;命令中间的细粒度锚点用事件。四者不可互相替代——用栅栏做队列间同步会在 CPU 上白等,用信号量做缓冲读写屏障则根本挂不上。

沿途站点

第一站 6.1 栅栏与主机同步。栅栏的两种等待姿势(阻塞与轮询)、按帧轮换的栅栏阵列、vkDeviceWaitIdle 的正确使用场合,以及在途帧数这个全局节奏参数的调节方法。

第二站 6.2 信号量、事件与管线屏障。二值信号量与时间线信号量的两代设计;事件的置位等待与宿主操作;管线屏障的完整语法——阶段掩码、访问掩码、依赖标志,以及图像布局迁移的标配写法。

第三站 6.3 多线程与队列并发。哪些对象线程安全、哪些要外部同步;多队列并行的排队与连线;跨队列族呈现的族所有权移交;把线程模型与队列模型对齐的工程方法。

拐点与结论

本章的认知转折在 6.2 的屏障语法:当阶段掩码与访问掩码都要亲手填写,你会意识到「数据可见性」从来不是自动的——它是等待、写入、读取三方都要签字的合同。结论是:同步错误的症状(花屏、闪现、偶发损坏)几乎从不指向错误本身,唯二的自救手段是验证层的同步校验(第 8 章)与本章建立的因果推理习惯。反过来,并发也是 Vulkan 回报最丰厚的领域:多线程录制、多队列并行、异步上传,这些老 API 里做不到的事,全部建立在本章的四个原语之上。

读完你应该

说出栅栏与信号量的管辖边界,各举一个「用错会怎样」的场景。

实现按帧轮换的栅栏阵列,解释在途帧数与展台数量、同步对象数量的联动关系。

写出一个完整的图像布局迁移屏障,逐项说明阶段掩码、访问掩码与子资源范围的选择依据。

用时间线信号量替代多条二值信号量完成跨队列链路,并说出它解决的老问题。

判断任意一个 Vulkan 对象在多线程环境下的使用合法性,列出需要外部同步的对象清单。

搭建「渲染、上传、计算」三队列并行的提交协议,处理跨队列族的资源移交。

下一章的接力

同步是地基,第 7 章在它上面盖楼:光线追踪的加速结构与管线、网格着色的任务化几何、可变速率着色与动态渲染的联动。高级特性的共性恰好是同步更复杂——异步加速结构更新、计算与光追交错,全靠本章的原语撑腰。

出本章之前做一次装备清点:栅栏的轮换阵列、屏障的推理三问、对象线程安全清单、信号量连线协议——四件东西应该在你的工程里各有一个落点(一个同步框架文件、一张评审清单、一段启动期断言、一条提交协议注释)。本章的判完成标准不是「读懂了」,而是「工程里找得到对应的实现」。清点缺项的话,回对应站点补齐再走——第 7 章的每一处高级特性都默认你已经带齐了这套行李。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U