mlir中tensor类型形状必须用小写x连接维度、无空格逗号,动态维用*仅限外层,标量为tensor无括号,reshape后需显式cast更新类型。

张量形状直接写在 tensor 类型后,用 和 <code>> 包裹,维度间用 x 连接,不能用逗号或空格
tensor 是标准写法,不是 tensor
MLIR 的 tensor 类型中,形状与元素类型紧贴,中间无空格,维度分隔符必须是小写字母 x(不是 *、, 或 ×):
-
tensor✅ 正确:2 行 × 3 列的 f64 张量 -
tensor❌ 解析失败:逗号不被接受 -
tensor❌ 错误符号:Unicode 乘号×不合法 -
tensor❌ 空格破坏语法:类型字符串中不允许空格
动态维度用 * 表示,但仅限最外层或特定位置
* 表示运行时已知、编译期未知的维度大小,但它有约束:
-
tensor✅ 合法:一维动态张量 -
tensor✅ 合法:第一维动态、第二维固定为 3 -
tensor✅ 合法(Toy dialect 支持),但某些 dialect(如 Linalg)可能要求动态维只能在最前 -
tensor❌ 多数 dialect 拒绝:连续多个*通常不被支持
注意:* 不代表“任意维”,它只表示“该位置维度大小未定”,且 shape 推导仍需满足操作语义(例如 matmul 要求最后两维可收缩)。
rank-0 张量(标量)写作 tensor,不带 和数字
零维张量即标量,在 MLIR 中直接省略形状括号:
-
tensor<f64></f64>✅ 正确:标量 -
tensorf64>❌ 语法错误:空尖括号非法 -
tensor❌ 不等价:这是 1 元素一维张量,不是标量;二者在语义和 lowering 中行为不同(如内存布局、广播规则)
Toy dialect 明确区分 tensor<f64></f64>(标量)和 tensor(向量),混用会导致类型检查失败或运行时越界。
形状推导失败常见于 reshape 或 transpose 后未显式标注
MLIR 不自动传播形状——即使你用 toy.reshape 把 tensor 变成 2x3,结果类型仍是 tensor,除非你显式 cast 或用 dialect 支持的 shape-refinement pass:
- Toy dialect 中,
var b = [1,2,3,4,5,6];会生成tensor,因为类型声明强制了 shape - 但
%b = toy.reshape(%a) : tensor to tensor之后,若下游操作(如matmul)需要确切 shape,就会报错 “operand type mismatch” - 解决方法:加
tensor.cast或用linalg.tensor_reshape(它要求目标 shape 作为属性传入)
最容易被忽略的是:tensor 类型的 shape 是类型系统一部分,不是 metadata;改 shape 必须改类型,不能只改值。











