向量加法
本教程演示如何编写您的第一个 Tileon 内核进行向量加法。
前置条件
- 已安装 Tileon(参见 安装)
- 具备 Python 基础
基本示例
这是一个简单的向量加法内核:
import torch
import tileon
import tileon.language as tl
DEVICE = torch.device("cpu")
@tileon.jit
def add_kernel(x_ptr, y_ptr, output_ptr, n_elements, BLOCK_SIZE: tl.constexpr):
pid = tl.program_id(axis=0)
block_start = pid * BLOCK_SIZE
offsets = block_start + tl.arange(0, BLOCK_SIZE)
mask = offsets < n_elements
x = tl.load(x_ptr + offsets, mask=mask)
y = tl.load(y_ptr + offsets, mask=mask)
output = x + y
tl.store(output_ptr + offsets, output, mask=mask)
def add(x: torch.Tensor, y: torch.Tensor):
output = torch.empty_like(x)
n_elements = output.numel()
grid = lambda meta: (tileon.cdiv(n_elements, meta['BLOCK_SIZE']), )
add_kernel[grid](x, y, output, n_elements, BLOCK_SIZE=1024)
return output
代码说明
-
内核定义:
@tileon.jit装饰器将内核编译为优化代码。 -
程序 ID:
tl.program_id(axis=0)返回每个程序实例的唯一 ID。 -
索引计算:
offsets计算此程序实例处理哪些元素。 -
内存操作:
tl.load使用掩码从内存读取数据,处理边界条件-
tl.store将结果写回内存 -
网格启动:
grid函数决定启动多少个程序实例。
运行示例
练习
- 修改内核改为向量乘法而不是加法
- 更改 BLOCK_SIZE 并观察性能差异
- 添加第三个输入向量并执行三个向量的逐元素加法