tvm.te
张量表达式语言的命名空间
功能:
|
创建一个新表达式,表示参数中所有条件的并集 |
|
创建一个新表达式,表示所有条件的交集 |
|
数据类型的最小值 |
|
数据类型的最大值 |
|
在运行时追踪张量数据。 |
|
对输入x取指数。 |
|
对输入x取高斯误差函数。 |
|
对输入x取双曲正切tanh。 |
|
快速获取sigmoid值的函数 |
|
对输入x取对数。 |
|
计算输入x的正切值。 |
|
计算输入x的余弦值。 |
|
计算输入x的正弦值。 |
|
对输入x取平方根。 |
|
取输入x的平方根的倒数。 |
|
对浮点输入x取地板值。 |
|
对浮点输入x取上界。 |
|
计算输入x的双曲正弦值。 |
|
计算输入x的双曲余弦值。 |
|
对输入x取以2为底的对数。 |
|
对输入x取以10为底的对数。 |
|
取输入x的asin值。 |
|
对输入x取反双曲正弦函数asinh。 |
|
计算输入x的反余弦值。 |
|
计算输入x的反余弦值。 |
|
计算输入x的反正切值。 |
|
对输入x取反双曲正切。 |
|
获取输入的截断值。 |
|
获取输入元素的逐元素绝对值。 |
|
将数组中的元素四舍五入到最接近的整数。 |
|
将数组中的元素四舍五入到最接近的整数。 |
|
x的y次方 |
|
计算输入x中置位(set bit)的数量。 |
|
返回x除以y的余数,其符号与x相同。 |
|
条件选择表达式。 |
|
检查输入值是否为NaN。 |
|
检查输入值是否为有限值。 |
|
检查输入值是否为无穷大。 |
|
按照C/C++语义计算a / b。 |
|
计算 floor(a / b),其中 a 和 b 为非负数。 |
|
计算indexdiv的余数。 |
|
计算两个表达式的截断除法。 |
|
计算两个表达式的截断模。 |
|
计算两个表达式的向下取整除。 |
|
计算两个表达式的取模运算结果。 |
|
为归约操作创建一个可交换的归约器。 |
|
在轴上创建一个最小表达式。 |
|
创建一个沿轴的最大值表达式。 |
|
创建一个沿轴求和的表达式。 |
|
通用加法运算符。 |
|
通用减法运算符。 |
|
通用乘法运算符。 |
|
操作符标签的作用范围。 |
|
构造一个空的张量对象。 |
|
通过计算形状域构造一个新的张量。 |
|
通过沿轴扫描构建新的张量。 |
|
通过外部函数计算多个张量。 |
|
创建一个具有指定名称和数据类型的新变量 |
|
创建一个新变量表示张量形状大小,该大小必须为非负数。 |
|
创建一个具有指定值和数据类型的新常量 |
|
创建一个新的IterVar来表示线程索引。 |
|
创建一个新的归约迭代变量。 |
|
从张量表达式创建TensorIR PrimFunc |
|
通过可调度的TIR PrimFunc计算张量 |
类:
|
用于支持张量切片语法的辅助数据结构。 |
张量对象,要构造它,请参见function.Tensor |
|
占位符操作。 |
|
标量运算。 |
|
扫描操作。 |
|
外部操作。 |
- tvm.te.any(*args, span=None)
创建一个新表达式,表示参数中所有条件的并集
- Parameters:
- Returns:
expr – 表达式
- Return type:
表达式
- tvm.te.all(*args, span=None)
- Create a new expression of the intersection of all conditions in the
参数
- Parameters:
- Returns:
expr – 表达式
- Return type:
表达式
- tvm.te.min_value(dtype, span=None)
数据类型的最小值
- Parameters:
- Returns:
value – dtype的最小值。
- Return type:
tvm.Expr
- tvm.te.max_value(dtype: str, span: Span | None = None) 任意
数据类型的最大值
- Parameters:
- Returns:
value – dtype的最大值。
- Return type:
tvm.Expr
- tvm.te.trace(args, trace_action='tvm.default_trace_action')
在运行时追踪张量数据。
trace函数允许在运行时追踪特定的张量。追踪值应作为最后一个参数传入。需要指定追踪动作,默认情况下会使用tvm.default_trace_action。
- Parameters:
args (list of Expr or Buffers.) - 位置参数。
trace_action (str.) – 追踪动作的名称。
- Returns:
call – 调用表达式。
- Return type:
另请参阅
tvm.tir.call_packed创建打包函数。
- tvm.te.exp(x)
对输入x取指数。
- tvm.te.erf(x)
对输入x取高斯误差函数。
- tvm.te.tanh(x)
对输入x取双曲正切tanh。
- tvm.te.sigmoid(x)
快速获取sigmoid值的函数
- tvm.te.log(x)
对输入x取对数。
- tvm.te.tan(x)
计算输入x的正切值。
- tvm.te.cos(x)
计算输入x的余弦值。
- tvm.te.sin(x)
计算输入x的正弦值。
- tvm.te.sqrt(x)
对输入x取平方根。
- tvm.te.rsqrt(x)
取输入x的平方根的倒数。
- tvm.te.floor(x: PrimExprWithOp, span=None)
对浮点输入x取地板值。
- Parameters:
- Returns:
y – 结果。
- Return type:
- tvm.te.ceil(x, span=None)
对浮点输入x取上界。
- Parameters:
- Returns:
y – 结果。
- Return type:
- tvm.te.sinh(x)
计算输入x的双曲正弦值。
tvm.tir.sinh()的别名
- tvm.te.cosh(x)
计算输入x的双曲余弦值。
- tvm.te.log2(x)
对输入x取以2为底的对数。
- tvm.te.log10(x)
对输入x取以10为底的对数。
- tvm.te.asin(x)
取输入x的asin值。
- tvm.te.asinh(x)
对输入x取反双曲正弦函数asinh。
- tvm.te.acos(x)
计算输入x的反余弦值。
- tvm.te.acosh(x)
计算输入x的反余弦值。
- tvm.te.atan(x)
计算输入x的反正切值。
- tvm.te.atanh(x)
对输入x取反双曲正切。
- tvm.te.trunc(x, span=None)
获取输入的截断值。
标量x的截断值是最接近零的整数i,且i比x更接近零。
- Parameters:
- Returns:
y – 结果。
- Return type:
- tvm.te.abs(x, span=None)
获取输入元素的逐元素绝对值。
- Parameters:
- Returns:
y – 结果。
- Return type:
- tvm.te.round(x, span=None)
将数组中的元素四舍五入到最接近的整数。
- Parameters:
- Returns:
y – 结果。
- Return type:
- tvm.te.nearbyint(x, span=None)
将数组元素四舍五入到最接近的整数。 此内置函数使用llvm.nearbyint而非llvm.round, 虽然速度更快但结果会与te.round不同。 值得注意的是nearbyint会根据舍入模式进行舍入, 而te.round(llvm.round)会忽略这一点。 两者差异详见: https://en.cppreference.com/w/cpp/numeric/math/round https://en.cppreference.com/w/cpp/numeric/math/nearbyint
- Parameters:
- Returns:
y – 结果。
- Return type:
- tvm.te.power(x, y, span=None)
x的y次方
- Parameters:
- Returns:
z – 结果。
- Return type:
- tvm.te.popcount(x)
计算输入x中置位(set bit)的数量。
- tvm.te.fmod(x, y)
返回x除以y的余数,其符号与x相同。
- tvm.te.if_then_else(cond, t, f, span=None)
条件选择表达式。
- Parameters:
- Returns:
result – 条件表达式的结果。
- Return type:
注意
与Select不同,if_then_else不会执行不满足条件的分支。 您可以用它来防止越界访问。 与Select不同,当向量中的某些通道具有不同条件时, if_then_else无法被向量化。
- tvm.te.isnan(x, span=None)
检查输入值是否为NaN。
- Parameters:
- Returns:
y – 结果。
- Return type:
- tvm.te.isfinite(x, span=None)
检查输入值是否为有限值。
- Parameters:
- Returns:
y – 结果。
- Return type:
- tvm.te.isinf(x, span=None)
检查输入值是否为无穷大。
- Parameters:
- Returns:
y – 结果。
- Return type:
- tvm.te.div(a, b, span=None)
按照C/C++语义计算a / b。
- Parameters:
- Returns:
res – 结果表达式。
- Return type:
注意
当操作数为整数时,返回 truncdiv(a, b, span)。
- tvm.te.indexdiv(a, b, span=None)
计算 floor(a / b),其中 a 和 b 为非负数。
- Parameters:
- Returns:
res – 结果表达式。
- Return type:
注意
使用此函数来分割非负索引。 该函数可以利用操作数的非负性特性。
- tvm.te.indexmod(a, b, span=None)
计算indexdiv的余数。a和b为非负数。
- Parameters:
- Returns:
res – 结果表达式。
- Return type:
注意
使用此函数来分割非负索引。 该函数可以利用操作数的非负性特性。
- tvm.te.truncdiv(a, b, span=None)
计算两个表达式的截断除法。
- Parameters:
- Returns:
res – 结果表达式。
- Return type:
注意
这是C语言中默认的整数除法行为。
- tvm.te.truncmod(a, b, span=None)
计算两个表达式的截断模。
- Parameters:
- Returns:
res – 结果表达式。
- Return type:
注意
这是C语言中默认的整数除法行为。
- tvm.te.floordiv(a, b, span=None)
计算两个表达式的向下取整除。
- Parameters:
- Returns:
res – 结果表达式。
- Return type:
- tvm.te.floormod(a, b, span=None)
计算两个表达式的取模运算结果。
- Parameters:
- Returns:
res – 结果表达式。
- Return type:
- tvm.te.comm_reducer(fcombine, fidentity, name='reduce')
为归约操作创建一个可交换的归约器。
- Parameters:
fcombine (function(Expr -> Expr -> Expr)) – 一个二元函数,接收两个Expr作为输入并返回一个Expr。
fidentity (function(str -> Expr)) – 一个接收类型字符串作为输入并返回常量表达式的函数。
- Returns:
reducer – 一个用于创建轴上的归约表达式的函数。 有两种使用方式:
接受 (expr, axis, where) 参数,在指定轴上生成 Reduce Expr;
简单地与多个 Exprs 一起使用。
- Return type:
函数
示例
n = te.var("n") m = te.var("m") mysum = te.comm_reducer(lambda x, y: x+y, lambda t: tvm.tir.const(0, dtype=t), name="mysum") A = te.placeholder((n, m), name="A") k = te.reduce_axis((0, m), name="k") B = te.compute((n,), lambda i: mysum(A[i, k], axis=k), name="B")
- tvm.te.min(expr, axis, where=None, init=None, *args)
在轴上创建一个最小表达式。
- Parameters:
- Returns:
value – 结果值。
- Return type:
示例
m = te.var("m") n = te.var("n") A = te.placeholder((m, n), name="A") k = te.reduce_axis((0, n), name="k") # there are two way to use this min reducer: # mode 1, accept (expr, axis, where) to produce an Reduce Expr # tvm.min represents tvm.te.min or tvm.tir.min. B = te.compute((m,), lambda i: tvm.min(A[i, k], axis=k), name="B") # mode 2, simply use it with multiple Exprs: min_res = tvm.min(m, n)
- tvm.te.max(expr, axis, where=None, init=None, *args)
创建一个沿轴的最大值表达式。
- Parameters:
- Returns:
value – 结果值。
- Return type:
示例
m = te.var("m") n = te.var("n") A = te.placeholder((m, n), name="A") k = te.reduce_axis((0, n), name="k") # there are two way to use this max reducer: # mode 1, accept (expr, axis, where) to produce an Reduce Expr # tvm.max represents tvm.te.max or tvm.tir.max. B = te.compute((m,), lambda i: tvm.max(A[i, k], axis=k), name="B") # mode 2, simply use it with multiple Exprs: max_res = tvm.max(m, n)
- tvm.te.sum(expr, axis, where=None, init=None, *args)
创建一个沿轴求和的表达式。
- Parameters:
- Returns:
value – 结果值。
- Return type:
示例
m = te.var("m") n = te.var("n") A = te.placeholder((m, n), name="A") k = te.reduce_axis((0, n), name="k") # there are two way to use this sum reducer: # mode 1, accept (expr, axis, where) to produce an Reduce Expr # tvm.sum represents tvm.te.sum or tvm.tir.sum. B = te.compute((m,), lambda i: tvm.sum(A[i, k], axis=k), name="B") # mode 2, simply use it with multiple Exprs: sum_res = tvm.sum(m, n)
- tvm.te.add(lhs, rhs, span=None)
通用加法运算符。
- Parameters:
- Returns:
op – 加法运算的结果表达式。
- Return type:
tvm.Expr
- tvm.te.subtract(lhs, rhs, span=None)
通用减法运算符。
- Parameters:
- Returns:
op – 减法运算的结果表达式。
- Return type:
tvm.Expr
- tvm.te.multiply(lhs, rhs, span=None)
通用乘法运算符。
- Parameters:
- Returns:
op – 乘法运算的结果表达式。
- Return type:
tvm.Expr
- class tvm.te.TensorSlice(tensor, indices)
用于支持张量切片语法的辅助数据结构。
方法:
asobject()将切片转换为对象。
属性:
张量的数据内容。
- asobject()
将切片转换为对象。
- property dtype
张量的数据内容。
- class tvm.te.Tensor
张量对象,要构造它,请参见function.Tensor
属性:
张量的维度。
张量的轴。
对应的
Operation。输出值索引对应的张量。
张量的输出形状。
- property ndim
张量的维度。
- property axis
张量的轴。
- property op
对应的
Operation。
- property value_index
张量对应的输出值索引。
- property shape
张量的输出形状。
- tvm.te.tag_scope(tag)
操作符标签的作用范围。
- Parameters:
标签 (str) – 标签名称。
- Returns:
tag_scope – 标签作用域对象,可用作装饰器或上下文管理器。
- Return type:
TagScope
示例
n = te.var('n') m = te.var('m') l = te.var('l') A = te.placeholder((n, l), name='A') B = te.placeholder((m, l), name='B') k = te.reduce_axis((0, l), name='k') with tvm.te.tag_scope(tag='matmul'): C = te.compute((n, m), lambda i, j: te.sum(A[i, k] * B[j, k], axis=k)) # or use tag_scope as decorator @tvm.te.tag_scope(tag="conv") def compute_relu(data): return te.compute(data.shape, lambda *i: tvm.tir.Select(data(*i) < 0, 0.0, data(*i)))
- tvm.te.placeholder(shape, dtype=None, name='placeholder')
构造一个空的张量对象。
- tvm.te.compute(shape, fcompute, name='compute', tag='', attrs=None, varargs_names=None)
通过计算形状域构造一个新的张量。
计算规则是 result[axis] = fcompute(axis)
- Parameters:
- Returns:
tensor – 创建的张量
- Return type:
- tvm.te.scan(init, update, state_placeholder, inputs=None, name='scan', tag='', attrs=None)
通过沿轴扫描构建新的张量。
- Parameters:
- Returns:
tensor – 创建的张量或张量元组包含多个输出。
- Return type:
示例
# The following code is equivalent to numpy.cumsum m = te.var("m") n = te.var("n") X = te.placeholder((m, n), name="X") s_state = te.placeholder((m, n)) s_init = te.compute((1, n), lambda _, i: X[0, i]) s_update = te.compute((m, n), lambda t, i: s_state[t-1, i] + X[t, i]) res = tvm.te.scan(s_init, s_update, s_state, X)
- tvm.te.extern(shape, inputs, fcompute, name='extern', dtype=None, in_buffers=None, out_buffers=None, tag='', attrs=None)
通过外部函数计算多个张量。
- Parameters:
fcompute (lambda函数,参数为inputs和outputs-> stmt) –
指定执行计算的IR语句。 关于fcompute的函数签名,请参阅以下说明
注意
参数
ins (
tvm.tir.Buffer列表) - 每个输入的占位符outs (
tvm.tir.Buffer列表) - 每个输出的占位符
返回值
stmt (
tvm.tir.Stmt) - 执行数组计算的语句。
name (str, optional) – 张量的名称提示
dtype (str 或 list 包含 str, 可选) – 输出的数据类型, 默认情况下dtype将与输入保持一致。
in_buffers (tvm.tir.Buffer 或 list 的 tvm.tir.Buffer, 可选) – 输入缓冲区。
out_buffers (tvm.tir.Buffer or list of tvm.tir.Buffer, optional) – 输出缓冲区。
- tag: str, optional
关于计算的附加标签信息。
- attrs: dict, optional
关于计算的额外辅助属性。
示例
在下面的代码中,C是通过调用外部PackedFunc tvm.contrib.cblas.matmul生成的
A = te.placeholder((n, l), name="A") B = te.placeholder((l, m), name="B") C = te.extern((n, m), [A, B], lambda ins, outs: tvm.tir.call_packed( "tvm.contrib.cblas.matmul", ins[0], ins[1], outs[0], 0, 0), name="C")
- tvm.te.var(name='tindex', dtype='int32', span=None)
创建一个具有指定名称和数据类型的新变量
- tvm.te.size_var(name='size', dtype='int32', span=None)
创建一个新变量表示张量形状大小,该大小必须为非负数。
- tvm.te.const(value, dtype='int32', span=None)
创建一个具有指定值和数据类型的新常量
- tvm.te.thread_axis(dom=None, tag='', name='', span=None)
创建一个新的IterVar来表示线程索引。
- tvm.te.reduce_axis(dom, name='rv', thread_tag='', span=None)
创建一个新的归约迭代变量。
- tvm.te.create_prim_func(ops: 列表[张量 | 变量], index_dtype_override: str | None = None) PrimFunc
从张量表达式创建TensorIR PrimFunc
- Parameters:
ops (List[Union[_tensor.Tensor, tvm.tir.Var]]) – 源表达式。
示例
我们使用以下代码定义一个矩阵乘法内核:
import tvm from tvm import te from tvm.te import create_prim_func import tvm.script A = te.placeholder((128, 128), name="A") B = te.placeholder((128, 128), name="B") k = te.reduce_axis((0, 128), "k") C = te.compute((128, 128), lambda x, y: te.sum(A[x, k] * B[y, k], axis=k), name="C") func = create_prim_func([A, B, C]) print(func.script())
如果我们想使用TensorIR调度来对此类内核进行转换,需要通过create_prim_func([A, B, C])创建一个可调度的PrimFunc。生成的函数如下所示:
@T.prim_func def tir_matmul(a: T.handle, b: T.handle, c: T.handle) -> None: A = T.match_buffer(a, (128, 128)) B = T.match_buffer(b, (128, 128)) C = T.match_buffer(c, (128, 128)) for i, j, k in T.grid(128, 128, 128): with T.block(): vi, vj, vk = T.axis.remap("SSR", [i, j, k]) with T.init(): C[vi, vj] = 0.0 C[vi, vj] += A[vi, vk] * B[vj, vk]
- Returns:
func – 创建的函数。
- Return type:
- tvm.te.extern_primfunc(input_tensors: 列表[张量], primfunc: PrimFunc, **kwargs)
通过可调度的TIR PrimFunc计算张量
- Parameters:
- Returns:
tensor – 创建的张量,如果包含多个输出则为张量元组。
- Return type:
示例
在下面的代码中,一个TVMScript定义的TIR PrimFunc被内联到一个TE ExternOp中。对此应用te.create_prim_func
A = te.placeholder((128, 128), name="A") B = te.placeholder((128, 128), name="B") @T.prim_func def before_split(a: T.handle, b: T.handle) -> None: A = T.match_buffer(a, (128, 128)) B = T.match_buffer(b, (128, 128)) for i, j in T.grid(128, 128): with T.block("B"): vi, vj = T.axis.remap("SS", [i, j]) B[vi, vj] = A[vi, vj] * 2.0 C = te.extern_primfunc([A, B], func)
- class tvm.te.PlaceholderOp
占位符操作。
- class tvm.te.ComputeOp
标量运算。
- class tvm.te.ExternOp
外部操作。