SAME QUESTIONS / DIFFERENT MACHINES
把共同问题,放到三种架构里。
先问数据在哪里、谁在计算、什么时候可见,再学习厂商 API。每家公司保留四章基础讲解,再用八个进阶实践单元补环境、数据流、调试与答辩。先选一家做深,再迁移共同方法。
基础比较与深入实践,分别预算
路线中的44h用于共同模型与入门比较。下方 24 个进阶单元每个 4h,单家公司 32h,全部为额外 96h 核心;与基础比较分别安排。每个单元分别列 CPU、SDK、simulator 与设备路径。
| 共同问题 | AMD | Tenstorrent | Cerebras |
|---|---|---|---|
| 如何划分计算 | kernel / grid / block | core / tile / pipeline | PE / layout / local work |
| 如何移动数据 | host/device memory、load/store | NoC、reader/writer、buffers | fabric 路由、PE 间消息 |
| 如何证明完成 | streams/events、错误检查 | 缓冲区协议、kernel 完成 | 通信依赖、task/host 协调 |
| 如何判断优化 | 正确性 + 对应硬件 profiler | 端到端时间 + 通信/利用率 | 模型边界 + 对应执行证据 |
amd
一个 kernel 怎样被提交、执行并回传结果?
HIP 表达线程与内存,ROCm 工具链和 runtime 组织编译、加载、队列与同步;驱动继续负责设备和内存管理。
贯穿练习:以 reduction 为主,解释 launch、线程索引、数据移动、错误检查和 profiler 证据。
真实 HIP/GPU 验证需要对应受支持设备与软件栈。Mac 上的例子仅验证 CPU 逻辑。
四章基础讲解
- 37HIP:从 CPU 数据到一次 kernel 调用进入章节 →
五个数怎样经历分配、搬运、执行与验证?
- 38Streams 与 events:用依赖组织异步工作进入章节 →
两个 stream 怎样安全共享中间结果?
- 39ROCm 各层:一次请求由谁负责进入章节 →
HIP、ROCr、KFD、amdgpu 和硬件分别处理什么?
- 40HIP Reduction:从正确性到 profiling 问题进入章节 →
算出21以后,怎样判断还值得优化哪一步?
八个进阶实践单元 · 额外 32h
- 01先确认机器能做什么:环境清单与求和基线4h →
建立版本记录、支持条件和一个永远可复算的 CPU oracle。
- 02一次完整 HIP 调用:让 8 从设备回到 host4h →
从一个线程的正确 kernel 开始,跟踪分配、拷贝、提交、完成和释放。
- 03分段 reduction:尾部元素也必须进入答案4h →
将固定串行实现改成有明确边界的两阶段求和。
- 04数据移动与所有权:一次传输能省掉什么4h →
为同一批数据做两次求和,区别容量、有效长度和最后一次使用。
- 05双缓冲的依赖图:重叠必须服从数据完成4h →
把三批求和组织成两个槽位,证明复用时没有覆盖正在读的数据。
- 06正确性不是一个等号:数值、随机输入与重复调用4h →
给 reduction 建立独立 oracle 和失败定位信息。
- 07rocprofv3:提出一个可由 trace 回答的问题4h →
测量调用范围,分清 API 提交、kernel 和拷贝。
- 08把 reduction 讲成一个可复现的系统项目4h →
收束源码、测试、数据流和证据边界,完成英文答辩。
tenstorrent
谁负责把下一块数据送到计算核心?
以 tile 和显式数据流思考,reader、compute、writer 通过缓冲区和同步形成流水线;不能直接套用 GPU 的所有隐含假设。
贯穿练习:从小张量布局到 reader/compute/writer 推演,再检查缓冲区容量、通信量与端到端输出。
实际 Metalium/TTNN 运行需要匹配的环境。可用 simulator 也要标明版本与覆盖范围。
四章基础讲解
- 41Tensix 与 tiles:先安排数据,再安排计算进入章节 →
一张小矩阵怎样变成可分配的 tile 工作?
- 42TTNN 与 Metalium:不同抽象保留同一份数学合同进入章节 →
高层一次 add 与底层三个kernel,怎样验证做的是同一件事?
- 43Reader、compute、writer:缓冲区里的生产与消费进入章节 →
一块tile何时能读,何时才能复用?
- 44Tenstorrent 端到端例子:让每一层对同一结果负责进入章节 →
怎样从两张tensor一直检查到host回读?
八个进阶实践单元 · 额外 32h
- 01确认 TT 开发环境:版本栈与矩阵 oracle4h →
在现有机器上建立 CPU 起点,并为已有 TT 设备选择匹配安装路线。
- 02从 host 到 TTNN:逻辑形状与物理 tile4h →
将同一小矩阵嵌入32×32,验证转换和完整输出。
- 03DRAM→L1→DRAM:不计算,先证明搬对了4h →
给每个tile编号,定位数据移动、打包和回读错误。
- 04CB 发布协议:数据到齐才能 push4h →
用有限状态模型解释 reserve、NoC完成、push、wait、pop。
- 05单核matmul:沿 K 轴累加,而不是覆盖4h →
把小矩阵变为有两个K块的reader/compute/writer流程。
- 06多核分配:每个输出tile恰好一个拥有者4h →
按输出tile划分工作,验证覆盖、负载和tile编号。
- 07DPRINT、Watcher与profiling:先找到停在哪一页4h →
为单核pipeline设置少量可解释观测点。
- 08同一矩阵,两层实现:完成可追问的答辩4h →
比较TTNN与自己理解/修改的Metalium路径,不把模型夸成设备经验。
cerebras
算法拆到多个 PE 后,局部结果怎样合起来?
计算和局部存储分布在 PE 上,布局、fabric 通信与 host/device 协调成为算法的一部分。
贯穿练习:用明确输入推演局部和、前缀传播与输出;区分数学模型、功能模拟和真实设备行为。
本书依据公开资料独立编写,不包含私有 SDK 项目文件或运行结果。CPU 模型不是 WSE simulator。
四章基础讲解
- 45WSE 与 PE:把数据放在拥有它的计算节点旁边进入章节 →
三个PE各有两项数据,怎样得到一个全局结果?
- 46CSL 与 host:装载、启动、回读是一份共同合同进入章节 →
为什么一个局部函数还不构成可运行的设备程序?
- 47多PE scan:消息里到底应该传什么进入章节 →
局部前缀和怎样变成保持原顺序的全局前缀和?
- 48功能模型、simulator 与硬件:分别证明什么进入章节 →
测试全绿之后,哪些结论仍然不能写?
八个进阶实践单元 · 额外 32h
- 01Cerebras环境分层:先写CPU合同,再核对SDK路径4h →
把Apple Silicon、Linux容器、官方simulator与硬件分别记录;用2×3 GEMV建立第一份oracle。
- 02单PE闭环:导出符号、启动与回读4h →
写清layout、PE代码和Python host的责任,以一个小GEMV连通整个生命周期。
- 03Host输入与布局:两次调用不能串结果4h →
把输入移到host,明确传输元素数、符号可写性与每次调用的初始化。
- 04Memory DSD:把地址序列写出来4h →
从标量GEMV过渡到列访问DSD;用重复调用检查offset和累加器复位。
- 05多个PE先各算一份:打包顺序必须可见4h →
从同任务复制过渡到不同输入,验证PE矩形、每PE元素数和回读顺序。
- 06两PE列分块:从局部贡献到fabric完成4h →
把一个2×4 GEMV拆到左右两PE,连接路由、队列和异步完成任务。
- 07把消息传下去:三PE scan与空分区4h →
从两PE发送/接收扩展成一条链;用空分区与缺失消息验证协议进度。
- 08复现与答辩:说清每个结果在哪儿运行4h →
冻结一份窄范围的GEMV与scan训练包,用反例、来源与运行身份完成英文答辩。
三个共同的追问
- 输入规模不能整除工作单元时,边界元素由谁处理?
- 生产者写完后,消费者凭什么知道数据已经可见?
- 你测的是计算、传输、排队,还是完整请求时间?