用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/mindspore-ai/akg --skill tilelang-cuda-api命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
基于 SOC 职业分类
| name | tilelang-cuda-api |
| description | TileLang CUDA API 完整参考手册,适用于需要查阅具体 API 用法、了解函数参数含义的任意 TileLang CUDA 内核代码生成场景 |
| category | fundamental |
| version | 1.0.0 |
| metadata | {"backend":"cuda","dsl":"tilelang_cuda"} |
本文档提供 TileLang 核心 API 的详细参考,包括函数签名、参数说明和使用示例。
@tilelang.jit(out_idx=[-1])
def my_kernel(M, N, K, block_M, block_N, block_K):
@T.prim_func
def main(
A: T.Tensor((M, K), "float16"),
B: T.Tensor((K, N), "float16"),
C: T.Tensor((M, N), "float16"),
):
# 内核实现
pass
return main
out_idx - 指定输出张量的索引列表(如 [-1] 表示最后一个参数为输出)out_idx 后,运行内核时只需传入输入张量,输出由 TileLang 自动创建kernel = tilelang.compile(my_func, out_idx=[-1])
@tilelang.jit)with T.Kernel(T.ceildiv(N, block_N), T.ceildiv(M, block_M), threads=128) as (bx, by):
# bx, by 对应 blockIdx.x, blockIdx.y
pass
grid_x: 网格 X 维度大小grid_y: 网格 Y 维度大小(可选)threads: 每个线程块的线程数(bx, by)grid_size = T.ceildiv(N, block_N)
a, b - 被除数和除数A_shared = T.alloc_shared((block_M, block_K), "float16")
shape: 张量形状dtype: 数据类型C_local = T.alloc_fragment((block_M, block_N), "float")
shape: 张量形状dtype: 数据类型temp = T.alloc_local((1,), "float32")
shape: 张量形状dtype: 数据类型# 全局内存到共享内存
T.copy(A[by * block_M, ko * block_K], A_shared)
# 寄存器到全局内存
T.copy(C_local, C[by * block_M, bx * block_N])
src: 源数据(可以是全局内存切片或寄存器片段)dst: 目标数据T.clear(C_local)
tensor - 要清零的张量T.fill(buffer, -T.infinity("float"))
tensor: 目标张量value: 填充值for ko in T.Pipelined(T.ceildiv(K, block_K), num_stages=3):
T.copy(A[by * block_M, ko * block_K], A_shared)
T.gemm(A_shared, B_shared, C_local)
count: 循环次数num_stages: 流水线深度(通常 2-4 效果最好)# 单维度并行
for i in T.Parallel(block_M):
pass
# 多维度并行
for i, j in T.Parallel(block_M, block_N):
C_local[i, j] = A_shared[i, j] + B_shared[i, j]
for k in T.serial(block_K):
pass
count - 循环次数for k in T.vectorized(TILE_K):
A_local[k] = A[bk * BLOCK_K + tk * TILE_K + k]
count - 向量化长度# 基础矩阵乘法
T.gemm(A_shared, B_shared, C_local)
# 带转置的矩阵乘法
T.gemm(Q_shared, K_shared, acc_s, transpose_B=True)
# 指定 Warp 策略
T.gemm(A_shared, B_shared, C_local, policy=T.GemmWarpPolicy.FullRow)
A, B: 输入矩阵(通常为共享内存)C: 输出/累加器(通常为寄存器片段)transpose_B: 是否转置 B 矩阵policy: Warp 策略T.reduce_max(acc_s, scores_max, dim=1)
T.reduce_max(acc_s, scores_max, dim=1, clear=False)
input: 输入张量output: 输出张量dim: 归约维度clear: 是否先清零输出(默认 True)T.reduce_sum(acc_s, scores_sum, dim=1)
T.reduce_maxT.reduce_min(input_tensor, output_tensor, dim=axis)
T.reduce_mean(input_tensor, output_tensor, dim=axis)
T.exp(x) # 指数函数
T.exp2(x) # 以 2 为底的指数
T.log(x) # 自然对数
T.sqrt(x) # 平方根
T.rsqrt(x) # 平方根倒数
T.infinity(dtype) # 无穷大常量
result = T.if_then_else(A[idx] > 0, A[idx] + B[idx], A[idx] - B[idx])
for i in T.Parallel(block_M):
if i < N:
# 有条件的操作
pass
T.atomic_add(C_shared[tn], C_accum[0])
target: 目标内存位置value: 要添加的值for tn in T.Parallel(BLOCK_N):
# tn 对应 threadIdx.x
pass
# 可能导致问题,不推荐使用
tn = T.get_thread_binding(0) # threadIdx.x
tk = T.get_thread_binding(1) # threadIdx.y
T.sync_threads() # 所有线程都必须执行此操作
@T.macro
def Softmax(acc_s, acc_s_cast, scores_max, scores_sum):
T.reduce_max(acc_s, scores_max, dim=1)
for i, j in T.Parallel(block_M, block_N):
acc_s[i, j] = T.exp(acc_s[i, j] - scores_max[i])
T.reduce_sum(acc_s, scores_sum, dim=1)
T.copy(acc_s, acc_s_cast)
from tilelang.intrinsics import make_mma_swizzle_layout
T.annotate_layout({
A_shared: make_mma_swizzle_layout(A_shared),
B_shared: make_mma_swizzle_layout(B_shared),
})
T.use_swizzle(panel_size=10, enable=True)
result = A[i].astype("float") * B[i].astype("float")
normalized.astype("float16")
float16: 半精度浮点数float32: 单精度浮点数bfloat16: Brain Float 16int8: 8 位整数int32: 32 位整数float / float32: 单精度浮点数(推荐用于累加器).astype() 指定T.Parallel 并行化数据复制,利用 T.Pipelined 重叠操作T.gemm、T.reduce_sum 等优化原语,避免重复实现已有功能T.sync_threads() 会导致死锁T.get_thread_binding() 而非 T.Parallel()