TENSTORRENT / LAB 03 OF 08
DRAM→L1→DRAM:不计算,先证明搬对了
给每个tile编号,定位数据移动、打包和回读错误。
本单元 4 小时。本公司八个单元共 32h,三家公司共额外 96h 核心实践;这笔时间在共同路线之外,未压入厂商入门的44h。
本页是实践讲义。打开、阅读或复制命令不代表完成。新单元的 SDK、simulator 与硬件命令均未在教材建设中执行;自己的结果应按实际后端保存。
先备与马上可用的例子
先完成:tenstorrent-02 →
- 39-a · 容量二的FIFO回绕:先看输入和实际源码,再开始自己的修改;教学实现与自己的产出分别记录。
- 40-a · 两组reader/compute/writer:先看输入和实际源码,再开始自己的修改;教学实现与自己的产出分别记录。
直接打开机制图,边看边手推
- 33 · 可改条件的机制图 → Host/device、传输与异步生命周期;图解不执行厂商 SDK。
- 41 · 可改条件的机制图 → Tensix 与 tiles:先安排数据,再安排计算;图解不执行厂商 SDK。
- 43 · 逐步状态与文字图解 → Reader、compute、writer:缓冲区里的生产与消费;图解不执行厂商 SDK。
PREDICT FIRST
具体问题与独立预期
输入与约定
CPU模型有两个32×32逻辑tile:T0[r,c]=r,T1[r,c]=100+c;每项先用int表示。
先根据输入写下自己的结果与理由,再展开参考推演;随后运行或检查实现。
对照参考结果与原因
T0[31,7]=31,T1[3,31]=131;往返后每项保持不变。模型2048个int32共8192 bytes,只算payload。
不做乘法时,错误不能归因于累加;每个tile独特的行/列模式能暴露顺序和坐标颠倒。
机制怎样连接起来
这个单元把矩阵乘法里的数据路径单独拿出来:host 准备、进入 DRAM、搬到 L1、写回 DRAM、回到 host。将路径每一段的源地址、目标地址、字节数和完成条件写成表。
CPU模型用两个普通数组模拟两种存储,逐项复制与比较,不执行NoC。真实Metalium分支先运行匹配发行版的DRAM loopback,再把输入初始化改为可识别模式;沿完整源码检查格式和页大小,不能把int32模型的8192 bytes套到bfloat16设备缓冲。
给第一处出现差异的位置命名,比在最终比较失败后盲改kernel更有效。若host原始输入已错,设备不会替你修正;若untilize之后才变错,需回到布局转换路径。
CHOOSE ONE EXECUTION PATH
按手头环境推进
CPU 路径可以先完成。额外的 SDK 或设备验证要有自己的运行记录;本单元的四小时不同时要求完成四个分支。安装等待超过本页预算时,留下阻塞条件,继续可做的数学、代码与协议工作。
CPU · 现有机器 · 本单元尚未验收
条件:现有 macOS 或 Linux;C++20 编译器或 Python 3 标准库。无需加速卡。
本分支做什么:显式数组往返,完整逐项检查。
保存什么证据:保存自己的源码、输入、实际 stdout/stderr 和退出码;只证明 CPU 逻辑。
教材初始执行状态:not-executed。这不是对你个人学习进度的判断。
SDK · 编译与环境 · 本单元尚未验收
条件:已有匹配发行版的 TT-Metalium/TTNN Linux 开发环境。
本分支做什么:从匹配tag的loopback源码确认构建目标和数据格式;不拼接其他版本API。
保存什么证据:保存实际工具版本与编译命令;仅编译成功不能记成运行通过。
教材初始执行状态:not-executed。这不是对你个人学习进度的判断。
官方 simulator · 本单元尚未验收
条件:只有明确提供并且版本匹配的官方 simulator 才属于此分支。
本分支做什么:CPU路径仅为存储/索引模型,不证明NoC事务正确。
保存什么证据:记录 simulator 名称、版本、输入、日志、退出状态;网页或 CPU 模型不算 simulator。
教材初始执行状态:not-executed。这不是对你个人学习进度的判断。
真实设备 · 本单元尚未验收
条件:用户已有并可使用的兼容设备或实验室环境;本单元不要求购买、租用或提交集群作业。
本分支做什么:先原版loopback,再自己的模式输入;保留来源和修改范围。
保存什么证据:真实设备输出、同步点、设备型号和复现日志单独保存;未执行保持未通过。
教材初始执行状态:not-executed。这不是对你个人学习进度的判断。
READ → BUILD → BREAK → EXPLAIN
四小时,留下一个完整产出
可拆成多个时段。每次停下时保存代码、输入、实际结果和下一步,不用重新读整篇。没有通过当前检查时继续修正,不靠翻页推进。
1. 建立可识别输入 · 30 分钟
- 实现两个tile的行/列模式,检查本页两处坐标。
- 另测T0[0,31]=0和T1[31,0]=100。
这一段的产出:四处手算检查
2. 写路径表 · 40 分钟
- 逐段列存储位置、格式、元素数、字节数和完成条件。
- 注明CPU int32 payload与设备选定dtype payload分别是多少。
这一段的产出:数据路径表
3. 做往返 · 90 分钟
- CPU路径实现host→dram→l1→dram_out→host_out的显式复制,完整比较2048项。
- 设备路径在已选tag的loopback目录读README和源码,用该版构建命令运行baseline;再在自己的副本修改输入模式与oracle。
- 记录首个差异的tile/r/c/expected/actual;不只比较总和。
这一段的产出:loopback实现与逐项结果
4. 注入布局错误 · 50 分钟
- CPU模型交换T0和T1,确认总元素数相同仍会失败。
- 再交换每tile的r/c索引,观察单独列或行样本为什么不够。
- 修复并加入0 tile、1 tile、2 tile的CPU接口测试;设备支持条件单独核对。
这一段的产出:交换与转置回归
5. 连接回matmul · 30 分钟
- 说明为什么输入错位可以产生看似合理的乘法结果。
- 列下一单元哪些buffer会变成CB。
这一段的产出:数据移动诊断说明
EXPLICIT ENVIRONMENT / EXPLICIT STATUS
命令与可保存的起点
以下代码按各自环境使用,运行前完成对应步骤并核对版本。编译失败后停止,不运行目录中的旧二进制;每次采集日志使用新的运行目录。设备程序仅运行在你已有且可使用的环境中。
这个单元复用前一单元的项目文件,并按上面的具体任务修改。对应章节例子的源码、编译命令和预期输出在本页先备链接里;不要把例子自己的固定成功判定遗留到已改输入的版本中。
一个必须能解释的错误
错误情境:只比较往返数据的总和。
为什么会错:交换tile或转置不改变总和,仍可能完全破坏矩阵坐标。
怎样修复:逐元素比较并报告首个错误坐标,选能区分行列的输入。
EVIDENCE BEFORE ADVANCING
验收与面试追问
- 四个具体坐标与2048项逐项检查都存在。
- CPU int32与硬件dtype账本分开。
- 交换tile和转置都被测试识别。
最后留下这几项
输入和预期、自己的源码或明确标为推演的状态表、实际命令/输出/退出码、一个失败与修复、后端与版本、尚未执行的部分。运行已有教学例子与独立完成修改分别记录。
1. 为什么一个总和不够检查数据移动?
对照中文要点与英文回答
排列错误保留总和;matmul需要每个值出现在正确坐标。
A permutation can preserve the sum while corrupting every logical coordinate.
2. 复制提交之后能立刻消费L1吗?
对照中文要点与英文回答
必须满足相应完成与发布条件;提交本身不说明数据已经可用。
The consumer needs a completion and publication guarantee, not just a submitted transfer.
3. 为什么先用loopback?
对照中文要点与英文回答
去掉计算变量后,可以集中定位地址、长度、格式和完成条件。
Loopback isolates addressing, length, layout and completion from arithmetic.
这些是依照本单元机制设计的追问,不是公司真题。个人验收仍依据实际代码、测试、测量与口述。
资料与版本核验
- DRAM Loopback ↗
DRAM/L1 buffers; data movement; result verification
核验日期:2026-09-05。latest;源码目录 tt_metal/programming_examples/loopback;运行以选定 tag 的构建说明为准。
- Matmul Single Core ↗
Tile indexing; reader/compute/writer; enqueue and verification
核验日期:2026-09-05。latest;记录 build_metal.sh 选项及源码 commit;页面代码片段不能替代完整匹配版本源码。
正文、问题和实践设计依据公开资料独立撰写。官方页面的示例输出是资料中的结果,不是本机运行证据。latest 链接可能变化,请在自己的复现说明中保留实际版本。