TENSTORRENT / LAB 02 OF 08
从 host 到 TTNN:逻辑形状与物理 tile
将同一小矩阵嵌入32×32,验证转换和完整输出。
本单元 4 小时。本公司八个单元共 32h,三家公司共额外 96h 核心实践;这笔时间在共同路线之外,未压入厂商入门的44h。
本页是实践讲义。打开、阅读或复制命令不代表完成。新单元的 SDK、simulator 与硬件命令均未在教材建设中执行;自己的结果应按实际后端保存。
先备与马上可用的例子
先完成:tenstorrent-01 →
- 37-b · 边缘tile的逻辑与覆盖数量:先看输入和实际源码,再开始自己的修改;教学实现与自己的产出分别记录。
- 38-a · 整段操作与分块操作:先看输入和实际源码,再开始自己的修改;教学实现与自己的产出分别记录。
直接打开机制图,边看边手推
- 33 · 可改条件的机制图 → Host/device、传输与异步生命周期;图解不执行厂商 SDK。
- 36 · 可改条件的机制图 → Tensor shape、stride 与 GEMM 分块;图解不执行厂商 SDK。
- 41 · 可改条件的机制图 → Tensix 与 tiles:先安排数据,再安排计算;图解不执行厂商 SDK。
PREDICT FIRST
具体问题与独立预期
输入与约定
把2×3的A与3×2的B放在32×32全零矩阵左上角,其他位置为0。
先根据输入写下自己的结果与理由,再展开参考推演;随后运行或检查实现。
对照参考结果与原因
输出左上2×2为 [[4,5],[10,11]];其余输出为0。有效结果4项,物理输出1024项。
填零使新增乘积全为0,所以不会改变有效区域;这不是把2×2教学 tile 冒充真实 Tensix tile。
机制怎样连接起来
逻辑形状回答用户需要什么,物理形状回答这次算子实际接收什么。本单元主动填充到32×32,避免把自动padding和裁剪当作不可见魔法。用小整数降低数值干扰,并对完整物理输出做比较。
下面是基于已核对公开API独立写的 TTNN 起点,尚未在 TTNN 环境执行。它通过 from_torch 进入 tile layout,通过 matmul 计算,再 to_torch 回到 host;它没有实现 Metalium reader/compute/writer,因此不能当作底层 kernel 开发证明。
CPU 路径不用安装 torch;用普通二维数组构造同样的32×32填零输入和结果。真实 TTNN 路径需要匹配设备与已安装软件,失败时保留 API、版本和 traceback,不通过更换无限多配置掩盖基本错误。
CHOOSE ONE EXECUTION PATH
按手头环境推进
CPU 路径可以先完成。额外的 SDK 或设备验证要有自己的运行记录;本单元的四小时不同时要求完成四个分支。安装等待超过本页预算时,留下阻塞条件,继续可做的数学、代码与协议工作。
CPU · 现有机器 · 本单元尚未验收
条件:现有 macOS 或 Linux;C++20 编译器或 Python 3 标准库。无需加速卡。
本分支做什么:标准库二维数组完成相同填零与比较。
保存什么证据:保存自己的源码、输入、实际 stdout/stderr 和退出码;只证明 CPU 逻辑。
教材初始执行状态:not-executed。这不是对你个人学习进度的判断。
SDK · 编译与环境 · 本单元尚未验收
条件:已有匹配发行版的 TT-Metalium/TTNN Linux 开发环境。
本分支做什么:核对 from_torch/matmul/to_torch API,缺硬件时只阅读和检查代码。
保存什么证据:保存实际工具版本与编译命令;仅编译成功不能记成运行通过。
教材初始执行状态:not-executed。这不是对你个人学习进度的判断。
官方 simulator · 本单元尚未验收
条件:只有明确提供并且版本匹配的官方 simulator 才属于此分支。
本分支做什么:CPU填零模型不是TTNN simulator。
保存什么证据:记录 simulator 名称、版本、输入、日志、退出状态;网页或 CPU 模型不算 simulator。
教材初始执行状态:not-executed。这不是对你个人学习进度的判断。
真实设备 · 本单元尚未验收
条件:用户已有并可使用的兼容设备或实验室环境;本单元不要求购买、租用或提交集群作业。
本分支做什么:在既有设备执行本页起点,并保存完整shape、dtype和数值检查。
保存什么证据:真实设备输出、同步点、设备型号和复现日志单独保存;未执行保持未通过。
教材初始执行状态:not-executed。这不是对你个人学习进度的判断。
READ → BUILD → BREAK → EXPLAIN
四小时,留下一个完整产出
可拆成多个时段。每次停下时保存代码、输入、实际结果和下一步,不用重新读整篇。没有通过当前检查时继续修正,不靠翻页推进。
1. 标坐标 · 30 分钟
- 在第37章机制图逐步看 A(m,k)、B(k,n) 和 C(m,n)。
- 手画有效区2×3/3×2/2×2以及外围填零区。
这一段的产出:逻辑与物理 shape 图
2. 建立映射 · 40 分钟
- 给四个有效 C 元素写出具体乘积项。
- 计算32×32每矩阵1024元素;bfloat16 payload 每矩阵2048 bytes,但这不等于总搬运流量。
这一段的产出:坐标与payload表
3. 执行所选分支 · 90 分钟
- CPU 路径用标准库列表实现填零和三重循环,完整检查1024项。
- 已有 TT 设备时将下方代码保存为 tt_matmul.py 并在匹配 venv 中执行;保留实际日志。
- 先保留声明的0.01绝对/相对容差,不因失败直接放大;定位 dtype/layout/shape。
这一段的产出:完整输出验证
4. 一个改动与一个错误 · 50 分钟
- 把 A[0,0] 从1改为2,新的 C 左上行应为[5,5];同时更新独立 oracle。
- CPU 模型故意让 padding 的 A[0,3]、B[3,0] 都为1,确认 C[0,0] 多1。
- 回读后比较整个矩阵,避免裁剪掩盖 padding 污染。
这一段的产出:变体与填充故障
5. 讲清抽象层 · 30 分钟
- 解释 TTNN 帮你完成哪些步骤,哪些底层内容还未实现。
- 记录实际验证后端,作为后续 Metalium 对照。
这一段的产出:TTNN 结果包
EXPLICIT ENVIRONMENT / EXPLICIT STATUS
命令与可保存的起点
以下代码按各自环境使用,运行前完成对应步骤并核对版本。编译失败后停止,不运行目录中的旧二进制;每次采集日志使用新的运行目录。设备程序仅运行在你已有且可使用的环境中。
1. 原创 TTNN 起点;保存为 tt_matmul.py,未在设备执行
环境:真实设备 · 状态:not-executed。核对官方 API / 工具说明 ↗
import torch
import ttnn
# Original small problem embedded in a 32x32 physical shape.
a = torch.zeros((32, 32), dtype=torch.float32)
b = torch.zeros((32, 32), dtype=torch.float32)
a[:2, :3] = torch.tensor([[1., 2., 3.], [4., 5., 6.]])
b[:3, :2] = torch.tensor([[1., 0.], [0., 1.], [1., 1.]])
expected = a @ b
device = ttnn.open_device(device_id=0)
try:
da = ttnn.from_torch(a, dtype=ttnn.bfloat16, layout=ttnn.TILE_LAYOUT, device=device)
db = ttnn.from_torch(b, dtype=ttnn.bfloat16, layout=ttnn.TILE_LAYOUT, device=device)
dc = ttnn.matmul(da, db)
actual = ttnn.to_torch(dc).to(torch.float32)
torch.testing.assert_close(actual, expected, atol=0.01, rtol=0.01)
print(actual[:2, :2])
finally:
ttnn.close_device(device)
一个必须能解释的错误
错误情境:把 row-major 数据直接当成 tiled 数据解释,或只比较输出前四个连续元素。
为什么会错:tile 编码顺序与逻辑行列不同;有效2×2在32列矩阵中也不是简单前4项。
怎样修复:明确每次布局转换,并按[i,j]取有效区域,同时检查全部物理输出。
EVIDENCE BEFORE ADVANCING
验收与面试追问
- 修改后 C=[[5,5],[10,11]],剩余输出0。
- 实际tile尺寸和教学图2×2明确区分。
- 保存所有输出的比较结论,不只截取左上角打印。
最后留下这几项
输入和预期、自己的源码或明确标为推演的状态表、实际命令/输出/退出码、一个失败与修复、后端与版本、尚未执行的部分。运行已有教学例子与独立完成修改分别记录。
1. 为什么填零不改变有效结果?
对照中文要点与英文回答
扩展K上的A或B乘积均为0;原有K=3的三项乘积保持。
All products in the padded K region are zero, so the original three-term dot products are unchanged.
2. to_torch 之后为什么仍记录shape?
对照中文要点与英文回答
转换后要确认得到的是预期物理/逻辑形状,不能凭打印外观推断。
I verify the returned shape and compare the complete result, rather than trusting a small printed slice.
3. 这个程序证明你写了 Metalium kernel 吗?
对照中文要点与英文回答
没有,它证明的是使用TTNN组织host张量、调用算子和验证结果的实际工作。
This is a TTNN integration experiment. It does not claim a hand-written Metalium kernel.
这些是依照本单元机制设计的追问,不是公司真题。个人验收仍依据实际代码、测试、测量与口述。
资料与版本核验
- TTNN basic tensor operations ↗
Host tensor conversion and creation
核验日期:2026-09-05。latest;以安装的 ttnn 版本和同一 tag 的 API 定义核对布局/dtype。
- TTNN matrix multiplication ↗
Open device; tensor configuration; matmul; close device
核验日期:2026-09-05。latest;记录 ttnn 包版本、设备、memory_config 与 compute config。
- ttnn.matmul API ↗
Tiled inputs; dtype; program-dependent memory support
核验日期:2026-09-05。latest;未把文档列出的不同 dtype/config 当成所有设备都支持。
- ttnn.to_torch API ↗
Device tensor conversion to host torch tensor
核验日期:2026-09-05。latest;使用前核对安装版本签名。
正文、问题和实践设计依据公开资料独立撰写。官方页面的示例输出是资料中的结果,不是本机运行证据。latest 链接可能变化,请在自己的复现说明中保留实际版本。