BlockMxScaleTensorViews Pass¶
概述¶
BlockMxScaleTensorViews 把逻辑 MX scale tensor view 转换为 A5 所要求的
rank-5 SFractal 紧致形式,并改写所有坐标依赖这一物理形式的操作。
这里是一次物理 view lowering 的迁移:原先后端中的
EmitMxPhysicalView 专用逻辑被迁移到显式 IR pass。此后 tensor type、load
窗口、别名、stride 物化、验证器与通用 codegen 都只看到同一种规范表示;
codegen 不再私下重建另一套 MX view。
本 pass 与 BlockNzTensorViews 相互独立。MX 与 NZ 是不同 layout,转换和证明
实现也分别维护。
物理形式¶
DSL 暴露两种逻辑 rank-2 scale layout:
末尾 [16, 2] 是一个 32 字节 FP8E8M0 scale box。对分块 shape 求行主序
stride 就得到物理 GlobalTensor stride,因此本 pass 之后
MaterializeTensorStrides 可以直接使用普通紧致 stride 路径。
在流水线中的位置¶
... -> FlattenTileNdTo2D -> BlockNzTensorViews
-> BlockMxScaleTensorViews -> LegalizeTileCast -> ...
本 pass 在 FlattenTileNdTo2D 之后运行,此时 tile.load 的结果已经是逻辑
2-D tile;它位于所有要求物理 MX tensor shape 的消费者之前。
MaterializeTensorStrides 随后填入 rank-5 行主序 stride。
改写内容¶
对每个 MX_A_ZZ 或 MX_B_NN tensor,本 pass 改写:
- 参数、返回值、tuple、变量、迭代参数、Call 与 Submit 中递归出现的
TensorType槽位; tile.load的 offset 和 shape,使其使用 rank-5 坐标;- 物理
valid_shape参数,使其保持完整对齐 load box,同时把缩窄的逻辑TileType.valid_shape保留为 tile 元数据; - 两个方向的 FP8E8M0 有 shape
tensor.view别名:ND-to-MX 与 MX-to-ND; - Submit 返回类型,同时保持依赖、关键字参数、属性、core 数、predicate 和同步字段不变。
load 的目标 TileType 仍是逻辑 2-D;只有 GM 源分区变为 rank-5。
Offset 映射与证明¶
逻辑坐标映射如下:
常量必须非负且对齐。符号 offset 只有在本 pass 私有的 MX 证明引擎同时证明 整除性与非负性后才会被接受。证明引擎支持:
- scalar SSA 定义;
- 常量、乘法、加法,以及用于整除证明的减法;
- 正的 2 的幂 floor division,包括
k0 // 32; - start 与 step 为常量的循环变量;
tile.get_block_idx和tile.get_block_num的非负结果;- 经每个 Call 与 Submit 调用点传播的 scalar 参数。
callee 参数必须在每一个 caller 中都可证明。调用映射缺失或畸形、递归,以及超出 256 步有界证明预算的表达式都会被保守拒绝。该上界使 pass 保持 O(N),且证明失败 绝不会退化成“假定已对齐”。
商以 FloorDiv(offset, divisor) 发出,保证原定宽表达式先按原语义求值,再做除法。
范围与诊断¶
| 条件 | 结果 |
|---|---|
| 静态、对齐的 rank-2 MX shape | 转换为规范 rank-5 形式 |
| 对齐且可证明非负的符号 offset | 转换为 rank-5 坐标 |
| 无法证明或为负的 offset | 拒绝 |
tensor 级部分 valid_shape |
拒绝 |
load 级缩窄 valid_shape |
保留为 tile 元数据;物理 box 仍完整 |
原始 IR 中 target_memory != Mat 或缺失 |
拒绝;公开 pl.load 会将省略的 target 补为 Mat |
| MX tensor 被不支持的算子使用或作为 store 目标 | 拒绝 |
| 有 shape 的 FP8E8M0 ND/MX backing alias | 改写 |
| distributed MX tensor | 拒绝 |
pass 完成后会给函数写入 mx_tensor_views_blocked 属性。这一来源标记使第二次运行
直接成为 no-op,无需从可能碰巧长得像分块形式的 shape 猜测 pass 是否已经执行。