← AMD 专题与八个进阶单元

AMD / LAB 06 OF 08

正确性不是一个等号:数值、随机输入与重复调用

给 reduction 建立独立 oracle 和失败定位信息。

本单元 4 小时。本公司八个单元共 32h,三家公司共额外 96h 核心实践;这笔时间在共同路线之外,未压入厂商入门的44h。

本页是实践讲义。打开、阅读或复制命令不代表完成。新单元的 SDK、simulator 与硬件命令均未在教材建设中执行;自己的结果应按实际后端保存。

先备与马上可用的例子

先完成:amd-05 →

直接打开机制图,边看边手推

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 分钟

  1. 为整数长度上限和数值范围定界,证明累加不溢出。
  2. 为有限浮点定义 abs(a-b)<=atol+rtol*abs(ref) 的适用范围,另列 NaN/Inf 策略。

这一段的产出:测试合同

2. 手算消去 · 40 分钟

  1. 用 float32 可表示性解释 1e8+1 可能仍为 1e8。
  2. 分别写 ((1e8+1)-1e8) 与 ((1e8-1e8)+1) 的中间结果;注明数学结果都是1。

这一段的产出:两种树的数值推导

3. 实现测试驱动 · 90 分钟

  1. 创建独立 test_driver;对 N=0,1,4,5,31,32,33 测 [-3,3] 中固定种子整数。
  2. 先跑自己的 CPU oracle 与分块实现;设备分支复用同一份保存的输入而不是重新生成。
  3. 每个 case 调用两次,再用全零输入调用一次;结果检查始终启用。

这一段的产出:可复现测试矩阵

4. 注入三类错误 · 50 分钟

  1. CPU 版本分别跳过末元素、跳过清零、把 NaN 交给错误的反向比较式;确保测试能识别。
  2. 报告 case id、N、seed、expected、actual 和阶段 partial,保留最小失败输入。
  3. 恢复实现;设备大数测试只在已定义的数值域内进行。

这一段的产出:三类失败与修复记录

5. 解释可接受误差 · 30 分钟

  1. 用英文解释为何不把 atol 调到任意大直到通过。
  2. 将数值不确定与调度未验证写为不同限制。

这一段的产出:数值验收说明

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 链接可能变化,请在自己的复现说明中保留实际版本。