← 12套面试训练

LOOP 09 / INTERVIEW LOOP / 4H

异步面试:先交还缓冲区,再讨论重叠

面试官给出一个理想化流水线:每批上传、计算、下载分别用 2、3、1 个时间单位。你需要给双缓冲安排合法时序,并把这个纸上模型与 HIP/显式数据流的真实约束区分。

完成单元 63 · Circular buffer 的预留、发布与释放及其先备后安排本次训练。不绑定日历周。

先写自己的答案,再展开参考。这里按技能编写问题,不声称公司真题;自评与阅读都不会自动通过 G0。

先备与学习位置

回到对应的路线里程碑 →

TIME WITH OUTPUTS

240 分钟怎样用

  1. 闭卷恢复先备 · 15min

    说明同步/异步提交、stream 内顺序、event 依赖、tile 的逻辑布局;不要求安装 SDK。

    留下:先不查章节,写三条判断和一个不确定点;再只补读相关章节的解释段。

  2. 澄清题目与手算 · 25min

    读主问题,逐条写输入、输出、范围与失败行为。手算前两个公开用例,给自己的方案找一个反例。

    留下:一份接口合同、逐步状态表和最小反例;不要先打开参考推演。

  3. 独立实现或设计 · 55min

    为三个批次 C0/C1/C2 排时间表。模型有独立且各自串行的上传引擎、计算引擎、下载引擎;单批顺序是 H→K→D。两个 slot 轮换,slot 必须等上次 D 完成才可复用。所有批次 t=0 可提交,忽略启动开销。输出每个 H/K/D 的起止时间与总完成时间;再计算一个 slot 的对照。

    留下:保存个人代码或设计稿。编码题保留编译命令;设计题为每个事件编号,不能只画没有状态的箭头。

  4. 边界与反证 · 25min

    用题目的全部公开用例核对真实输出;另外创造一个与公开输入不同的边界。发现失败时缩小输入,再解释修复。

    留下:实际结果、原始失败和修复原因各一份;设计题记录一个被拒绝的执行顺序。

  5. 按表现进入追问树 · 35min

    从 n1 开始。每题先录下自己的回答,再展开标准;按满足或未满足条件跳转。树最多走一轮,卡住时把剩余时间用于分支中的纠错,不循环加时。

    留下:记录经过的节点、原话、缺失条件和修订;只会复述标准的节点仍标记待重做。

  6. 英文口述与打断 · 30min

    用本页英文提纲录制两轮 90 秒回答;第二轮在 30 秒处自问追问,先回答追问再回到主线。每轮回听并改写两个含糊句。

    留下:两轮录音或逐字稿;圈出输入、因果、边界和限制各一句。参考英文在录完第一轮后再读。

  7. 复盘与安排重做 · 25min

    对照强弱答案,选择一个真正出错的环节:合同、状态、实现、验证或表达。填本页记录模板,并约定下一天的 30 分钟。

    留下:一个有失败输入的错误记录和一个可观察修复标准;不要把全部问题归因为粗心。

  8. 次日无答案重做 · 30min

    次日保持两个 slot 和 H=2/K=3/D=1,扩为四批 C0..C3,关闭解答重新排表;另写出零批与单批结果。

    留下:这是本周 240 分钟中的最后 30 分钟,不另加预算。先关闭解答,用 20 分钟独立做,再用 10 分钟核验并记录是否仍需复习。

包括次日重做,总计 240min。局部错因复盘属于本次练习,额外的计划复盘按实际需要另记。

SOLVE BEFORE READING THE ANSWER

先独立处理这个问题

为三个批次 C0/C1/C2 排时间表。模型有独立且各自串行的上传引擎、计算引擎、下载引擎;单批顺序是 H→K→D。两个 slot 轮换,slot 必须等上次 D 完成才可复用。所有批次 t=0 可提交,忽略启动开销。输出每个 H/K/D 的起止时间与总完成时间;再计算一个 slot 的对照。

