← 12套面试训练

LOOP 10 / INTERVIEW LOOP / 4H

多分区 Scan:空分区也参与协议

数据已分给三个逻辑计算节点,其中一个节点没有数据。你需要保持全局 scan 顺序,并说明“这个节点不算东西”为什么不等于“可以不发送协议消息”。

完成单元 67 · 用独立 oracle 分清模型、simulator 与设备及其先备后安排本次训练。不绑定日历周。

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

先备与学习位置

回到对应的路线里程碑 →

TIME WITH OUTPUTS

240 分钟怎样用

  1. 闭卷恢复先备 · 15min

    用语言说明 circular buffer 的容量归还、PE 本地数据和 host 完成等待;复习 total 与 exclusive offset 的区别。

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

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

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

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

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

    输入按节点顺序为 P0=[2,1]、P1=[]、P2=[4,-2,3]。计算每个节点 inclusive local scan、local total、exclusive node offsets,再拼成全局 inclusive scan。写一个普通 C++ oracle 与三张消息状态表:本地结束、偏移可用、结果可读。只讨论公共模型,不运行或宣称 WSE simulator。

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

  4. 边界与反证 · 25min

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

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

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

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

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

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

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

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

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

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

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

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

    次日重做 parts=[[1,-1],[2],[],[3]]。独立列 local scans、totals、offsets、global,并指出哪两个不同状态都携带数值 0。

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

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

SOLVE BEFORE READING THE ANSWER

先独立处理这个问题

输入按节点顺序为 P0=[2,1]、P1=[]、P2=[4,-2,3]。计算每个节点 inclusive local scan、local total、exclusive node offsets,再拼成全局 inclusive scan。写一个普通 C++ oracle 与三张消息状态表:本地结束、偏移可用、结果可读。只讨论公共模型,不运行或宣称 WSE simulator。

输入与输出合同

  • 各分区维持输入顺序;整数范围限每项 [-100,100]、总长度≤100,避免本题算术溢出。
  • 空分区 total=0 且输出为空,但它的协议完成状态和消息传递仍须明确。
  • host 只在所有分区完成且输出长度确认后读取;消息表示 total、offset 还是有效元素数必须标注。
手算之后,对照公开用例
输入或情形预期为什么
parts=[[2,1],[],[4,-2,3]]local=[[2,3],[],[4,2,5]]; totals=[3,0,5]; offsets=[0,3,3]; global=[2,3,7,5,8]后两节点偏移相同,但各自局部数据不同。
parts=[[],[],[]]totals=[0,0,0]; offsets=[0,0,0]; global=[]空数据仍有三个完成参与者。
parts=[[],[5],[-5]]offsets=[0,0,5]; global=[5,0]负数与总和为 0 不等于没有数据。
P1 不传任何状态,P2 等前驱 offset拒绝该协议设计空节点可能造成下游永久等待。

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

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

解法依据

各分区内部从 0 累加得到 local scan 和 total。节点偏移是它之前所有节点 total 的和,不含自己的 total。每个 local scan 元素加本节点 offset,按节点顺序拼接。协议层给空分区定义“发送 total=0、收到偏移后继续转发并报告完成”;不以输出长度 0 代替消息完成。最终与对展平输入执行的串行 inclusive scan 对照。

逐步推演

P0 total=3,offset=0;P1 total=0,offset=3,向后贡献的累计仍为 3;P2 offset=3,把 [4,2,5] 变成 [7,5,8]。展平 [2,1,4,-2,3] 的前缀为 [2,3,7,5,8],完全一致。P2 的最后值 8 是全局总和;5 是它的局部总和。

FOLLOW THE ANSWER, NOT A SCRIPT

从回答进入下一层追问

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

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

NODE n1

为什么 P2 要加 3,而不是加前一个节点的 total=0?

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

需要解释清楚:offset 是所有前面节点的累计总和,包含 P0 的 3;只取直接前驱的局部 total 会丢失更早历史。

达到

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

保留关键推理:offset 是所有前面节点的累计总和,包含 P0 的 3;只取直接前驱的局部 total 会丢失更早历史。

继续到 n2 →

待补

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

写 offsets[2]=totals[0]+totals[1],区分局部 total 与累计消息。

继续到 r1 →

NODE r1

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

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

需要解释清楚:offset 是所有前面节点的累计总和,包含 P0 的 3;只取直接前驱的局部 total 会丢失更早历史。

修复后达到

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

写 offsets[2]=totals[0]+totals[1],区分局部 total 与累计消息。

继续到 n2 →

仍未达到

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

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

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

NODE n2

最后结果为 0 能作为“没有数据”的标记吗?

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

需要解释清楚:不能,[5,-5] 有两个有效输出而最终总和为 0;有效长度、完成状态与数值必须独立。

达到

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

保留关键推理:不能,[5,-5] 有两个有效输出而最终总和为 0;有效长度、完成状态与数值必须独立。

继续到 n3 →

待补

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

分别记录 payload、count、done 三列,用空序列和 [5,-5] 比较。

继续到 n3 →

NODE n3

仅 CPU oracle 全部通过,可以把 GPU correctness 门标成通过吗?

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

需要解释清楚:不能;它验证数学分解。对应 SDK 编译、官方 simulator 与硬件执行各有独立环境和证据,任何未做步骤保持未验证。

达到

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

保留关键推理:不能;它验证数学分解。对应 SDK 编译、官方 simulator 与硬件执行各有独立环境和证据,任何未做步骤保持未验证。

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

待补

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

给现有输出标“CPU 逻辑模型”,列出设备侧仍缺的路由、buffer、同步与回读检查。

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

答案强在哪里,弱在哪里

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

弱答案

“每个节点都扫一遍,最后 concat;空节点直接跳过。”

强答案

“局部 scan 只包含本地历史,必须加前面节点的总和。空节点的 total 是零,但它仍承担协议进度;我明确转发偏移和完成信号。最后用展平输入的串行 scan 验证数学结果,设备通信还需独立验证。”

强答案同时覆盖值语义和协议进度。concat 只保持局部顺序,不能补出跨节点历史;一个 CPU 结果也不能证明真实 NoC 无死锁。

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

ANSWER, THEN HANDLE AN INTERRUPTION

英文口述与打断

Explain why an empty partition may still have protocol responsibilities.

  1. Separate payload, count, and completion.
  2. Compute the final partition offset.
  3. Distinguish oracle from simulator evidence.

“Why can’t a zero result mean that the node had no data?”

录完第一轮后,读英文示范
An empty partition contributes a zero total, but it may still need to forward the accumulated offset and report completion. The final partition receives three because offsets include all earlier totals. I compare the result with a serial scan of the flattened input. That validates the decomposition, not the correctness of a device communication implementation.
  • 前 15 秒说明输入、输出和一个关键约定。
  • 至少用一个本题的数值解释因果,不只罗列英文术语。
  • 明确一个边界或尚未验证的限制;不能把教学推演说成项目经验。

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

次日重做 parts=[[1,-1],[2],[],[3]]。独立列 local scans、totals、offsets、global,并指出哪两个不同状态都携带数值 0。

独立重做后核对

local=[[1,0],[2],[],[3]];totals=[0,2,0,3];offsets=[0,0,2,2];global=[1,0,2,5]。P0 total=0 但有两项,P2 total=0 且为空;必须用长度区分。

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

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

记录实际回答与证据

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

本次练习的检查依据

四类数值与串行 oracle 一致;空分区有进度合同;没有把本地模型升级为 simulator/硬件验证。

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