AMD / LAB 03 OF 08
分段 reduction:尾部元素也必须进入答案
将固定串行实现改成有明确边界的两阶段求和。
本单元 4 小时。本公司八个单元共 32h,三家公司共额外 96h 核心实践;这笔时间在共同路线之外,未压入厂商入门的44h。
本页是实践讲义。打开、阅读或复制命令不代表完成。新单元的 SDK、simulator 与硬件命令均未在教材建设中执行;自己的结果应按实际后端保存。
先备与马上可用的例子
先完成:amd-02 →
- 30-a · 枚举十二个线程覆盖十个元素:先看输入和实际源码,再开始自己的修改;教学实现与自己的产出分别记录。
- 36-a · 非整块输入的两级求和:先看输入和实际源码,再开始自己的修改;教学实现与自己的产出分别记录。
直接打开机制图,边看边手推
- 32 · 可改条件的机制图 → Reduction、scan 与数值正确性;图解不执行厂商 SDK。
- 34 · 可改条件的机制图 → Kernel 索引、边界与 grid-stride loop;图解不执行厂商 SDK。
PREDICT FIRST
具体问题与独立预期
输入与约定
X=[3,-1,4,0,2],教学 blockSize=4;再测 N=0,1,4,5,9 的 X[i]=i+1。
先根据输入写下自己的结果与理由,再展开参考推演;随后运行或检查实现。
对照参考结果与原因
第一阶段 partial=[6,2],第二阶段为 8。递增输入总和依次为 0,1,10,15,45。
每个有效输入恰好属于一个 block;越界 lane 写入加法单位元 0。第二阶段只累加真正的 partial 数量。
机制怎样连接起来
先保持 blockSize 为 2 的幂,避免同时引入不规则树和不规则尾部。N=5 时第一个 block 处理四个值,第二个 block 只有一个有效值;无效 lane 不读 X,但仍参与 block 内要求一致到达的同步。
CPU 分支显式保存每一轮 shared 数组的旧值和新值,不能在同一轮按顺序更新后又读取已经改变的值。这一条让模型对应一轮并行归约的逻辑依赖。真实 HIP 分支每轮写 shared 后使用 block 同步,不能把 CPU 模型的执行次序当成硬件保证。
第二阶段最初可以把少量 partial 回读后在 host 求和。随后再加一个小 kernel;README 标记两种实现的数据移动差别。本单元不使用跨 block 的普通变量忙等,也不要求写一个完整生产级多级归约库。
CHOOSE ONE EXECUTION PATH
按手头环境推进
CPU 路径可以先完成。额外的 SDK 或设备验证要有自己的运行记录;本单元的四小时不同时要求完成四个分支。安装等待超过本页预算时,留下阻塞条件,继续可做的数学、代码与协议工作。
CPU · 现有机器 · 本单元尚未验收
条件:现有 macOS 或 Linux;C++20 编译器或 Python 3 标准库。无需加速卡。
本分支做什么:实现分块树和 host-final;每轮保存数组快照。
保存什么证据:保存自己的源码、输入、实际 stdout/stderr 和退出码;只证明 CPU 逻辑。
教材初始执行状态:not-executed。这不是对你个人学习进度的判断。
SDK · 编译与环境 · 本单元尚未验收
条件:已有兼容 ROCm/HIP 的 Linux 工具链。
本分支做什么:依据 reduction 教程核对本版 shared/barrier 写法,编译自己的两阶段实现。
保存什么证据:保存实际工具版本与编译命令;仅编译成功不能记成运行通过。
教材初始执行状态:not-executed。这不是对你个人学习进度的判断。
官方 simulator · 本单元尚未验收
条件:只有明确提供并且版本匹配的官方 simulator 才属于此分支。
本分支做什么:CPU 模型不覆盖真实 wavefront 调度或 barrier 死锁。
保存什么证据:记录 simulator 名称、版本、输入、日志、退出状态;网页或 CPU 模型不算 simulator。
教材初始执行状态:not-executed。这不是对你个人学习进度的判断。
真实设备 · 本单元尚未验收
条件:用户已有并可使用的兼容设备或实验室环境;本单元不要求购买、租用或提交集群作业。
本分支做什么:运行小输入再运行受限大输入;禁止用普通变量构造跨 block 自旋屏障。
保存什么证据:真实设备输出、同步点、设备型号和复现日志单独保存;未执行保持未通过。
教材初始执行状态:not-executed。这不是对你个人学习进度的判断。
READ → BUILD → BREAK → EXPLAIN
四小时,留下一个完整产出
可拆成多个时段。每次停下时保存代码、输入、实际结果和下一步,不用重新读整篇。没有通过当前检查时继续修正,不靠翻页推进。
1. 分配输入 · 30 分钟
- 画 N=5、B=4 的两行 lane;写下索引 0..7 和有效标记。
- 在第 30 章交互图把 N 改为 9,确认三个 block 的覆盖。
这一段的产出:索引覆盖表
2. 定义树合同 · 40 分钟
- 写第一轮 [3,-1,4,0]→[7,-1,4,0] 或自己选定的配对顺序,但明确每层读取上一层。
- 固定 B=4 的树是 stride=2 再 stride=1,第一 block 输出 6;第二 block [2,0,0,0] 输出 2。
这一段的产出:每层数组快照
3. 实现两阶段 · 90 分钟
- 复制自己的 amd-02 到新文件,抽出 N 和 B;N=0 在 host 直接返回 0。
- CPU 路径实现分块函数返回所有 partial;HIP 路径用 shared 和一致到达的 barrier,每块只由 lane0 写 partial。
- 先在 host 完成第二阶段,然后可选新增小 kernel,分别记录为 host-final 或 device-final。
这一段的产出:分块实现与 partial 日志
4. 测边界和受控错误 · 50 分钟
- 运行本页五个递增 N 用例,用 N*(N+1)/2 在受限范围建立独立期望。
- 故意把 block 数写成 N/B,确认 N=5 或 9 失败;恢复 ceil 计算。
- 只在 CPU 模型展示提前退出越界 lane 的问题;真实 kernel 保持所有参与 lane 到达 barrier。
这一段的产出:边界表与尾部错误修复
5. 解释两个阶段 · 30 分钟
- 说明为什么一个 block 的 barrier 不能让其他 block 的 partial 都已就绪。
- 交付至少两张层次树和 CPU/硬件状态。
这一段的产出:两阶段正确性说明
EXPLICIT ENVIRONMENT / EXPLICIT STATUS
命令与可保存的起点
以下代码按各自环境使用,运行前完成对应步骤并核对版本。编译失败后停止,不运行目录中的旧二进制;每次采集日志使用新的运行目录。设备程序仅运行在你已有且可使用的环境中。
这个单元复用前一单元的项目文件,并按上面的具体任务修改。对应章节例子的源码、编译命令和预期输出在本页先备链接里;不要把例子自己的固定成功判定遗留到已改输入的版本中。
一个必须能解释的错误
错误情境:if(i>=N) return 写在 __syncthreads 之前。
为什么会错:最后一块部分线程离开,剩下线程到达需要共同参与的同步点,程序合同被破坏。
怎样修复:为无效 lane 提供 0,并使 block 内参与线程在每轮一致到达 barrier。
EVIDENCE BEFORE ADVANCING
验收与面试追问
- partial=[6,2] 全部打印,不只检查最终和。
- N=0 不启动空 grid;1/4/5/9 的预期均正确。
- 错误注入能够暴露遗漏尾部;barrier 解释包含作用域。
最后留下这几项
输入和预期、自己的源码或明确标为推演的状态表、实际命令/输出/退出码、一个失败与修复、后端与版本、尚未执行的部分。运行已有教学例子与独立完成修改分别记录。
1. 为什么两块不能直接靠 __syncthreads 汇总?
对照中文要点与英文回答
它只协调同一 block 的参与线程,不提供整个 grid 的同步。不同 kernel 的执行依赖可建立阶段边界。
A block barrier does not synchronize the grid. A separate dependent kernel provides a global stage boundary.
2. 第二块三个无效 lane 做什么?
对照中文要点与英文回答
不访问输入,给 shared 写 0,按同一控制流参与树和同步。
Inactive input lanes contribute zero while still following the required block synchronization.
3. partial 只有两个值,CPU 最后加是否合理?
对照中文要点与英文回答
作为可解释基线合理;它增加回读和 host 工作,性能报告必须包含这一部分。
A host final sum is a valid baseline. Its transfer and host costs must be included in the stated timing scope.
这些是依照本单元机制设计的追问,不是公司真题。个人验收仍依据实际代码、测试、测量与口述。
资料与版本核验
- HIP reduction tutorial ↗
Reduction stages and optimization
核验日期:2026-09-05。HIP latest / 7.15.0 页面;本讲义的短输入和算法合同独立设计,不照抄优化 kernel。
- HIP programming model ↗
Host programming; hierarchical thread model
核验日期:2026-09-05。核验时 HIP latest 页标题为 7.15.0;以安装工具链的版本选择器和本地头文件为准。
- HIP error handling ↗
API return values and asynchronous error reporting
核验日期:2026-09-05。HIP latest / 7.15.0 页面;保存 hipcc --version 与错误发生的 API 名称。
正文、问题和实践设计依据公开资料独立撰写。官方页面的示例输出是资料中的结果,不是本机运行证据。latest 链接可能变化,请在自己的复现说明中保留实际版本。