输入与输出合同

  • 这是给定资源假设的逻辑调度题,单位不是实测毫秒,不声称任何 GPU 真的有这些独立引擎或重叠能力。
  • 区间使用 [start,end),前一事件 end 等于后一 start 时允许衔接。
  • 必须满足资源串行、批内依赖与 slot 生命周期三类约束;仅声明不同 stream 不足以证明正确。
手算之后,对照公开用例
输入或情形预期为什么
两个 slot,三批,各 H=2/K=3/D=1D 完成时间 [6,9,12];总完成 12第三批 slot0 在 t=6 才能再次上传。
一个 slot,同样三批D 完成时间 [6,12,18];总完成 18每批结束后才可重用唯一 slot。
两个 slot,零批次总完成 0不凭空排空 batch。
错误候选:C2 在 t=4 使用 slot0 上传拒绝C0 的下载到 t=6 才结束。

先保留自己的解法、状态轨迹与验证记录,再打开参考。允许用自然语言或伪代码补充解释;不能用参考输出代替真实运行。

保存独立尝试后,阅读解法与状态轨迹

解法依据

维护三个引擎的可用时间和每个 slot 的可用时间。对批次 c 的 slot s:Hstart=max(Hfree,slotFree[s]),Hend=Hstart+2;Kstart=max(Kfree,Hend),Kend=Kstart+3;Dstart=max(Dfree,Kend),Dend=Dstart+1;随后更新各资源可用时间,slotFree[s]=Dend。这个递推是纸上排程或普通 C++ 模型,不是硬件执行。

逐步推演

双缓冲:C0 H[0,2) K[2,5) D[5,6);C1 H[2,4) K[5,8) D[8,9);C2 等 slot0,H[6,8) K[8,11) D[11,12)。t=6 前 slot0 不能改写。三个计算区间相接,模型的计算资源形成瓶颈。

FOLLOW THE ANSWER, NOT A SCRIPT

从回答进入下一层追问

n1 开始。先录下回答,再展开判定;达到条件就走深入分支,未达到就按反馈缩小问题。一次最多走一轮,不靠反复查看同一答案累积“通过”。

把实际走过的节点记入模板 →

NODE n1

C0 kernel 在 t=5 完成,slot0 此时能改写吗?

我已作答:查看判定与下一分支

需要解释清楚:不能,模型要求下载读取这份结果直到 t=6;归还是最后消费者完成,而非仅 kernel 完成。

达到

结论正确,并解释本节点给出的具体状态或反例。

保留关键推理:不能,模型要求下载读取这份结果直到 t=6;归还是最后消费者完成,而非仅 kernel 完成。

继续到 n2 →

待补

只报术语、漏掉条件,或不能解释题中的数值。

画 H/K/D 对 slot0 的读写,圈出最后一个消费者的结束时刻。

继续到 r1 →

NODE r1

把第一个追问缩到最小输入,重新逐步说明。

我已作答:查看判定与下一分支

需要解释清楚:不能,模型要求下载读取这份结果直到 t=6;归还是最后消费者完成,而非仅 kernel 完成。

修复后达到

用具体输入改正原回答,能指出之前错在哪里。

画 H/K/D 对 slot0 的读写,圈出最后一个消费者的结束时刻。

继续到 n2 →

仍未达到

仍依赖答案复述,不能独立重建状态。

本次树到此结束;把 n1 的输入和缺口写入复盘,再进入英文练习与次日重做。

这一分支结束:对照并复盘 →

NODE n2

把 H 和 D 改为共用一个串行传输引擎,原证明还能直接用吗?

我已作答:查看判定与下一分支

需要解释清楚:不能;原模型用了两个独立传输资源,必须重排并检查所有 H/D 区间不重叠。这组输入可能恰好仍可排到相同结果,但不能无验证沿用假设。

达到

结论正确,并解释本节点给出的具体状态或反例。

保留关键推理:不能;原模型用了两个独立传输资源,必须重排并检查所有 H/D 区间不重叠。这组输入可能恰好仍可排到相同结果,但不能无验证沿用假设。

