AMD / LAB 06 OF 08
正确性不是一个等号:数值、随机输入与重复调用
给 reduction 建立独立 oracle 和失败定位信息。
本单元 4 小时。本公司八个单元共 32h,三家公司共额外 96h 核心实践;这笔时间在共同路线之外,未压入厂商入门的44h。
本页是实践讲义。打开、阅读或复制命令不代表完成。新单元的 SDK、simulator 与硬件命令均未在教材建设中执行;自己的结果应按实际后端保存。
先备与马上可用的例子
先完成:amd-05 →
- 28-b · 相消与非有限值拒绝:先看输入和实际源码,再开始自己的修改;教学实现与自己的产出分别记录。
- 36-b · 只优化kernel的端到端收益:先看输入和实际源码,再开始自己的修改;教学实现与自己的产出分别记录。
直接打开机制图,边看边手推
- 32 · 可改条件的机制图 → Reduction、scan 与数值正确性;图解不执行厂商 SDK。
PREDICT FIRST
具体问题与独立预期
输入与约定
整数小输入 X;浮点输入 [1e8,1,-1e8];固定种子生成的小整数;连续调用同一实现两次。
先根据输入写下自己的结果与理由,再展开参考推演;随后运行或检查实现。
对照参考结果与原因
数学实数和为 1;float32 不同加法顺序可能得到 0 或 1。整数受限用例精确比较;有限浮点使用事先声明的 atol/rtol。
比较规则应在看结果之前确定;既不能把正常舍入误差当数据丢失,也不能无限放宽阈值掩盖尾部或同步错误。
机制怎样连接起来
把正确性分为接口、覆盖、数值和重入四层。长度和内存合同错时不应先讨论舍入;整数小例先排除漏元素,再用带消去的浮点例研究顺序。
double 或 long double oracle 可以减少一些误差,却不是任意输入上的精确实数求和。此处限定可解释的测试域,保留绝对误差、参考量级和最坏索引;接近零时要有绝对容差。非有限输入可以明确拒绝,不要让 NaN 通过“不是大于阈值”的反向判断。
重复调用能揭示未清空 partial 或累加输出。先用相同输入两次都应得到同样期望,再切换到全零输入;如果输出残留上次结果,检查初始化位置和完成边界。
CHOOSE ONE EXECUTION PATH
按手头环境推进
CPU 路径可以先完成。额外的 SDK 或设备验证要有自己的运行记录;本单元的四小时不同时要求完成四个分支。安装等待超过本页预算时,留下阻塞条件,继续可做的数学、代码与协议工作。
CPU · 现有机器 · 本单元尚未验收
条件:现有 macOS 或 Linux;C++20 编译器或 Python 3 标准库。无需加速卡。
本分支做什么:实现固定种子测试和错误注入,运行28-b对照浮点判定边界。
保存什么证据:保存自己的源码、输入、实际 stdout/stderr 和退出码;只证明 CPU 逻辑。
教材初始执行状态:not-executed。这不是对你个人学习进度的判断。
SDK · 编译与环境 · 本单元尚未验收
条件:已有兼容 ROCm/HIP 的 Linux 工具链。
本分支做什么:编译同一测试驱动的 HIP 后端,保留输入文件。
保存什么证据:保存实际工具版本与编译命令;仅编译成功不能记成运行通过。
教材初始执行状态:not-executed。这不是对你个人学习进度的判断。
官方 simulator · 本单元尚未验收
条件:只有明确提供并且版本匹配的官方 simulator 才属于此分支。
本分支做什么:CPU 浮点和 GPU 浮点环境可能不同,不把 CPU 结果叫设备精度验证。
保存什么证据:记录 simulator 名称、版本、输入、日志、退出状态;网页或 CPU 模型不算 simulator。
教材初始执行状态:not-executed。这不是对你个人学习进度的判断。
真实设备 · 本单元尚未验收
条件:用户已有并可使用的兼容设备或实验室环境;本单元不要求购买、租用或提交集群作业。
本分支做什么:运行相同测试,记录编译优化参数、dtype 和重复调用结果;不预先保证逐位一致。
保存什么证据:真实设备输出、同步点、设备型号和复现日志单独保存;未执行保持未通过。
教材初始执行状态:not-executed。这不是对你个人学习进度的判断。
READ → BUILD → BREAK → EXPLAIN
四小时,留下一个完整产出
可拆成多个时段。每次停下时保存代码、输入、实际结果和下一步,不用重新读整篇。没有通过当前检查时继续修正,不靠翻页推进。
1. 写测试合同 · 30 分钟
- 为整数长度上限和数值范围定界,证明累加不溢出。
- 为有限浮点定义 abs(a-b)<=atol+rtol*abs(ref) 的适用范围,另列 NaN/Inf 策略。
这一段的产出:测试合同
2. 手算消去 · 40 分钟
- 用 float32 可表示性解释 1e8+1 可能仍为 1e8。
- 分别写 ((1e8+1)-1e8) 与 ((1e8-1e8)+1) 的中间结果;注明数学结果都是1。
这一段的产出:两种树的数值推导
3. 实现测试驱动 · 90 分钟
- 创建独立 test_driver;对 N=0,1,4,5,31,32,33 测 [-3,3] 中固定种子整数。
- 先跑自己的 CPU oracle 与分块实现;设备分支复用同一份保存的输入而不是重新生成。
- 每个 case 调用两次,再用全零输入调用一次;结果检查始终启用。
这一段的产出:可复现测试矩阵
4. 注入三类错误 · 50 分钟
- CPU 版本分别跳过末元素、跳过清零、把 NaN 交给错误的反向比较式;确保测试能识别。
- 报告 case id、N、seed、expected、actual 和阶段 partial,保留最小失败输入。
- 恢复实现;设备大数测试只在已定义的数值域内进行。
这一段的产出:三类失败与修复记录
5. 解释可接受误差 · 30 分钟
- 用英文解释为何不把 atol 调到任意大直到通过。
- 将数值不确定与调度未验证写为不同限制。
这一段的产出:数值验收说明
EXPLICIT ENVIRONMENT / EXPLICIT STATUS
命令与可保存的起点
以下代码按各自环境使用,运行前完成对应步骤并核对版本。编译失败后停止,不运行目录中的旧二进制;每次采集日志使用新的运行目录。设备程序仅运行在你已有且可使用的环境中。
这个单元复用前一单元的项目文件,并按上面的具体任务修改。对应章节例子的源码、编译命令和预期输出在本页先备链接里;不要把例子自己的固定成功判定遗留到已改输入的版本中。
一个必须能解释的错误
错误情境:使用 !(abs(actual-ref)>tol) 判通过。
为什么会错:actual 是 NaN 时比较为 false,再取反便可能错误通过。
怎样修复:先执行非有限值策略,再在明确数值域中检查误差;极大值还需避免差和阈值溢出。
EVIDENCE BEFORE ADVANCING
验收与面试追问
- 每种错误至少被一个测试抓住,修复后恢复通过。
- 重复调用与零输入排除累加残留。
- 容差在运行前写明,NaN/Inf 不默默通过。
最后留下这几项
输入和预期、自己的源码或明确标为推演的状态表、实际命令/输出/退出码、一个失败与修复、后端与版本、尚未执行的部分。运行已有教学例子与独立完成修改分别记录。
1. GPU 与 CPU 结果不同一定错吗?
对照中文要点与英文回答
不一定。不同树和融合运算可能改变舍入;但必须先排除覆盖和同步错误,再用事先声明的数值标准评估。
Different reduction orders can change rounding. I first rule out missing work and synchronization bugs, then apply a predefined numerical contract.
2. 固定种子就能跨所有库重现输入吗?
对照中文要点与英文回答
未必,分布映射可能随实现变化;保存实际生成的输入更可靠。
A seed alone may not reproduce a distribution across implementations. I also save the actual input values.
3. 为何要跑同一个输入两次?
对照中文要点与英文回答
发现未重置输出、partial 和状态;单次进程初始化可能掩盖这些错误。
Repeated calls expose stale accumulators and incomplete state reset that a fresh process can hide.
这些是依照本单元机制设计的追问,不是公司真题。个人验收仍依据实际代码、测试、测量与口述。
资料与版本核验
- HIP reduction tutorial ↗
Reduction stages and optimization
核验日期:2026-09-05。HIP latest / 7.15.0 页面;本讲义的短输入和算法合同独立设计,不照抄优化 kernel。
- HIP error handling ↗
API return values and asynchronous error reporting
核验日期:2026-09-05。HIP latest / 7.15.0 页面;保存 hipcc --version 与错误发生的 API 名称。
- HIP programming model ↗
Host programming; hierarchical thread model
核验日期:2026-09-05。核验时 HIP latest 页标题为 7.15.0;以安装工具链的版本选择器和本地头文件为准。
正文、问题和实践设计依据公开资料独立撰写。官方页面的示例输出是资料中的结果,不是本机运行证据。latest 链接可能变化,请在自己的复现说明中保留实际版本。