01 · 先画依赖,再谈并行
如果 B 需要 A 的输出,必须等 A 的对应数据就绪。异步调用只是让主机有机会继续安排其他工作,不会让 B 提前拿到不存在的数据。分块可以把“等全部完成”改成“等当前块完成”,前提是该块确实可以独立使用。
02 · stream 与 event 做什么
以 CUDA 为例,stream 是按顺序提交工作的队列;多个 stream 给运行时提供并行机会。event 可以标记某个工作已经完成,另一个 stream 等待这个标记后再使用结果。能否真的同时执行,取决于硬件资源和操作实现。
一个缓冲区不能在通信仍读取时被计算覆盖。完成通知、缓冲生命周期和正确结果与性能同样重要。
03 · 为什么总耗时可能缩短
设三个计算块各 2 ms,通信块各 1 ms。全部计算后再通信为 9 ms;每块一算完就传,传第1块时算第2块,可在理想双执行引擎模型中缩短到 7 ms。首块计算和最后一块通信仍在边缘暴露。
重叠没有让通信数据量消失。若通信太慢,通信队列仍是瓶颈;若二者争用同一带宽,单独测到的时间也可能上升。
04 · 怎样读时间线
- 确认每块输入的就绪时刻。
- 查看计算和通信是否真的同时占据时间区间。
- 沿最后完成的关键路径检查等待和长尾。
- 对比完整步骤时间,避免把两个重叠区间的时长简单相加。