继续到 n3 →

待补

只报术语、漏掉条件,或不能解释题中的数值。

把六段 H/D 放到同一时间轴,逐段查冲突,再讨论结果是否变化。

继续到 n3 →

NODE n3

HIP event 或 Metalium buffer 协议各需要表达哪一个共同事实?

我已作答:查看判定与下一分支

需要解释清楚:下一阶段只在数据准备好后消费,生产者只在最后消费者释放后复用容量;具体 API 与同步范围不同,不能互换名称当成相同实现。

达到

结论正确,并解释本节点给出的具体状态或反例。

保留关键推理:下一阶段只在数据准备好后消费,生产者只在最后消费者释放后复用容量;具体 API 与同步范围不同,不能互换名称当成相同实现。

这一分支结束:对照并复盘 →

待补

只报术语、漏掉条件,或不能解释题中的数值。

回到第34与第38章公开 API 流程,分别圈出等待完成、发布与容量归还的落点。

这一分支结束:对照并复盘 →

答案强在哪里,弱在哪里

保存自己的回答后,打开对照

弱答案

“用了两个 stream 就能同时跑,时间应该减半。”

强答案

“stream 描述次序,重叠还取决于依赖、资源和内存条件。在给定模型中我同时约束引擎空闲与 slot 归还,得到 12 个单位,而非声称减半。真实 HIP 还要检查 API 错误、event 依赖、内存类型和实际 trace。”

强答案计算了确定排程,区分提交与完成,并把模型假设列为结论条件。公司名称或异步 API 不能替代资源和生命周期证明。

在自己的原回答里划出一个缺失的条件或错误推理,再重说一遍。完整句子背熟,不代表能处理新约束。

ANSWER, THEN HANDLE AN INTERRUPTION

英文口述与打断

Explain your scheduling assumptions before presenting a speedup.

  1. List three serialized resources.
  2. Identify the last consumer of a slot.
  3. Label the result as a logical schedule.

“Why isn’t kernel completion enough to reuse the buffer?”

录完第一轮后,读英文示范
This schedule assumes separate serialized engines for upload, compute, and download. A buffer becomes reusable only after its final download completes. Under those assumptions, the three batches finish at six, nine, and twelve time units. These are model results; a hardware overlap claim would require the actual environment and a trace.
  • 前 15 秒说明输入、输出和一个关键约定。
  • 至少用一个本题的数值解释因果,不只罗列英文术语。
  • 明确一个边界或尚未验证的限制;不能把教学推演说成项目经验。

次日关掉解答,换一个问题

次日保持两个 slot 和 H=2/K=3/D=1,扩为四批 C0..C3,关闭解答重新排表;另写出零批与单批结果。

独立重做后核对

C3 使用 slot1:H[9,11) K[11,14) D[14,15),总完成 15;零批 0,单批 6。应重新列全表验证每个资源和 slot,不仅把 12 加 3。

  • 关闭主问题答案并使用新输入独立完成。
  • 给出结果与原因;失败时记录最小反例,不能只把完成标记改成通过。

重做的 30min 已计入本套4h;需要更多补课时记录实际用时,按缺口顺延。

记录实际回答与证据

本次面试练习模板
# W09 算法 / 英文训练记录(仅个人练习,不是能力认证)
日期:
本次先备与尚不确定点:
主问题接口合同:
我最初的方案与状态表:
运行命令或设计事件编号:
失败输入 / 预期 / 实际:
修复与理由:
追问路径(节点 → 自己原话 → 缺口):
英文第一轮两处含糊句:
英文第二轮修订:
次日重做日期(30 分钟已含本周预算):
重做输入 / 实际结果 / 解释:
仍需补练:

本次练习的检查依据

每一段资源与 buffer 约束可逐项检查;错误复用能被明确拒绝;英文不把理论时间写成 GPU benchmark。

模板在你的个人笔记中填写。网页只提供空模板;不会把这次训练写成项目经验或学习验收结果。