TLA DSL Kernel API 参考
本文档介绍 TLA DSL 的 kernel 侧 Core API(通常以 import catlass.tla as tla 导入)。
内容覆盖基本数据类型、计算与同步接口、片上资源管理以及调试打印。Host 侧编译 / 启动 / tensor 绑定见 Host API 参考;DLPack 接入教程见 Host Tensor 接入。
接口说明与调用示例来自各 op 源码 docstring;所有接口均须在 @tla.kernel 装饰的
kernel 函数体内调用。
目录
基本数据类型与操作
Shape / Coord / Stride / Layout / Tensor 等前端结构化值的构造与视图,以及指针相关辅助接口。
make_shape
源码: catlass.core_api.make_shape
功能说明:
构造打包的 !tla.shape,分量可为嵌套 tuple。
函数原型:
tla.make_shape(*components: IndexTree) -> TlaShape
参数说明:
components(IndexTree):shape 各维分量。zN/nZ/L0Clayout/zNUnAlign的物理布局用嵌套 tuple。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 至少提供 1 个 shape 分量。
- RowMajor / ColumnMajor:用二维 shape
(M, N)。 zN/nZ/L0Clayout/zNUnAlign:在make_layout/make_tensor中要用嵌套物理 shape((m0, m1), (n0, n1))。 只写二维(M, N)不合法;请改成嵌套,或优先用make_tensor_like(..., layoutTag=zN)(由逻辑二维origin_shape自动换算)。
调用示例:
# RowMajor / ColumnMajor(逻辑二维):
shape = tla.make_shape(256, 128)
# zN 物理 shape(f16,逻辑 128x64):
# m0=16,m1=8(=128/16);n0=16,n1=4(=64/16)
zn_shape = tla.make_shape((16, 8), (16, 4))
make_coord
源码: catlass.core_api.make_coord
功能说明:
构造打包的 !tla.coord。
函数原型:
tla.make_coord(*components: IndexTree) -> TlaCoord
参数说明:
components(IndexTree):coord 各维分量。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 至少提供 1 个 coord 分量。
调用示例:
coord = tla.make_coord(block_row, 0)
make_stride
源码: catlass.core_api.make_stride
功能说明:
构造打包的 !tla.stride(嵌套规则与 make_shape 相同)。
函数原型:
tla.make_stride(*components: IndexTree) -> TlaStride
参数说明:
-
components(IndexTree):stride 各维分量。必填。常见写法:
布局 典型 make_stride(...)含义 RowMajor 二维 (M, N)(N, 1)行方向每次跨 N个元素;列方向跨 1ColumnMajor 二维 (M, N)(1, M)行方向跨 1;列方向每次跨 M个元素zN/nZ/ …嵌套 ((s00, s01), (s10, s11))与物理 shape同结构;数值须匹配对应 layout对
zN/nZ/L0Clayout/zNUnAlign:一块 C0 是 32 字节, M 方向分块大小是 16。记每块C0元素数 = 32 // sizeof(dtype)(f16→16,f32→8),每分块元素数 = 每块C0元素数 * 16。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 至少提供 1 个 stride 分量。
- 对
zN/nZ/L0Clayout/zNUnAlign,stride 数值须匹配 layout(见示例);make_tensor会按shape+layoutTag检查。
调用示例:
# RowMajor 二维(逻辑 256x128,紧凑存放):
stride = tla.make_stride(128, 1)
# f16 zN,逻辑尺寸 (128, 64):
# shape = ((16, 8), (16, 4))
# stride = ((每块C0元素数, 每分块元素数),
# (1, 向上取整到16的M * 每块C0元素数))
# = ((16, 256), (1, 2048))
zn_stride = tla.make_stride((16, 256), (1, 2048))
# f16 nZ,同一逻辑 (128, 64):
# shape = ((16, 8), (16, 4))
# stride = ((1, 向上取整到16的N * 每块C0元素数),
# (每块C0元素数, 每分块元素数))
# = ((1, 1024), (16, 256))
nz_stride = tla.make_stride((1, 1024), (16, 256))
make_layout
源码: catlass.core_api.make_layout
功能说明:
由 shape / stride 合成 !tla.layout(对应 tla.make_layout)。
函数原型:
tla.make_layout(shape: _Shape, stride: _Stride, *, origin_shape: _Shape | None = None, layoutTag: _LayoutTag | None = None) -> TlaLayout
参数说明:
shape(_Shape):布局 shape,由tla.make_shape构造。必填。 RowMajor / ColumnMajor:二维(M, N)。zN/nZ/L0Clayout/zNUnAlign:嵌套((m0, m1), (n0, n1))。stride(_Stride):布局 stride,由tla.make_stride构造。必填。 嵌套形态须与shape一致。origin_shape(_Shape | None):逻辑工作尺寸(对齐前的真实数据大小)。 可选,默认None。拷贝 / 切块按该逻辑尺寸;物理存放方式在shape/stride。layoutTag(_LayoutTag | None):布局标签(如tla.arch.RowMajor、tla.arch.zN)。可选,默认None(RowMajor)。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 shape/stride须为make_shape/make_stride的返回值。- RowMajor / ColumnMajor 省略
origin_shape时推断为shape;zN/nZ/L0Clayout/zNUnAlign则从shape=((m0,m1),(n0,n1))推断为(m0*m1, n0*n1)。 - 不要给
zN/nZ/L0Clayout/zNUnAlign配普通二维shape,检查会失败。请写嵌套物理 shape,或用make_tensor_like(ptr, like, layoutTag=...)由like.origin_shape自动换算。
调用示例:
# RowMajor 二维:
layout = tla.make_layout(
tla.make_shape(256, 128),
tla.make_stride(128, 1),
layoutTag=tla.arch.RowMajor,
)
# 显式 f16 zN(逻辑 128x64 → 嵌套物理 + 二维 origin):
# 前:逻辑 ND tile 为 (128, 64)。
zn = tla.make_layout(
tla.make_shape((16, 8), (16, 4)),
tla.make_stride((16, 256), (1, 2048)),
origin_shape=tla.make_shape(128, 64), # 拷贝/切块用的逻辑尺寸
layoutTag=tla.arch.zN,
)
# 后:layout.shape 为 zN 打包;layout.origin_shape 仍为 (128, 64)。
make_layout_with_tag
源码: catlass.core_api.make_layout_with_tag
功能说明:
由扁平二维逻辑 shape、元素类型与 layout tag 直接合成 !tla.layout
(前端重映射物理树后对应 tla.make_layout)。
make_layout_with_tag 直接采用调用方给出的 extent,因此片上 tile 可以
大于为其供数的 GM tile(例如 MX mmad 将 K 向上取整到 64)。
函数原型:
tla.make_layout_with_tag(shape: tuple, dtype: Any, layoutTag: _LayoutTag | None = None) -> TlaLayout
参数说明:
shape(tuple):扁平二维逻辑 extent(rows, cols)。每个叶子为int或运行时Numeric(动态叶子)。必填。dtype(Numeric子类):元素类型;决定重映射物理树的 C0/分块几何。必填。layoutTag(_LayoutTag | None):布局标签(如tla.arch.zN)。 可选,默认None(RowMajor)。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 仅用于片上 tensor 布局:合成后的 layout 应通过
tla.make_tensor(ptr, layout)落到片上指针,而不是绑定 GM Host 内存。 shape必须是扁平二元组;嵌套树与None叶子会被拒绝——整个 extent 由调用方拥有。- 结果 layout 的 origin shape 等于
shape(对齐后的 extent);配合tla.make_tensor(ptr, layout)落到片上指针。 - 仅片上 tag:
zZMxScale/nNMxScale要求元素类型tla.Float8E8M0(其 C0 由 e8m0 格式固定为 2 元素 / 32 字节)。GM 侧 MxScale tag (RowMajorMxScaleA、ColMajorMxScaleA、RowMajorMxScaleB、ColMajorMxScaleB)会被拒绝。
调用示例:
# fp8 zN tile:M 运行时裁剪,K 向上取整到 64:
lay = tla.make_layout_with_tag((m_valid, k_l0), dtype_a, tla.arch.zN)
t_l1a = tla.make_tensor(l1a, lay)
tile_view
源码: catlass.core_api.tile_view
功能说明:
在 !tla.tensor 源上按 tile 坐标粒度创建 tile 视图。
函数原型:
tla.tile_view(source: Tensor, shape: _Shape, coord: _Coord) -> TlaTensor
参数说明:
source(Tensor):源!tla.tensor。必填。shape(_Shape):tile 形状,由tla.make_shape构造。必填。coord(_Coord):tile 坐标,由tla.make_coord构造(tile 粒度)。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 coord以 tile 粒度传入,前端会按shape换算为元素偏移。
调用示例:
tile = tla.tile_view(
source, tla.make_shape(256, 128), tla.make_coord(block_row, 0)
)
get_tile
功能说明:
从 tensor 抽取子 tile,基于源的底层指针用 tla.make_tensor 构造新的
!tla.tensor。
返回的 tensor 共享源的 buffer 几何——stride 树原样透传——并携带:
coord:coord + source.coord(各维元素偏移);origin_shape:相对源origin_shape裁剪后的shape(各维min(shape[d], origin[d] - coord[d])),保证 tile 不会越过 源的逻辑范围;shape:按裁剪后的 extent 重新生成的物理打包(zN/nZ 与make_layout_with_tag相同的分块分解;RowMajor/ColumnMajor 则为 extent 本身)。
下游看到的是该 tile 的绝对坐标与自身逻辑范围;例如对结果调用
Tensor.fill 只会填充这个 tile。
函数原型:
tla.get_tile(tensor: Tensor, coord: TlaCoord, shape: TlaShape) -> TlaTensor
参数说明:
tensor(Tensor):源!tla.tensor。必填。coord(TlaCoord):由tla.make_coord得到的起点,相对源的扁平 二维元素偏移。必填。shape(TlaShape):由tla.make_shape得到的请求 tile extent, 扁平二维。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 coord偏移必须落在源的origin_shape内——裁剪只缩短 extent, 不会钳制偏移。- 支持的 layout tag 与
tla.make_tensor一致(RowMajor、ColumnMajor、 zN、nZ、L0Clayout、zNUnAlign)。
调用示例:
# 将 L1 A tile 的 K-pad 尾部清零(见 Tensor.fill):
pad = tla.get_tile(t_l1a, tla.make_coord(0, k_valid),
tla.make_shape(m, k_l0 - k_valid))
pad.fill(0)
make_tensor
源码: catlass.core_api.make_tensor
功能说明:
由显式指针、layout 与可选 coord 构造 !tla.tensor。
函数原型:
tla.make_tensor(ptr: Pointer, layout: TlaLayout, coord: CoordLike | None = None) -> TlaTensor
参数说明:
ptr(Pointer):底层数据指针(!tla.ptr)。必填。layout(TlaLayout):tensor 布局,由tla.make_layout构造。必填。coord(CoordLike | None):可选起始坐标;缺省视为零坐标。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 指针、layout、coord 须匹配目标地址空间与 dtype。
coord缺省为零坐标,秩与 layout 一致(秩 2 →make_coord(0, 0),秩 1 →make_coord(0))。元素类型与地址空间来自ptr的!tla.ptr;layout tag、shape、stride、origin 来自!tla.layout操作数(未给origin_shape时 origin 默认为shape)。- Lowering 支持 RowMajor、ColumnMajor、zN、nZ、L0Clayout、zNUnAlign。
对
zN/nZ/L0Clayout/zNUnAlign,物理shape/stride为嵌套 2×2,逻辑 coord /origin_shape仍是二维(M, N)。若make_layout省略origin_shape,则从物理 shape 推断逻辑尺寸(例如(m0*m1, n0*n1))。 - 完整编译要求
ptr具备底层存储;可运行 kernel 中片上指针的推荐形式是allocate(可选再经recast_ptr)。
调用示例:
tensor = tla.make_tensor(ptr, layout, coord=tla.make_coord(0, 0))
make_tensor_like
源码: catlass.core_api.make_tensor_like
功能说明:
按参考 tile 的结构化元数据,在给定指针上构造同形态 tensor。
函数原型:
tla.make_tensor_like(ptr: Pointer, like: Tensor, layoutTag: _LayoutTag | None = None) -> TlaTensor
参数说明:
ptr(Pointer):目标数据指针。必填。like(Tensor):参考 tile,提供结构化 tensor 元数据。必填。layoutTag(_LayoutTag | None):覆盖参考 tile 的布局标签。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 参考 tile 须提供可用的结构化 tensor 元数据。
- 元素类型来自
ptr的!tla.ptr指向类型;仅接受片上目标指针。
调用示例:
dst = tla.make_tensor_like(ptr, like=src_tile, layoutTag=tla.arch.RowMajor)
make_ptr
功能说明:
由整型位型经 tla.inttoptr 构造指针。
函数原型:
tla.make_ptr(dtype: type[Numeric] | None, value: int | mlir_ir.Value | Numeric, mem_space: AddressSpace = AddressSpace.gm, *, assumed_align: int | None = None) -> Pointer
参数说明:
dtype(type[Numeric] | None):指针指向的元素类型;None表示Int8。可选,默认None。value(int | mlir_ir.Value | Numeric):地址值(整数、mlirValue 或 Numeric)。必填。mem_space(AddressSpace):指针所在地址空间。可选,默认AddressSpace.gm。assumed_align(int | None):假定对齐字节数。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 整型地址位宽须与目标
mem_space匹配。
调用示例:
ptr = tla.make_ptr(tla.Float16, addr, mem_space=tla.AddressSpace.gm)
recast_ptr
源码: catlass.core_api.recast_ptr
功能说明:
仅改变 !tla.ptr 的逻辑元素类型(不做 swizzle)。
函数原型:
tla.recast_ptr(ptr: Pointer, *, dtype: type[Numeric]) -> Pointer
参数说明:
ptr(Pointer):待重解释的指针。必填。dtype(type[Numeric]):新的元素类型。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 仅改变逻辑元素类型,不改变地址与 swizzle。
调用示例:
ptr_f32 = tla.recast_ptr(ptr_f16, dtype=tla.Float32)
标量 Numeric
Numeric 是 TLA DSL 在 @tla.kernel 内使用的标量类型与值的基类。
具体类型包括整数(tla.Int8 / Int16 / Int32 / Int64 及无符号变体)、
浮点(tla.Float16 / BFloat16 / Float32,以及更窄格式)和 tla.Bool。
用类型构造值,例如 tla.Int32(0)、tla.Float32(1.5)。
循环下标、坐标,以及会在运行时 if / tla.range / while 中更新的单元素状态,
请使用 Numeric 值。Python 字面量用 as_numeric 提升;改类型用 Numeric.to;
按位宽重解释用 Numeric.bitcast。
约束说明:
- 优先使用具体类型(
Int32、Float32等)。抽象基类Numeric/Integer/Float不可直接构造。 - 参与设备侧控制流或计算时,须在
@tla.kernel函数体内使用。 - 在运行时
if/tla.range/while中对名字重新赋值时,该值须是Numeric(由as_numeric或具体类型如tla.Int32(...)得到)。普通 Pythonint/float/bool无法作为运行时状态跨过上述控制流。
Numeric.to
源码: catlass.base_dsl.typing.Numeric.to
功能说明:
将标量 Numeric 转换为另一种具体类型。
round_mode 选择浮点转整数(以及部分浮点转浮点)的舍入方式:
ScalarRoundMode.NEAREST_EVEN / NEAREST_AWAY / FLOOR /
CEIL / ODD。省略(或 TRUNC)时,浮点转整数向零截断。
函数原型:
Numeric.to(dtype: Any, *, round_mode: Any = None) -> Any
参数说明:
dtype(type[Numeric] | type[int] | type[float] | type[bool]): 目标类型。具体Numeric子类(如Int32、Float32)得到另一个Numeric; 传入 Pythonint/float/bool时,若值仍是 Host 常量,则提取 Host 侧 Python 标量。必填。round_mode(ScalarRoundMode | None):可选标量舍入模式。可选,默认None。
约束说明:
- 优先在
@tla.kernel函数体内调用。 - 产出 DSL 标量时,
dtype须为具体类型(如Int32/Float32),不能是抽象的Integer/Float/Numeric。 - 此处使用
tla.params.ScalarRoundMode;不要传入tla.params.RoundMode。 - 不支持的源/目标组合会抛出
TypeError。
调用示例:
@tla.kernel
def kernel(n: int) -> None:
x = tla.as_numeric(n).to(tla.Int32)
y = tla.Float32(1.5).to(
tla.Int32, round_mode=tla.params.ScalarRoundMode.FLOOR
)
tla.make_coord(x, y)
Numeric.bitcast
源码: catlass.base_dsl.typing.Numeric.bitcast
功能说明:
将标量 Numeric 的位型重新解释为相同位宽的另一种具体类型(不做数值转换)。
函数原型:
Numeric.bitcast(dtype: type['Numeric']) -> 'Numeric'
参数说明:
dtype(type[Numeric]):相同位宽的具体目标类型。必填。
约束说明:
- 优先在
@tla.kernel函数体内调用。 dtype须为具体Numeric,且与源值位宽相同;否则抛出TypeError/ValueError。- 同类型 bitcast 为 no-op,返回
self。
调用示例:
bits = tla.Float32(1.0).bitcast(tla.Int32)
as_numeric
源码: catlass.base_dsl.typing.as_numeric
功能说明:
将 Python 标量转换为 DSL Numeric。
在运行时控制流(if / tla.range / while / 展开的 DSL with 区域)中更新之前,
或从字面量组装少量固定运行时标量 list/tuple 时,请调用本接口。
映射规则:
- 已是
Numeric的值原样返回; bool→Bool;- 落在有符号 32 位范围内的
int→Int32,否则 →Int64; float→Float32。
函数原型:
tla.as_numeric(obj: Any) -> Numeric
参数说明:
obj(bool | int | float | Numeric):Python 标量或已有Numeric。必填。
约束说明:
- 结果用作运行时状态(控制流重绑定、循环边界等)时,优先在
@tla.kernel函数体内调用。 - 也可在 Host 侧从 Python 标量构造,用于 staging。
- 不接受用户自定义对象与非标量容器;无法转换时抛出
ValueError。
调用示例:
@tla.kernel
def kernel(limit: int) -> None:
index = tla.as_numeric(0)
if limit > 0:
index = index + 1
tla.make_coord(index, 0)
Float.sqrt
源码: catlass.base_dsl.typing.Float.sqrt
功能说明:
标量浮点平方根。
对应 tla.sqrt 的标量形态。在 tla.vec.func(mode="simt") 内按线程执行;
在 kernel 其他位置(含 cube / SIMD vector 区域与 kernel 函数体)走核内标量数学路径。
函数原型:
Float.sqrt() -> 'Float'
参数说明:
- (除
self外无额外参数)
约束说明:
- 设备侧值须在
@tla.kernel函数体内调用。 - 在非
mode="simt"时仅支持Float32(Float16/BFloat16抛TypeError); 请先.to(tla.Float32),或在tla.vec.func(mode="simt")内调用。
调用示例:
@tla.kernel
def kernel() -> None:
r = tla.Float32(4.0).sqrt()
tla.make_coord(r.to(tla.Int32), 0)
数据搬运
片上与全局内存之间的 tensor 拷贝,以及 UB 寄存器 load/store。
copy
功能说明:
在 tile 之间拷贝数据。硬件通路由 src/dst 地址空间决定(vector:GM↔UB、UB→L1、
UB→UB;cube:GM→L1、L1→L0A/L0B、L0C→GM|UB|L1)。
UB→UB 一律走专用的 MOV.UB.TO.UB 块搬运,因此支持所有元素宽度(含 1 字节类型)
与任意行长度。该搬运以 32 字节块为单位计数,所以当每行不是 32 字节块的整数倍时,
行长度会向上取整,该行自身的 32 字节对齐填充也随之一起搬运。因此有两种几何形状会
被拒绝,而不会被拷贝:一是起始地址不在 32 字节边界上的 tile(子块视图可能产生这种
情况);二是行间距不足以容纳取整后整行的多行 tile,此时取整后的行会越界写入下一行。
目的 tile 打 ColumnMajor tag 的 UB→UB 拷贝是转置:两侧 tile 带同样的逻辑
形状 (M, N),落到内存里的是 (N, M) 的转置结果,与 L0C→GM、L0C→UB 表达转置的
方式一致。底层由 VNCHWCONV(vector 单元原生的转置指令)实现,它一次搬运 16 行 ×
C0 列的整块数据,C0 为一个 32 字节 DataBlock 内的元素个数(4 / 2 / 1 字节类型分别
为 8 / 16 / 32);1 字节类型需要四次调用才能覆盖其 32×32 的块。因此 tile 的形状
必须是整数个这样的块:16 行 × C0 列,1 字节类型为 32 行 × 32 列。
两侧 layout tag 选择格式转换(例如 ND→zN)。
vector 通路支持的元素类型:
| 通路 | 源 layout → 目的 layout | 元素类型 |
|---|---|---|
| GM → UB | RowMajor → RowMajor |
f32、f16、bf16、i32、i16、i8、f8e4m3fn、f8e5m2 |
| UB → GM | RowMajor → RowMajor |
同上 |
| UB → UB | RowMajor → RowMajor |
f32、f16、bf16、i32、i16、i8、f8e4m3fn、f8e5m2 |
| UB → UB | RowMajor → ColumnMajor(转置) |
同上 |
| UB → L1 | RowMajor → zN |
f32、f16、bf16、i8、f8e4m3fn、f8e5m2 |
| UB → L1 | zN → zN |
同上 |
| UB → L1 | zNUnAlign → zN |
同上 |
UB → L1 的目的 layout 只能是 zN;没有以 UB 为源、nZ 为目的的通路。i16 /
i32 只有 GM↔UB 与 UB→UB,没有 UB→L1。
zN 源的 UB tile 需要先在 UB 里按 zN 摆好:用 BlockStoreParams 的带 stride
block store 把每行分块写入打了 zN tag 的 UB view(见
examples/end_to_end/basic_mixed/basic_mixed_store_zN.py 与
basic_mixed_store_zNUnAlign.py,两者都用 --dtype 跑遍该通路支持的全部元素
类型)。分块长度按元素类型算:一个 vector register 是 256 字节,vsstb 一次
搬满它的 8 个 DataBlock,所以一块是 256 / sizeof(T) 个元素。8 位类型(i8 /
fp8)的 block store 与 GM↔UB、UB→L1 拷贝一样,在 bc 层按 int8_t 实例化:搬运
只用到宽度与 stride,不解释元素类型,而 AIV 后端对 fp8 没有标量语义。
拷贝 / 切块大小按各 tile 的逻辑 origin_shape(不是嵌套物理 shape)。
物理 shape / stride 描述这些逻辑元素如何存放(凑齐对齐长度、zN 打包等)。
函数原型:
tla.copy(dst: Tensor, src: Tensor, params: CopyParams | None = None, *, scale: Tensor | None = None) -> None
参数说明:
dst(Tensor):目的 tile。必填。src(Tensor):源 tile。必填。params(CopyParams | None):可选通路参数 (CopyL0C2DstParams、CopyUbToGmParams/ atomic 等)。默认None。- MX scale tile(目的为
zZMxScale/nNMxScale)在 L1 上按整行字节平铺, 源 tile 须覆盖缓冲区整行;按行堆叠各 chunk 的 scale block,不要沿列切宽 buffer。 仅在行 pitch 为编译期常量时可检查;layout 动态的 tensor 无法在编译期校验。 scale(Tensor | None):L1 上的 OCPe8m0共享指数 tile(沿 K 每 32 个元素一份), 使 L1→L0A/L0B 变为 microscaling(MX)load,并下沉为tla.copy_mx。因 MLIR 无 e8m0 类型,以i8/u8存储;目的为 L0A 时 tagtla.arch.zZMxScale,为 L0B 时 tagtla.arch.nNMxScale。默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 scale仅对 L1→L0A/L0B 通路有效;由此加载的 tile 随后须由tla.mmad/tla.mmad_mx消费。scale 由 load 消费,而非 matmul 参数——硬件mad_mx没有 scale 操作数,MX 关联在操作数进入 L0 时建立(对齐 AscendC 五参数LoadData重载)。- 须在
tla.cube()或tla.vector()内调用(上述 cube 通路在cube(), vector 通路在vector())。 - 整 tile DMA 使用
tla.copy。寄存器级 UB 非对齐访问请改用tensor.load/tensor.store,并传入UnalignLoadParams/UnalignStoreParams。 - 尺寸未按 32 字节对齐时: C0 为 32 字节。ND GM↔UB 时,优先让主导维的
字节数是 32 的倍数(如 RowMajor f16 选
N使N % 16 == 0)。若真实数据 大小做不到这一点,请保持origin_shape为真实逻辑尺寸,并把物理 layout 放大到对齐后的尺寸,或改用上方非对齐寄存器 load/store。zN 在M不是 16 的整数倍时,用tla.arch.zNUnAlign而非zN。
调用示例:
# --- 1) 对齐 GM ↔ UB(RowMajor,满足 32 字节对齐) ---
# 前:x_gm[i, j] 为 ND 数据;x_ub 为空。origin_shape==(M, N)。
with tla.vector():
tla.copy(dst=x_ub, src=x_gm)
# 后:对 origin_shape 内所有逻辑 (i, j),x_ub[i, j] == x_gm[i, j]。
tla.copy(dst=y_gm, src=y_ub)
# --- 2) ND → zN:GM RowMajor → L1 zN(排布变化) ---
# 前(逻辑):gm_a.origin_shape==(128, 64),RowMajor;元素 (r, c)
# 的 ND 偏移为 r*64+c。
# 后(L1 物理):l1_a 使用嵌套 zN shape/stride,同一逻辑 (r, c) 按 zN 存放;
# l1_a.origin_shape 仍为 (128, 64)。
l1_a = tla.make_tensor_like(l1_ptr, gm_a, layoutTag=tla.arch.zN)
with tla.cube():
tla.copy(dst=l1_a, src=gm_a)
# 不用 make_tensor_like 时的显式 zN(同一逻辑 128x64 f16):
l1_a = tla.make_tensor(
l1_ptr,
tla.make_layout(
tla.make_shape((16, 8), (16, 4)),
tla.make_stride((16, 256), (1, 2048)),
origin_shape=tla.make_shape(128, 64),
layoutTag=tla.arch.zN,
),
)
# --- 3) M 不是 16 的倍数:zNUnAlign ---
# 前:rows 可能为运行期值,且不是 16 的倍数。
l1_unalign = tla.make_tensor_like(l1_ptr, gm_tile, layoutTag=tla.arch.zNUnAlign)
with tla.cube():
tla.copy(dst=l1_unalign, src=gm_tile)
# 相关(寄存器路径,不是 tla.copy):UB ↔ vector 寄存器非对齐访问
# with tla.vec.func(mode="simd"):
# x_reg = x_ub.load(tla.params.UnalignLoadParams())
# y_ub.store(y_reg, tla.params.UnalignStoreParams())
无 scale 的 Cube 拷贝通路,tla.copy(dst, src, scale=None)
src_addr |
src_layout |
dst_addr |
dst_layout |
dtypes |
|---|---|---|---|---|
gm |
RowMajor |
l1 |
zN |
f32,f16,bf16,i8,f8e4m3fn,f8e5m2,f4e2m1,f4e1m2 |
gm |
ColumnMajor |
l1 |
nZ |
f32,f16,bf16,i8,f8e4m3fn,f8e5m2,f4e2m1,f4e1m2 |
gm |
RowMajorMxScaleA |
l1 |
zZMxScale |
f8e8m0 |
gm |
ColMajorMxScaleA |
l1 |
zZMxScale |
f8e8m0 |
gm |
RowMajorMxScaleB |
l1 |
nNMxScale |
f8e8m0 |
gm |
ColMajorMxScaleB |
l1 |
nNMxScale |
f8e8m0 |
l1 |
zN |
l0a |
zN |
f32,f16,bf16,i8,f8e4m3fn,f8e5m2 |
l1 |
nZ |
l0a |
zN |
f32,f16,bf16,i8,f8e4m3fn,f8e5m2 |
l1 |
zN |
l0b |
nZ |
f32,f16,bf16,i8,f8e4m3fn,f8e5m2 |
l1 |
nZ |
l0b |
nZ |
f32,f16,bf16,i8,f8e4m3fn,f8e5m2 |
带 scale 的 Cube 拷贝通路(供 tla.mmad_mx),即
tla.copy(dst=l0a|l0b, src=l1, scale=scale);scale 仅支持 f8e8m0,
且 scale 的 l1->l0 不支持转置。
src_addr |
src_layout |
dst_addr |
dst_layout |
scale_addr |
scale_layout |
dtypes |
|---|---|---|---|---|---|---|
l1 |
zN |
l0a |
zN |
l1 |
zZMxScale |
f8e4m3fn,f8e5m2,f4e2m1,f4e1m2 |
l1 |
nZ |
l0a |
zN |
l1 |
zZMxScale |
f8e4m3fn,f8e5m2,f4e2m1,f4e1m2 |
l1 |
zN |
l0b |
nZ |
l1 |
nNMxScale |
f8e4m3fn,f8e5m2,f4e2m1,f4e1m2 |
l1 |
nZ |
l0b |
nZ |
l1 |
nNMxScale |
f8e4m3fn,f8e5m2,f4e2m1,f4e1m2 |
Cube fixpipe 通路:从 L0C 拷到 GM/L1/UB。
fixpipe 支持随路 quant 与 relu;quant 模式支持 NO_QUANT、PER_TENSOR、PER_CHANNEL。
规则:
- 链路为 (l0c acc) → quant(可选)→ relu(可选)→ 写出到 dst。
NO_QUANT含纯数据类型转换,如f32→f16、f32→bf16。- 目的为 UB 时额外有
split_mode:nosplit(NO_SPLIT_VEC_0、NO_SPLIT_VEC_1)与 split(SPLIT_M、SPLIT_N)。 - 目的为
(ub, ColumnMajor)时仅支持nosplit。 - UB 的
split模式下禁用任何 quant_mode/relu,也不做纯 cast,仅允许f32→f32与i32→i32。
dst |
dst_layout |
split_mode |
quant_mode |
relu |
src_dtype:dst_dtype |
|---|---|---|---|---|---|
gm |
RowMajor |
- |
NO_QUANT |
False |
f32: f32,f16,bf16i32: i32 |
gm |
ColumnMajor |
- |
NO_QUANT |
False |
f32: f32,f16,bf16i32: i32 |
l1 |
zN |
- |
NO_QUANT |
False |
f32: f32,f16,bf16i32: i32 |
ub |
RowMajor |
nosplit |
NO_QUANT |
False |
f32: f32,f16,bf16i32: i32 |
ub |
RowMajor |
split |
NO_QUANT |
False |
f32: f32i32: i32 |
ub |
ColumnMajor |
nosplit |
NO_QUANT |
False |
f32: f32,f16,bf16i32: i32 |
gm |
RowMajor |
- |
NO_QUANT |
True |
f32: f32,f16,bf16i32: i32 |
gm |
ColumnMajor |
- |
NO_QUANT |
True |
f32: f32,f16,bf16i32: i32 |
l1 |
zN |
- |
NO_QUANT |
True |
f32: f32,f16,bf16i32: i32 |
ub |
RowMajor |
nosplit |
NO_QUANT |
True |
f32: f32,f16,bf16i32: i32 |
ub |
ColumnMajor |
nosplit |
NO_QUANT |
True |
f32: f32,f16,bf16i32: i32 |
Vector 拷贝通路
src_addr |
src_layout |
dst_addr |
dst_layout |
dtypes |
|---|---|---|---|---|
gm |
RowMajor |
ub |
RowMajor |
f32,f16,bf16,i32,i16,i8,f8e4m3fn,f8e5m2 |
ub |
RowMajor |
gm |
RowMajor |
f32,f16,bf16,i32,i16,i8,f8e4m3fn,f8e5m2 |
ub |
RowMajor |
ub |
RowMajor |
f32,f16,bf16,i32,i16,i8,f8e4m3fn,f8e5m2 |
ub |
RowMajor |
ub |
ColumnMajor |
f32,f16,bf16,i32,i16,i8,f8e4m3fn,f8e5m2 |
ub |
RowMajor |
l1 |
zN |
f32,f16,bf16,i8,f8e4m3fn,f8e5m2 |
ub |
zN |
l1 |
zN |
f32,f16,bf16,i8,f8e4m3fn,f8e5m2 |
ub |
zNUnAlign |
l1 |
zN |
f32,f16,bf16,i8,f8e4m3fn,f8e5m2 |
Tensor.load
源码: catlass.tla.tensor._Tensor.load
功能说明:
将本 UB tensor tile 载入 vector 或 mask SSA(tile.load)。
函数原型:
tile.load(params: LoadParams | None = None) -> MaskSSA | VectorSSA | tuple[VectorSSA, VectorSSA]
参数说明:
params(LoadParams | None):载入模式。None/NormalLoadParams/UnalignLoadParams/BlockLoadParams→VectorSSA(DIST_DINTLV_B32时可为二元组);MaskLoadParams→MaskSSA。NormalLoadParams.load_dist选择分发模式:norm(默认)、brc_b32(单个 b32 元素广播到全部 lane)、dintlv_b32(f32 解交织, 双返回值)、us_b8/us_b16(2 倍上采样)、brc_b16(单个 b16 元素 广播)、unpack_b16(b16 零扩展到双倍宽度)、e2b_b16/e2b_b32(元素到 DataBlock 广播)、blk(一个 32 字节 DataBlock 广播到全部 8 个)。BlockLoadParams为跨步 DataBlock 收集:一条指令收集 8 个 DataBlock, 块头间隔block_stride个 DataBlock(32B 单位);block_stride == 0时将首个 DataBlock 复制到全部 8 槽;post_update_stride为编译期地址 预偏移,单位 32B DataBlock。可选,默认None。UnalignLoadParams→VectorSSA(DIST_DINTLV_B32时可为二元组);MaskLoadParams→MaskSSA。可选,默认None。MaskLoadParams.load_dist可为DIST_NORM(默认,bit-packed 掩码载入)、DIST_US(bit 上采样)或DIST_DS(bit 下采样)。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用;源 tile 须位于 UB。 - Mask 载入
DIST_NORM要求 UB 元素类型为 1/2/4 字节标量。 - 分发模式限定元素宽度:
us_b8要求 i8/u8;brc_b16/us_b16/unpack_b16/e2b_b16要求 2 字节(f16/bf16/i16/u16);e2b_b32要求 4 字节(f32/i32/u32);dintlv_b32要求 f32;blk适用于任意 元素宽度。 BlockLoadParams要求 2/4 字节元素类型(f32/f16/bf16/i32/u32/i16/u16);block_stride与post_update_stride须在 [0, 65535] 范围内。DIST_US/DIST_DS:UB 元素类型可为任意 b8/b16/b32/b64 标量。 元素类型仅用于 UB 寻址;掩码位布局与元素宽度无关。 静态 tile shape 乘积属于{32,64,128,256}时作为!tla.mask<N>的N; 否则N=256。- 掩码载入字节偏移对齐(UB 字节地址
base + offset×sizeof(T)):DIST_NORM→VL/8;DIST_US→VL/16;DIST_DS→min(32, VL/4)。 VL=256 时为 32B / 16B / 32B。
调用示例:
with tla.vec.func(mode="simd"):
x_reg = x_ub.load()
x_unalign = x_ub.load(tla.params.UnalignLoadParams())
x_blk = x_ub.load(tla.params.NormalLoadParams(
load_dist=tla.params.LoadDist.DIST_BLK))
x_gather = x_ub.load(tla.params.BlockLoadParams(block_stride=4))
preg = mask_ub.load(
tla.params.MaskLoadParams(load_dist=tla.params.MaskLoadDist.DIST_DS)
)
y = tla.where(preg, x_reg, min_reg)
Tensor.store
源码: catlass.tla.tensor._Tensor.store
功能说明:
将 vector 或 mask SSA 写回本 UB tensor tile(tile.store)。
函数原型:
tile.store(value: VectorSSA | MaskSSA, params: StoreParams | None = None, *, mask: MaskSSA | None = None) -> None
参数说明:
value(VectorSSA | MaskSSA):要写入的VectorSSA或MaskSSA。必填。params(StoreParams | None):写回模式。None/NormalStoreParams/UnalignStoreParams/BlockStoreParams→ vector 写回;MaskStoreParams→ mask 写回。NormalStoreParams.store_dist另可选 first-element 模式:first_element_b8/first_element_b16/first_element_b32——仅将源寄存器 lane 0 写入 tile 基址,后缀限定写出的元素字节宽度。可选,默认None。mask(MaskSSA | None):vector 写回的可选谓词;与MaskStoreParams及 first-element 模式均不可同时使用。默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用;目标 tile 须位于 UB。 - first-element 模式要求被写值与目标 tile 的元素宽度匹配后缀
(b8 → 1 字节,b16 → 2 字节,b32 → 4 字节);传入谓词
mask会报错。
调用示例:
with tla.vec.func(mode="simd"):
y_ub.store(y_reg)
y_ub.store(y_reg, tla.params.UnalignStoreParams())
y_ub.store(y_reg, tla.params.NormalStoreParams(
store_dist=tla.params.StoreDist.DIST_FIRST_ELEMENT_B16))
矩阵运算
Cube 侧矩阵乘加(tla.mmad / tla.mmad_mx)。
mmad
功能说明:
在 TLA tile 上执行矩阵乘累加。
函数原型:
tla.mmad(acc: Tensor, lhs: Tensor, rhs: Tensor, init_c: bool | Bool | None = None, unit_flag: IndexLike | None = None, compute_order: ComputeOrder = ComputeOrder.M_FIRST, hf32_mode: HF32Mode = HF32Mode.HF32_DISABLE, **extra_kwargs: object) -> None
参数说明:
acc(Tensor):累加器 / 输出 tile(通常在 L0C)。必填。lhs(Tensor):左矩阵 tile(通常在 L0A)。必填。rhs(Tensor):右矩阵 tile(通常在 L0B)。必填。init_c(bool | Bool | None):是否先清零累加器;省略时默认为False。可选,默认None。unit_flag(IndexLike | None):unit flag 控制位;省略时默认为0。可选,默认None。compute_order(ComputeOrder):M/N 计算方向优先级;默认M_FIRST。hf32_mode(HF32Mode):FP32 操作数在 L0A/L0B 上、矩阵乘之前的 HF32 舍入模式。可选,默认HF32_DISABLE。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.cube()内调用;acc/lhs/rhs须为匹配的 L0 tile。 - 支持的元素类型通路包括
f16/bf16/f32,以及任意f8e4m3fn/f8e5m2操作数配对,累加到 L0C 上的 fp32。 init_c仅接受 Pythonbool或i1SSA 值。- 不接受未知关键字参数;传入则报错。
调用示例:
# 前:l0a / l0b 为当前 K 切片;l0c 为 L0C 上的累加器。
with tla.cube():
tla.mmad(l0c, l0a, l0b, init_c=True, unit_flag=0b11)
# 后:l0c 累加 lhs@rhs(init_c=True 时先清零)。
mmad_mx
功能说明:
在 TLA tile 上执行 microscaling(MX)矩阵乘累加。
与 tla.mmad 分开,因为 Cube 有专用 mad_mx 指令(AscendC 暴露为
asc_mmad_mx)。
与该指令一样,本接口不接受 scale 参数。lhs/rhs 必须先通过带
scale 操作数的 tla.copy 加载,从而把 e8m0 block 附着到 L0 tile;硬件再
从 L0 tile 旁路缓冲读取 scale。传入未按此方式加载的操作数会报错;把
microscaling 操作数传给 tla.mmad 同样会报错——两个 op 不可互换,操作数
本身也无法区分属于哪条路径。
函数原型:
tla.mmad_mx(acc: Tensor, lhs: Tensor, rhs: Tensor, init_c: bool | Bool | None = None, unit_flag: IndexLike | None = None, compute_order: ComputeOrder = ComputeOrder.M_FIRST, **extra_kwargs: object) -> None
参数说明:
acc(Tensor):累加器 / 输出 tile,位于 L0C,始终为 fp32。必填。lhs(Tensor):左矩阵 tile,位于 L0A。必填。rhs(Tensor):右矩阵 tile,位于 L0B。必填。init_c(bool | Bool | None):是否先清零累加器;省略时默认为False。可选,默认None。unit_flag(IndexLike | None):unit flag 控制位;省略时默认为0。可选,默认None。compute_order(ComputeOrder):M/N 计算方向优先级;默认M_FIRST。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.cube()内调用;acc/lhs/rhs须为匹配的 L0 tile。 - 操作数须为
f8e4m3fn/f8e5m2配对,或f4e2m1/f4e1m2配对; 同一对内两种格式可混用,累加器为 fp32。 - 两个操作数都必须经
tla.copy(..., scale=...)加载。
调用示例:
# 前:l1a/l1b 为 fp8 操作数,l1sa/l1sb 为其 e8m0 scale block。
with tla.cube():
tla.copy(l0a, l1a, scale=l1sa) # scale 随 load,不在 matmul 参数里
tla.copy(l0b, l1b, scale=l1sb)
tla.mmad_mx(l0c, l0a, l0b, init_c=True)
# 后:l0c 累加 microscaled 的 lhs@rhs。
Vector 运算
寄存器 Vector 路径上的计算与 mask 操作,通常须在 tla.vec.func() 内调用。
Mask 计算
Mask 创建与尾块更新。
create_mask
源码: catlass.core_api.create_mask
功能说明:
按固定 pattern(tla.mask.* token)创建 vector mask。
函数原型:
tla.create_mask(*, pattern: _MaskPattern | str | None = None, dtype: DTypeLike = Float32) -> MaskSSA
参数说明:
-
pattern(_MaskPattern | str | None):掩码 pattern token 或其名字字符串。 运行时必填(传None会报错)。token 挂在tla.mask下(如tla.mask.ALL、tla.mask.VL8):Pattern 含义 ALL全部元素有效 ALLF全部元素无效 VL1/VL2/VL3/VL4最低 1 / 2 / 3 / 4 个元素有效 VL8/VL16/VL32/VL64/VL128最低 8 / 16 / 32 / 64 / 128 个元素有效 M3下标为 3 的倍数的元素有效 M4下标为 4 的倍数的元素有效 H最低一半元素有效 Q最低四分之一元素有效 -
dtype(DTypeLike):与掩码关联的元素类型(也决定一条 vector 能放多少元素: 256 字节 / 元素大小)。可选,默认Float32。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用;pattern必填。 - 接受
mask=的接口需要create_mask/update_mask得到的MaskSSA, 不能直接传tla.mask.*token。
调用示例:
with tla.vec.func(mode="simd"):
# 用 pattern token 构建 mask:
m_all = tla.create_mask(pattern=tla.mask.ALL, dtype=tla.Float16)
m_tail = tla.create_mask(pattern=tla.mask.VL8, dtype=tla.Float16)
# 前:x_reg / y_reg 为整 vector;只让最低 8 个元素做加法。
z = tla.add(x_reg, y_reg, mask=m_tail)
# 后:有效元素为 x+y;被 mask 掉的元素不参与。
update_mask
源码: catlass.core_api.update_mask
功能说明:
创建尾部 mask,并返回剩余元素计数。
函数原型:
tla.update_mask(true_shape: IndexLike, dtype: DTypeLike = Float32) -> tuple[MaskSSA, Numeric]
参数说明:
true_shape(IndexLike):当前有效(true)区域形状。必填。dtype(DTypeLike):与掩码关联的元素类型。可选,默认Float32。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。
调用示例:
with tla.vec.func(mode="simd"):
tail_mask, remain = tla.update_mask(true_shape, dtype=tla.Float32)
基础算术
exp
功能说明:
vector 逐元素指数(需 f16/f32)。
函数原型:
tla.exp(operand: VectorSSA, *, mask: MaskSSA | None = None) -> VectorSSA
参数说明:
operand(VectorSSA):源 vector 寄存器。必填。mask(MaskSSA | None):可选执行掩码;None表示全有效。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用;元素类型须为 f16/f32。
调用示例:
with tla.vec.func(mode="simd"):
y = tla.exp(x_reg)
log
功能说明:
vector 逐元素对数(需 f16/f32)。
函数原型:
tla.log(operand: VectorSSA, *, mask: MaskSSA | None = None) -> VectorSSA
参数说明:
operand(VectorSSA):源 vector 寄存器。必填。mask(MaskSSA | None):可选执行掩码;None表示全有效。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用;元素类型须为 f16/f32。
调用示例:
with tla.vec.func(mode="simd"):
y = tla.log(x_reg)
sqrt
功能说明:
vector 或标量的平方根。
对 VectorSSA:逐元素 AVE 运算(需 f16/f32)。
对浮点 Numeric:走核内标量单元,可在 tla.cube、SIMD/SIMT 的
tla.vec.func 或 kernel 函数体中使用。SIMT 区域内为逐线程
tla.simt_sqrt;其余路径为 math.sqrt。浮点 Numeric 上的 x.sqrt()
是同一操作。
函数原型:
tla.sqrt(operand: VectorSSA, *, mask: MaskSSA | None = None) -> VectorSSA
参数说明:
operand(VectorSSA | Numeric):源 vector 寄存器,或浮点标量。必填。mask(MaskSSA | None):可选执行掩码;None表示全有效。仅 vector 形态。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - vector 形态须在
tla.vec.func()内调用;元素类型须为 f16/f32。 - 标量形态仅支持浮点,且不接受
mask。
调用示例:
with tla.vec.func(mode="simd"):
y = tla.sqrt(x_reg)
with tla.cube():
s = tla.sqrt(scale)
abs
功能说明:
vector 逐元素绝对值。
函数原型:
tla.abs(operand: VectorSSA, *, mask: MaskSSA | None = None) -> VectorSSA
参数说明:
operand(VectorSSA):源 vector 寄存器。必填。mask(MaskSSA | None):可选执行掩码;None表示全有效。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。
调用示例:
with tla.vec.func(mode="simd"):
y = tla.abs(x_reg)
neg
功能说明:
vector 逐元素取负。
函数原型:
tla.neg(operand: VectorSSA, *, mask: MaskSSA | None = None) -> VectorSSA
参数说明:
operand(VectorSSA):源 vector 寄存器。必填。mask(MaskSSA | None):可选执行掩码;None表示全有效。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。
调用示例:
with tla.vec.func(mode="simd"):
y = tla.neg(x_reg)
add
功能说明:
vector 逐元素加法(支持 vector–vector 与 vector–scalar)。
VectorSSA 在不需要 mask 时也可通过 + / __radd__ 调用本接口。
函数原型:
tla.add(lhs: VectorSSA | Numeric | bool | int | float, rhs: VectorSSA | Numeric | bool | int | float, *, mask: MaskSSA | None = None) -> VectorSSA
参数说明:
lhs(VectorSSA | Numeric | bool | int | float):左操作数。必填。rhs(VectorSSA | Numeric | bool | int | float):右操作数。必填。mask(MaskSSA | None):可选执行掩码;None表示全有效。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用;支持 vector–vector 与 vector–scalar。
调用示例:
with tla.vec.func(mode="simd"):
# 计算前:x_reg、y_reg 已从 UB load 到寄存器。
z = x_reg + y_reg # 等价于 tla.add(x_reg, y_reg)
z = x_reg + 1.0 # vector–scalar,走 __add__/__radd__
# 带 mask:先 create_mask 得到 MaskSSA,再传 mask=(不能用运算符重载)。
m = tla.create_mask(pattern=tla.mask.VL16, dtype=tla.Float16)
z = tla.add(x_reg, y_reg, mask=m)
# 计算后:有效元素为和;其余元素不参与。
sub
功能说明:
vector 逐元素减法。
VectorSSA 在不需要 mask 时也可通过 -(__sub__)调用本接口。
函数原型:
tla.sub(lhs: VectorSSA | Numeric | bool | int | float, rhs: VectorSSA | Numeric | bool | int | float, *, mask: MaskSSA | None = None) -> VectorSSA
参数说明:
lhs(VectorSSA | Numeric | bool | int | float):左操作数(被减数)。必填。rhs(VectorSSA | Numeric | bool | int | float):右操作数(减数)。必填。mask(MaskSSA | None):可选执行掩码;None表示全有效。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。
调用示例:
with tla.vec.func(mode="simd"):
# 计算前:x_reg / y_reg 为源 vector。
z = x_reg - y_reg # 等价于 tla.sub(x_reg, y_reg)
z = tla.sub(x_reg, y_reg, mask=m) # 需要 mask 时用函数形式
# 计算后:z 为逐元素差。
mul
功能说明:
vector 逐元素乘法。
VectorSSA 在不需要 mask 时也可通过 * / __rmul__ 调用本接口。
函数原型:
tla.mul(lhs: VectorSSA | Numeric | bool | int | float, rhs: VectorSSA | Numeric | bool | int | float, *, mask: MaskSSA | None = None) -> VectorSSA
参数说明:
lhs(VectorSSA | Numeric | bool | int | float):左操作数。必填。rhs(VectorSSA | Numeric | bool | int | float):右操作数。必填。mask(MaskSSA | None):可选执行掩码;None表示全有效。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。
调用示例:
with tla.vec.func(mode="simd"):
# 计算前:x_reg 为激活;scale 可为 vector 或标量。
z = x_reg * y_reg # 等价于 tla.mul(x_reg, y_reg)
z = x_reg * 2.0 # vector–scalar
z = tla.mul(x_reg, y_reg, mask=m)
# 计算后:z 为逐元素积。
max
功能说明:
vector 逐元素最大值。
函数原型:
tla.max(lhs: VectorSSA | Numeric | bool | int | float, rhs: VectorSSA | Numeric | bool | int | float, *, mask: MaskSSA | None = None) -> VectorSSA
参数说明:
lhs(VectorSSA | Numeric | bool | int | float):左操作数。必填。rhs(VectorSSA | Numeric | bool | int | float):右操作数。必填。mask(MaskSSA | None):可选执行掩码;None表示全有效。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。
调用示例:
with tla.vec.func(mode="simd"):
z = tla.max(x_reg, y_reg)
min
功能说明:
vector 逐元素最小值。
函数原型:
tla.min(lhs: VectorSSA | Numeric | bool | int | float, rhs: VectorSSA | Numeric | bool | int | float, *, mask: MaskSSA | None = None) -> VectorSSA
参数说明:
lhs(VectorSSA | Numeric | bool | int | float):左操作数。必填。rhs(VectorSSA | Numeric | bool | int | float):右操作数。必填。mask(MaskSSA | None):可选执行掩码;None表示全有效。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。
调用示例:
with tla.vec.func(mode="simd"):
z = tla.min(x_reg, y_reg)
div
功能说明:
vector 逐元素除法。
VectorSSA 在不需要 mask 时也可通过 /(__truediv__)调用本接口。
函数原型:
tla.div(lhs: VectorSSA | Numeric | bool | int | float, rhs: VectorSSA | Numeric | bool | int | float, *, mask: MaskSSA | None = None) -> VectorSSA
参数说明:
lhs(VectorSSA | Numeric | bool | int | float):左操作数(被除数)。必填。rhs(VectorSSA | Numeric | bool | int | float):右操作数(除数)。必填。mask(MaskSSA | None):可选执行掩码;None表示全有效。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。
调用示例:
with tla.vec.func(mode="simd"):
# 计算前:x_reg 为被除数;y_reg / 标量为除数。
z = x_reg / y_reg # 等价于 tla.div(x_reg, y_reg)
z = tla.div(x_reg, y_reg, mask=m)
# 计算后:z 为逐元素商。
逻辑计算
Mask / Vector 上的按位与逻辑运算。
shift_left
源码: catlass.core_api.shift_left
功能说明:
按 lane 或标量移位量,对 vector 做逐元素左移。
函数原型:
tla.shift_left(source: VectorSSA, shift: Any, *, mask: MaskSSA | None = None) -> VectorSSA
参数说明:
source(VectorSSA):待移位的源 vector。必填。shift(VectorSSA | Numeric | int):每 lane 移位量。可为与source同元素位宽的有符号VectorSSA,或可转为 i16 的整型标量。必填。mask(MaskSSA | None):执行掩码。可选,默认None(全 lane 有效); 被 mask 掉的 lane 写零。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。 - 源元素须为有符号 8/16/32 位整数(i8/i16/i32);不支持 64 位与无符号移位。
- 移位量须为非负。
调用示例:
with tla.vec.func(mode="simd"):
_tile = tla.shift_left(tile, bit_shift_reg, mask=mask)
shift_right
源码: catlass.core_api.shift_right
功能说明:
按 lane 或标量移位量,对 vector 做逐元素右移。
有符号源 vector 使用算术右移。
函数原型:
tla.shift_right(source: VectorSSA, shift: Any, *, mask: MaskSSA | None = None) -> VectorSSA
参数说明:
source(VectorSSA):待移位的源 vector。必填。shift(VectorSSA | Numeric | int):每 lane 移位量。可为与source同元素位宽的有符号VectorSSA,或可转为 i16 的整型标量。必填。mask(MaskSSA | None):执行掩码。可选,默认None(全 lane 有效); 被 mask 掉的 lane 写零。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。 - 源元素须为有符号 8/16/32 位整数(i8/i16/i32);不支持 64 位与无符号移位。
- 移位量须为非负。
调用示例:
with tla.vec.func(mode="simd"):
_tile = tla.shift_right(tile, bit_shift_reg, mask=mask)
bitwise_not
源码: catlass.core_api.bitwise_not
功能说明:
逐元素按位/逻辑非(Mask 或 Vector)。
函数原型:
tla.bitwise_not(operand: VectorSSA | MaskSSA, *, mask: MaskSSA | None = None) -> MaskSSA | VectorSSA
参数说明:
operand(VectorSSA | MaskSSA):按位取反的源操作数。必填。mask(MaskSSA | None):可选执行掩码;None表示全有效。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。
调用示例:
with tla.vec.func(mode="simd"):
m2 = tla.bitwise_not(m)
bitwise_and
源码: catlass.core_api.bitwise_and
功能说明:
逐元素按位与(Mask 或 Vector)。
函数原型:
tla.bitwise_and(src0_reg: VectorSSA | MaskSSA, src1_reg: VectorSSA | MaskSSA, *, mask: MaskSSA | None = None) -> MaskSSA | VectorSSA
参数说明:
src0_reg(VectorSSA | MaskSSA):按位与左操作数。必填。src1_reg(VectorSSA | MaskSSA):按位与右操作数。必填。mask(MaskSSA | None):可选执行掩码;None表示全有效。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。
调用示例:
with tla.vec.func(mode="simd"):
m3 = tla.bitwise_and(m0, m1)
bitwise_or
源码: catlass.core_api.bitwise_or
功能说明:
逐元素按位或(Mask 或 Vector)。
函数原型:
tla.bitwise_or(src0_reg: VectorSSA | MaskSSA, src1_reg: VectorSSA | MaskSSA, *, mask: MaskSSA | None = None) -> MaskSSA | VectorSSA
参数说明:
src0_reg(VectorSSA | MaskSSA):按位或左操作数。必填。src1_reg(VectorSSA | MaskSSA):按位或右操作数。必填。mask(MaskSSA | None):可选执行掩码;None表示全有效。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。
调用示例:
with tla.vec.func(mode="simd"):
m3 = tla.bitwise_or(m0, m1)
bitwise_xor
源码: catlass.core_api.bitwise_xor
功能说明:
逐元素按位异或(Mask 或 Vector)。
函数原型:
tla.bitwise_xor(src0_reg: VectorSSA | MaskSSA, src1_reg: VectorSSA | MaskSSA, *, mask: MaskSSA | None = None) -> MaskSSA | VectorSSA
参数说明:
src0_reg(VectorSSA | MaskSSA):按位异或左操作数。必填。src1_reg(VectorSSA | MaskSSA):按位异或右操作数。必填。mask(MaskSSA | None):可选执行掩码;None表示全有效。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。
调用示例:
with tla.vec.func(mode="simd"):
m3 = tla.bitwise_xor(m0, m1)
比较与选择
where
功能说明:
按 mask 在两路 vector 间逐元素选择;在 SIMT 区域内也可在两路 per-thread 标量间选择。
函数原型:
tla.where(mask: Any, x: Any, y: Any) -> Any
参数说明:
mask(MaskSSA | Bool):选择掩码;真取x,假取y。可为整 vector 的MaskSSA,或 SIMT 区域内比较得到的Bool。必填。x(VectorSSA | Numeric):掩码为真时的取值。必填。y(VectorSSA | Numeric):掩码为假时的取值。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用;mask/x/y的有效元素布局须匹配。 - per-thread 形式要求
mode="simt",并生成tla.simt_where。
调用示例:
with tla.vec.func(mode="simd"):
z = tla.where(m, x_reg, y_reg)
cmp
功能说明:
vector 比较,返回 mask。
函数原型:
tla.cmp(lhs: VectorSSA, rhs: VectorSSA | Numeric | bool | int | float, mode: str, *, mask: MaskSSA | None = None) -> MaskSSA
参数说明:
lhs(VectorSSA):比较左操作数。必填。rhs(VectorSSA | Numeric | bool | int | float):比较右操作数(可为标量或 vector)。必填。mode(str):比较模式,如'eq'/'lt'/'gt'等。必填。mask(MaskSSA | None):可选执行掩码;None表示全有效。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用;mode须为支持的比较模式名。
调用示例:
with tla.vec.func(mode="simd"):
m = tla.cmp(x_reg, y_reg, mode="lt")
数据填充
full
功能说明:
用 Python 标量字面量填充一维 vector SSA,或将单 lane 的 vector 片段
(例如 VectorSSA.reduce 的结果)广播到全部 lane。
函数原型:
tla.full(value: bool | int | float | Numeric | VectorSSA, dtype: type[Numeric], *, mask: Any | None = None) -> VectorSSA
参数说明:
value(bool | int | float | Numeric | VectorSSA):填充常量,或待广播的 单 lane vector 片段。必填。dtype(type[Numeric]):vector 元素类型。必填。mask(MaskSSA | None):谓词哪些 lane 被写入。可选;默认写全部 lane。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用;value须为 Python 标量字面量、HostNumeric,或单 lane vector 片段。 - 当
value为 vector 时,必须恰好 1 个有效 lane,且元素类型与dtype一致。 - 若提供
mask,须与结果元素类型匹配。
调用示例:
with tla.vec.func(mode="simd"):
zeros = tla.full(0.0, dtype=tla.Float32)
all_lanes, _ = tla.update_mask(64, tla.Float32)
total = src.reduce(tla.ReductionOp.ADD, mask=all_lanes)
spread = tla.full(total, dtype=tla.Float32)
arange
功能说明:
创建单调递增或递减的一维 vector SSA(base + order)。
函数原型:
tla.arange(base: bool | int | float | Numeric = 0, *, order: str = 'increase', dtype: type[Numeric]) -> VectorSSA
参数说明:
base(bool | int | float | Numeric):起始基数。可选,默认0。order(str):'increase'递增或'decrease'递减。可选,默认'increase'。dtype(type[Numeric]):vector 元素类型。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用;order仅支持increase/decrease。
调用示例:
with tla.vec.func(mode="simd"):
lane_idx = tla.arange(base=0, order="increase", dtype=tla.Int32)
离散与聚合
按索引 gather,以及带 mask 的归约(VectorSSA.reduce)。
gather
功能说明:
按索引从 UB tile 或寄存器 gather 元素。
两种形态:
- UB→Reg:
x为 UB 上的Tensor;y为i32索引;可选mask。 - Reg→Reg:
x为VectorSSA;y为与x元素位宽相同的整数索引(i8/u8、i16/u16或i32/u32);result[i] = x[y[i] % VL]。无mask。
函数原型:
tla.gather(x: Tensor | VectorSSA, y: VectorSSA, *, mask: MaskSSA | None = None) -> VectorSSA
参数说明:
x(Tensor | VectorSSA):源 tile(UB)或源寄存器。必填。y(VectorSSA):索引 vector 寄存器。必填。mask(MaskSSA | None):仅 UB→Reg 可选执行掩码;None表示全有效。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。 - Tensor 源须位于 UB。
调用示例:
with tla.vec.func(mode="simd"):
vals = tla.gather(ub_tile, idx_i32)
w_brc = tla.gather(w, idx_u16) # Reg→Reg
VectorSSA.reduce
源码: catlass.core_api.VectorSSA.reduce
功能说明:
在 mask 下对本寄存器驻留 vector 做归约,得到单 lane 片段
(tla.ReductionOp.ADD / MAX / MIN)。可用
tla.full(fragment, dtype=...) 再广播回全宽。
函数原型:
VectorSSA.reduce(kind: ReductionOp, *, mask: Any, init_value: Any | None = None, reduction_profile: Any | None = None) -> Any
参数说明:
kind(ReductionOp):归约种类(ADD、MAX或MIN)。必填。mask(MaskSSA):谓词哪些 lane 参与。必填。init_value:预留;当前仅支持None。可选,默认None。reduction_profile:预留;当前仅支持None。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。 - 元素类型须为 f16/f32/i16/i32/u16/u32 之一。
init_value与reduction_profile须省略或为None。
调用示例:
with tla.vec.func(mode="simd"):
m = tla.create_mask(pattern=tla.mask.ALL, dtype=tla.Float32)
total = src_reg.reduce(tla.ReductionOp.ADD, mask=m)
broadcast = tla.full(total, dtype=tla.Float32)
数据重排
提供 vector 寄存器或 predicate mask 的 lane 交插与解交插操作。
interleave
源码: catlass.core_api.interleave
功能说明:
按 lane 交替排列两个 vector 寄存器或两个 predicate mask,并返回两个寄存器。
函数原型:
tla.interleave(src0: VectorSSA | MaskSSA, src1: VectorSSA | MaskSSA) -> tuple[VectorSSA, VectorSSA] | tuple[MaskSSA, MaskSSA]
参数说明:
src0(VectorSSA或MaskSSA):偶数 lane 输入。必填。src1(VectorSSA或MaskSSA):与src0类别和类型相同的奇数 lane 输入。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用;输入类型须匹配。MaskSSA 仅支持mask<64>、mask<128>和mask<256>。
调用示例:
with tla.vec.func(mode="simd"):
lo, hi = tla.interleave(a, b)
mask_lo, mask_hi = tla.interleave(mask0, mask1)
deinterleave
源码: catlass.core_api.deinterleave
功能说明:
按顺序拼接两个 vector 寄存器或两个 predicate mask,再分别返回偶数位置和奇数位置的 lane。
函数原型:
tla.deinterleave(src0: VectorSSA | MaskSSA, src1: VectorSSA | MaskSSA) -> tuple[VectorSSA, VectorSSA] | tuple[MaskSSA, MaskSSA]
参数说明:
src0(VectorSSA或MaskSSA):拼接输入的前半部分。必填。src1(VectorSSA或MaskSSA):与src0类别和类型相同的后半部分。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用;两路 vector 的元素类型与 lane 数须匹配。 - MaskSSA 的输入和输出类型必须完全一致,仅支持
mask<64>、mask<128>和mask<256>;不支持mask<32>/b64。
调用示例:
with tla.vec.func(mode="simd"):
even, odd = tla.deinterleave(a, b)
mask_even, mask_odd = tla.deinterleave(mask0, mask1)
数据压缩
squeeze
功能说明:
按 mask 将选中元素压缩到结果低位。
函数原型:
tla.squeeze(src: VectorSSA, mask: MaskSSA) -> VectorSSA
参数说明:
src(VectorSSA):待压缩的源 vector。必填。mask(MaskSSA):保留元素的掩码。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。
调用示例:
with tla.vec.func(mode="simd"):
packed = tla.squeeze(src, m)
类型转换
寄存器 vector 上的元素类型转换(VectorSSA.to)与同位宽按位重解释(VectorSSA.bitcast)。
VectorSSA.to
源码: catlass.core_api.VectorSSA.to
功能说明:
将寄存器内的 vector 转换为另一种元素类型。
lowering 支持有符号整数 tla.Int8 ~ tla.Int64、浮点 tla.Float16 /
tla.BFloat16 / tla.Float32,以及两种 OCP fp8 格式 tla.Float8E4M3FN /
tla.Float8E5M2。无符号整数、tla.Bool(i1)、tla.Float64 与 tla.Float8E8M0
会被拒绝。
tla.Float16 到 tla.BFloat16 使用一条直接转换指令,保留全部 lane,支持所有
舍入模式。sat_mode 必须为 UNKNOWN;由于指令没有饱和模式参数,NOSAT
和 SAT 均会被拒绝。对于这一等宽转换,reg_slot 的 ZERO 与 ONE 效果相同。
fp8 操作数可与 tla.Float32、tla.Float16、tla.BFloat16 互相转换。其中只有
f32 这一对是单条指令:f16 与 bf16 两对由 lowering 展开为经过 f32 的两次 cast,
扩宽一侧精确、收窄一侧只舍入一次;f8e5m2 -> f16 则展开为一次整数扩宽加一次移位,
因为这两种格式共享同一符号与指数字段——与经过 f32 的组合路径选出相同元素,但只需
两条指令而非五条。fp8 之间没有重编码路径——两者指数范围不同,属于重量化而非
cast——也没有 fp8 与整数之间的路径。
函数原型:
VectorSSA.to(dst_type: Any, params: CastParams, mask: Any | None = None) -> Any
参数说明:
dst_type(type[Numeric]):目标元素类型。必填。params(CastParams):舍入模式、饱和模式与寄存器 slot。必填。mask(MaskSSA | None):可选执行掩码;None表示所有 lane 使能。选填,默认None。 mask 按源元素域索引:lanei谓词源元素i,与位宽变化无关;被 mask 关掉的 元素对结果贡献为零。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。 reg_slot的TWO与THREE指向 pack 的四分之一,仅在位宽变化为 4 倍的整数 cast 以及直接的 fp8↔f32 指令上合法。- 线程级标量 cast 在
mode="simt"下使用Numeric.to;本方法是 vector(AVE) 形态,始终需要CastParams。
调用示例:
trait = tla.params.CastParams(
reg_slot=tla.params.RegSlot.ZERO,
sat_mode=tla.params.SatMode.NOSAT,
round_mode=tla.params.RoundMode.CAST_ROUND,
)
with tla.vec.func(mode="simd"):
wide = narrow.to(tla.Float32, trait)
VectorSSA.bitcast
源码: catlass.core_api.VectorSSA.bitcast
功能说明:
将寄存器内 vector 的比特按另一种同位宽元素类型重新解释。该操作不做任何数值 转换,也不产生硬件指令:寄存器的比特保持原样,只有元素类型改变,因此开销为零。
这使得浮点数的比特模式在 DSL 前端变得可读——取出指数、通过移入第 23 位构造
2**k、清除符号位——而不必经由 UB 以另一种元素类型存取一轮。
同位宽的组合为 f32/i32/u32、f16/bf16/i16/u16、
i8/u8/f8e4m3fn/f8e5m2 以及 i64/u64,lane 数保持不变。位宽变化属于
VectorSSA.to 的职责,在此会被拒绝。tla.Bool(i1)、tla.Float8E8M0 与打包的
fp4 格式不是合法的 !tla.vector 元素类型,同样会被拒绝。
需要注意,i64/u64 虽然可以通过校验,但目前并不可达:tla.make_tensor_like
拒绝 i64 元素类型,因此没有任何路径能产生 64 位的 vector 寄存器。
函数原型:
VectorSSA.bitcast(dst_type: Any) -> Any
参数说明:
dst_type(type[Numeric]):重新解释为的同位宽元素类型。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用。 dst_type的位宽须与源元素类型相同。- 重解释为源自身的元素类型是空操作,直接返回
self。
调用示例:
with tla.vec.func(mode="simd"):
bits = x.bitcast(tla.Int32)
exponent = tla.bitwise_and(
tla.shift_right(bits, 23, mask=m), tla.full(0xFF, tla.Int32)
)
同步控制
核内 / 跨核 flag、pipe barrier、mutex 与本地内存屏障。
flag
功能说明:
在两条 pipe 之间创建管内同步 flag。
函数原型:
tla.flag(name: str, src_pipe: PipeLike, dst_pipe: PipeLike) -> TlaFlag
参数说明:
name(str):管内 flag 名称。必填。src_pipe(PipeLike):源 pipe 标识(例如tla.arch.MTE2)。必填。dst_pipe(PipeLike):目的 pipe 标识(例如tla.arch.VECTOR)。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 创建的是 flag 句柄;
set_flag/wait_flag须在 cube/vector 区域内成对使用。
调用示例:
# MTE2 完成 GM→UB 拷贝后,VECTOR 侧才可消费该 UB tile。
ub_loaded = tla.flag("ub_loaded", src_pipe=tla.arch.MTE2, dst_pipe=tla.arch.VECTOR)
with tla.vector():
tla.copy(dst=x_ub, src=x_gm)
tla.set_flag(ub_loaded) # 拷贝后:标记 UB 数据就绪
tla.wait_flag(ub_loaded) # 计算前:等待就绪
cross_flag
源码: catlass.core_api.cross_flag
功能说明:
创建命名的跨核同步 flag。源/目的 pipe 由对应 set/wait 指定;mode=4 为 1:1 AIC↔AIV,并按 AIV0/AIV1 独立寻址。
函数原型:
tla.cross_flag(name: str, *, mode: int = 2) -> TlaCrossFlag
参数说明:
name(str):跨核 flag 名称。必填。mode(int):跨核同步模式。可选,默认2。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 mode仅支持 0/1/2/4;源/目的 pipe 由对应 set/wait 指定。
调用示例:
cf = tla.cross_flag("aic_aiv", mode=2)
cross_core_set_flag
源码: catlass.core_api.cross_core_set_flag
功能说明:
从指定 pipe 置位跨核 flag;mode=4 时需提供 aiv_id(0 或 1)。
函数原型:
tla.cross_core_set_flag(cross_flag_value: CrossFlagLike, pipe: PipeLike, aiv_id: int | None = None) -> None
参数说明:
cross_flag_value(CrossFlagLike):由tla.cross_flag得到的跨核 flag。必填。pipe(PipeLike):设置 flag 的 pipe。必填。aiv_id(int | None):目标 AIV 编号;缺省表示广播/默认路由。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.cube()或tla.vector()内调用;mode=4时aiv_id须为 0 或 1。
调用示例:
with tla.cube():
tla.cross_core_set_flag(cf, tla.arch.CUBE)
# mode=4: tla.cross_core_set_flag(cf, tla.arch.CUBE, aiv_id=0)
cross_core_wait_flag
源码: catlass.core_api.cross_core_wait_flag
功能说明:
在指定 pipe 上等待跨核 flag;mode=4 时需提供 aiv_id(0 或 1)。
函数原型:
tla.cross_core_wait_flag(cross_flag_value: CrossFlagLike, pipe: PipeLike, aiv_id: int | None = None) -> None
参数说明:
cross_flag_value(CrossFlagLike):由tla.cross_flag得到的跨核 flag。必填。pipe(PipeLike):执行 wait 的 pipe。必填。aiv_id(int | None):目标 AIV 编号;缺省表示广播/默认路由。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.cube()或tla.vector()内调用;mode=4时aiv_id须为 0 或 1。
调用示例:
with tla.vector():
tla.cross_core_wait_flag(cf, tla.arch.VECTOR)
set_flag
功能说明:
置位同核同步 flag。
函数原型:
tla.set_flag(flag_value: FlagLike) -> None
参数说明:
flag_value(FlagLike):由tla.flag得到的核内 pipe flag。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.cube()或tla.vector()内调用。
调用示例:
with tla.vector():
tla.set_flag(ub_loaded)
wait_flag
源码: catlass.core_api.wait_flag
功能说明:
等待同核同步 flag。
函数原型:
tla.wait_flag(flag_value: FlagLike) -> None
参数说明:
flag_value(FlagLike):由tla.flag得到的核内 pipe flag。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.cube()或tla.vector()内调用。
调用示例:
with tla.vector():
tla.wait_flag(ub_loaded)
pipe_barrier
源码: catlass.core_api.pipe_barrier
功能说明:
插入指定硬件 pipe 的屏障。
函数原型:
tla.pipe_barrier(pipe: PipeLike) -> None
参数说明:
pipe(PipeLike):要插入 barrier 的 pipe。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.cube()或tla.vector()内调用。
调用示例:
with tla.vector():
tla.pipe_barrier(tla.arch.MTE2)
mutex
功能说明:
创建与语义资源关联的 mutex 句柄。
函数原型:
tla.mutex(resource: str, id: int = -1) -> TlaMutex
参数说明:
resource(str):互斥资源名。必填。id(int):互斥实例编号;-1表示默认。可选,默认-1。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 resource非空;id为 -1 或 0..31。
调用示例:
mtx = tla.mutex("l1_buf", id=0)
mutex_guard
源码: catlass.core_api.mutex_guard
功能说明:
创建上下文管理器,对代码块自动推断 mutex 访问。
函数原型:
tla.mutex_guard(*mutexes: MutexLike) -> _MutexGuard
参数说明:
mutexes(MutexLike):一个或多个 mutex 对象。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 块内须调用
copy或mmad;guard 内不可再显式 lock/unlock。
调用示例:
with tla.mutex_guard(mtx):
tla.copy(dst, src)
mutex_lock
源码: catlass.core_api.mutex_lock
功能说明:
从指定 pipe 获取 mutex。
函数原型:
tla.mutex_lock(mutex_value: MutexLike, *, pipe: PipeLike) -> None
参数说明:
mutex_value(MutexLike):要加锁的 mutex。必填。pipe(PipeLike):加锁所在 pipe。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.cube()或tla.vector()内调用;须指定pipe。
调用示例:
tla.mutex_lock(mtx, pipe=tla.arch.MTE2)
mutex_unlock
源码: catlass.core_api.mutex_unlock
功能说明:
从指定 pipe 释放 mutex。
函数原型:
tla.mutex_unlock(mutex_value: MutexLike, *, pipe: PipeLike) -> None
参数说明:
mutex_value(MutexLike):要解锁的 mutex。必填。pipe(PipeLike):解锁所在 pipe。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.cube()或tla.vector()内调用;须指定pipe。
调用示例:
tla.mutex_unlock(mtx, pipe=tla.arch.MTE2)
local_mem_bar
源码: catlass.core_api.local_mem_bar
功能说明:
在 vec.func 内插入本地内存屏障(按 MemType 对编码)。
函数原型:
tla.local_mem_bar(src: MemType, dst: MemType)
参数说明:
src(MemType):源本地内存类型。必填。dst(MemType):目的本地内存类型。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.vec.func()内调用;(src, dst)须为支持的MemType对。
调用示例:
with tla.vec.func(mode="simd"):
tla.local_mem_bar(tla.params.MemType.VEC_STORE, tla.params.MemType.VEC_LOAD)
系统变量访问
挂在 tla.arch 上的架构属性(布局标签、pipe、block 辅助等)。
arch
功能说明:
tla.arch 下的架构属性组:layout tag、pipe 标识、片上 memory-scope token,
以及 block / SIMT 辅助接口。
函数原型:
tla.arch
参数说明:
- 布局标签(
_LayoutTag,供make_layout/make_tensor/make_tensor_like使用):RowMajor、ColumnMajor、zN、nZ、L0Clayout、zNUnAlign。 - Pipe 标识(供
flag/pipe_barrier/mutex_*/ 跨核同步使用):SCALAR、VECTOR、CUBE、MTE1、MTE2、MTE3、FIX。 - Memory-scope token(供
local_mem_bar等相关接口使用):L1、L0A、L0B、L0C、UB。 - 可调用接口(返回
Int32或如下注明的三元组):block_idx():当前 AI 核在本次 launch 中的 block 索引。block_num():本次 launch 的 block(AI 核)数量。sub_block_idx():当前 block 内的 sub-block 索引。thread_idx():SIMT thread block 内的线程索引(x, y, z)(仅可在tla.vec.func(mode="simt")内使用)。thread_block_dim():SIMT thread-block 规模(x, y, z)(仅可在tla.vec.func(mode="simt")内使用)。sync_threads():对当前 SIMTtla.vec.func内线程做 barrier(仅mode="simt")。get_capacity_in_bytes(mem_scope):返回编译目标上某片上存储空间的字节容量。入参为tla.AddressSpace(tla.AddressSpace.l1/l0a/l0b/l0c/ub)。返回普通int;host 侧与 kernel 内均可使用(kernel 内会折叠为常量)。get_dyn_ub(dtype, byte_alignment=None):返回动态 UB 区域的指针——该区域 的大小由 launch 决定,而非编译期决定。区域起始于所有tla.allocate之上, launch 时用ub=指定实际提供多少字节。每个 kernel 至多声明 一个区域:需要多块缓冲时,用指针算术在该区域内切分。按 kernel 实际使用量 申请即可——SIMT 场景下未被 kernel 占用的 UB 会成为 Data Cache,申请过多会 让 Data Cache 变小从而拖慢访存。
约束说明:
- layout tag / pipe 标识 / memory-scope token 是
tla.arch对象上的普通属性 (Python 没有 C++ 式命名空间);它们本身不会生成计算 op。 block_idx/block_num/sub_block_idx/thread_idx/thread_block_dim/sync_threads为可调用对象,须在@tla.kernel装饰的 kernel 函数体内使用。thread_idx/thread_block_dim/sync_threads还须嵌套在tla.vec.func(mode="simt")内。
调用示例:
# make_layout / make_tensor 用的 layout tag:
tag = tla.arch.RowMajor
# flag / barrier / mutex 用的 pipe 标识:
pipe = tla.arch.MTE2
# 运行时 block 辅助:
bid = tla.arch.block_idx()
nblocks = tla.arch.block_num()
# 片上存储容量(host 侧或 kernel 内均可):
l1_bytes = tla.arch.get_capacity_in_bytes(tla.AddressSpace.l1)
ub_bytes = tla.arch.get_capacity_in_bytes(tla.AddressSpace.ub)
# 动态 UB:大小在 launch 时确定,基址为编译期常量。
base = tla.arch.get_dyn_ub(tla.Float32, byte_alignment=256)
lo = tla.make_tensor_like(base, gm_a, tla.arch.RowMajor)
hi = tla.make_tensor_like(base + HALF, gm_b, tla.arch.RowMajor)
# host 侧:artifact(..., ub=64 * 1024)
资源管理
片上缓冲分配。
allocate
功能说明:
分配本地内存并返回类型化指针。
函数原型:
tla.allocate(shape: ShapeLike, dtype: type[Numeric], mem_scope: AddressSpace, byte_alignment: int) -> Pointer
参数说明:
shape(ShapeLike):分配块的形状。必填。dtype(type[Numeric]):元素数值类型。必填。mem_scope(AddressSpace):地址空间(如 L1 / UB)。必填。byte_alignment(int):字节对齐要求。必填。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 mem_scope须为片上地址空间(l1/l0a/l0b/l0c/ub),不可为 gm/generic;shape须全静态。
调用示例:
ptr = tla.allocate(
shape=(256, 128),
dtype=tla.Float16,
mem_scope=tla.AddressSpace.ub,
byte_alignment=32,
)
调试接口
kernel 内标量 / tensor 调试打印。
print
功能说明:
在 cube / vector 区域内打印标量、格式化标量字符串,或打印 GM、UB、L1、L0C tensor 的物理前缀。
函数原型:
tla.print(*args: object, **kwargs: object) -> None
参数说明:
args(object):要打印的值(可变位置参数)。必填。kwargs(object):不接受关键字参数;传入则报错。可选。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须在
tla.cube()或tla.vector()内调用。 - GM/UB 支持 rank-1/rank-2 物理前缀;L1/L0C 仅支持 C310 AIC 和经验证的 CANN 9.1 DebugTunnel ABI。
- L1 须为 32 字节对齐的 zN/nZ 稠密前缀,C0 维度占 32 字节,最多打印 8 个元素,并要求驱动提供 DebugBus HAL 映射接口。
- L0C 须为 32 字节对齐的 L0Clayout 16x16 完整分形(256 个元素);L0A/L0B 不支持。
- Tensor dtype 支持
f16、f32、i8、i16、i32、u8、u16、u32。
调用示例:
with tla.vector():
tla.print(x_scalar)
tla.print(x_ub, 64) # tensor + prefix length
作用域和控制流
Cube / Vector / vec.func 区域以及 kernel 侧循环范围。
从这些 region 内调用的外层 def、tla.Constexpr 函数入参与 @tla.jit helper,须遵守本节各 region 约束,以及所用算子条目的「约束说明」。
range
功能说明:
创建前端动态循环范围(支持 Python range 形态)。
函数原型:
tla.range(start: IndexLike, end: IndexLike | None = None, step: IndexLike | None = None) -> _ast_helpers.FrontendRange
参数说明:
start(IndexLike):循环起点(或当end缺省时的终点,此时起点为 0)。必填。end(IndexLike | None):循环终点(不含);缺省时start视为终点。可选,默认None。step(IndexLike | None):步长;缺省为 1。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 动态范围;循环体须符合前端动态 for 约束。
调用示例:
for i in tla.range(0, n, 1):
...
range_constexpr
源码: catlass.core_api.range_constexpr
功能说明:
创建前端静态范围,用于可展开的 Python 循环。
函数原型:
tla.range_constexpr(start: int, end: int | None = None, step: int | None = None) -> range
参数说明:
start(int):编译期循环起点(或当end缺省时的终点)。必填。end(int | None):编译期循环终点(不含)。可选,默认None。step(int | None):编译期步长;缺省为 1。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 起止与步长须为编译期常量,用于可展开循环。
- 边界也可来自
tla.as_numeric(...)等编译期 Numeric 值。 - 迭代次数达到 64 次及以上时发出
DSLOptimizationWarning,但继续展开;大循环应优先用tla.range(...)。
调用示例:
for k in tla.range_constexpr(0, 4):
...
cube
功能说明:
进入 cube 核区域(矩阵乘与相关搬运)。
函数原型:
tla.cube() -> TlaRegion
参数说明:
无。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 用于包裹 cube 侧矩阵乘与相关搬运。
调用示例:
with tla.cube():
tla.mmad(acc=l0c, lhs=l0a, rhs=l0b, init_c=True)
vector
功能说明:
进入 vector 核区域(vector 搬运与同步)。
函数原型:
tla.vector() -> TlaRegion
参数说明:
无。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 用于包裹 vector 侧搬运与同步;
tla.vec.func须嵌套在其内。
调用示例:
with tla.vector():
tla.copy(dst=x_ub, src=x_gm)
vec.func
源码: catlass.core_api._vec_func
功能说明:
进入寄存器 vector / mask 计算用的 vector 函数区域(tla.vec.func)。
函数原型:
tla.vec.func(*, mode: str = 'simd', thread_block_dim: int | tuple[int, int, int] | list[int] | None = None) -> TlaRegion
参数说明:
mode(str):执行模式;simd(默认)或simt。可选,默认"simd"。thread_block_dim(int | tuple[int, int, int] | list[int] | None):SIMT thread-block 形状;仅在mode="simt"时有效。可选,默认None。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用。 - 须嵌套在
tla.vector()内。 - 寄存器 vector / mask API 与
local_mem_bar须在此区域内调用。
调用示例:
with tla.vector():
with tla.vec.func(mode="simd"):
z = tla.add(x_reg, y_reg)
Tile 数据填充
对 L1 zN/nZ tensor 整 tile 填充(Tensor.fill)。
Tensor.fill
源码: catlass.tla.tensor._Tensor.fill
功能说明:
用给定值填充整个 L1 zN/nZ tile。填充区域即该 tile 自身:在逻辑二维
(M, N)轴上覆盖 [self.coord, self.coord + self.origin_shape)。
沿 layout 的 C0 轴(32 字节)会先把起点坐标向上对齐到 C0 边界再填充,
因此只写入 tile 内完整的 C0 单元;起点处不完整的部分保持不动(残差需
另途覆盖——MX pad 流程中通常由 GM→L1 copy 带入)。
以具体 fp8(一个 C0 单元 = 32 字节)zN 为例:取一个(例如经
tla.get_tile 得到的)tile,坐标 (0, 40),
origin_shape = (16, 56):
N 0 32 40 64 96
^ C0 边界:起点 40 向上对齐到 64
M
0 - - - - - - - - - - + + + + + + * * * * * * * *
1 - - - - - - - - - - + + + + + + * * * * * * * *
: (第 2 .. 14 行相同)
15 - - - - - - - - - - + + + + + + * * * * * * * *
图例:* = 设备写入:完整 C0 单元 [64, 96)(tile 末端
40 + 56 = 96 已 C0 对齐)。+ = 落在 tile 内但未写入:列 40..63 是不
完整的 C0 单元。- = tile 外。此处 M 轴无 C0 对齐:对 zN 而言 C0 轴是 N。
函数原型:
tile.fill(value: int | float) -> None
参数说明:
value(int | float):trace 期标量;当前仅支持0(设备写入全零比特模式)。
约束说明:
- 须在
@tla.kernel装饰的 kernel 函数体内调用,并嵌套在tla.cube()内。 - 目的地须为带
zN或nZ标签的 L1 tensor。 - 支持的元素类型:打包的 fp4/fp8 操作数格式
(
f4e2m1/f4e1m2/f8e4m3fn/f8e5m2),且仅支持填零。 更宽类型、8 位整数与 e8m0 scale tile 不支持。
调用示例:
# 将 L1 A tile 的 K-pad 尾部清零:先切 tile,再 fill。
pad = tla.get_tile(t_l1a, tla.make_coord(0, k_valid),
tla.make_shape(m, k_l0 - k_valid))
pad.fill(0)