tvm.tir.analysis
包装现有的分析工具。
- tvm.tir.analysis.analysis.expr_deep_equal(lhs: PrimExpr, rhs: PrimExpr) bool
深度比较两个嵌套的表达式。
注意
此函数不重新映射变量绑定,它不会为 (let x = 1 in x + 1) 与 (let y = 1 in y + 1) 返回 true,除非 x.same_as(y)。使用 py:func:tvm.ir.structural_equal 来处理结构变量重映射。
由于不重新映射变量的限制,此函数可以比 StructuralEqual 运行得更快,并且可以用作算术简化期间的实用函数。
始终首先考虑 py:func:tvm.ir.structural_equal,它处理结构重映射。
- tvm.tir.analysis.analysis.verify_ssa(func: PrimFunc) bool
验证 func 是否为 SSA 形式。
- 参数:
func (tvm.tir.PrimFunc) – 要验证的模块。
- 返回值:
result – 验证结果。
- 返回类型:
- tvm.tir.analysis.analysis.verify_memory(func: PrimFunc) bool
验证 func 是否包含非法的主机端直接内存访问。
- 参数:
func (tvm.tir.PrimFunc) – 要验证的模块。
- 返回值:
result – 验证结果。
- 返回类型:
- tvm.tir.analysis.analysis.verify_gpu_code(func: PrimFunc, constraints: Dict[str, int]) None
验证模块是否包含非法的主机端直接内存访问。
- 参数:
func (tvm.tir.PrimFunc) – 要验证的模块。
- 返回值:
result – 验证结果。
- 返回类型:
- tvm.tir.analysis.analysis.get_block_access_region(block: Block, buffer_var_map: Dict[Var, Buffer]) List[List[BufferRegion]]
- 检测此块中张量的哪些区域被读取或写入。
区域按其在 AST 中出现的顺序排序。
- 参数:
block (tvm.tir.Block) – 我们在其中检测读/写区域的块。
buffer_var_map (Dict[tir.Var, Buffer]) – 可能访问该块的外部缓冲区。从缓冲区变量到缓冲区的映射
- 返回值:
result –
- 访问区域数组。有三个 BufferRegion 数组
第一个:读取区域
第二个:写入区域
第三个:不透明区域
- 返回类型:
List[List[BufferRegion]]
- tvm.tir.analysis.analysis.get_block_read_write_region(block: Block, buffer_var_map: Dict[Var, Buffer]) List[List[BufferRegion]]
- 根据块的主体语句自动检测块的读/写区域。
不透明访问将被计为读取和写入访问
- 参数:
block (tvm.tir.Block) – 我们在其中检测读/写区域的块。
buffer_var_map (Dict[tir.Var, Buffer]) – 可能访问该块的外部缓冲区。从缓冲区变量到缓冲区的映射
- 返回值:
result – 仅包含输入块的读取区域和写入区域的数组
- 返回类型:
List[List[BufferRegion]]
- tvm.tir.analysis.analysis.calculate_allocated_bytes(func_or_mod: PrimFunc | IRModule) Dict[str, int] | Dict[str, Dict[str, int]]
计算 TIR PrimFuncs 所需的每个内存范围的已分配内存。
- tvm.tir.analysis.analysis.detect_buffer_access_lca(func: PrimFunc) Dict[Buffer, Stmt]
检测缓冲区访问的最低公共祖先 (LCA),包括高级访问(BufferLoad、BufferStore)和低级访问(BufferLoad、BufferStore 和不透明访问)。LCA 可以是 For 循环或 Block。
- 参数:
func (tvm.tir.PrimFunc) – 要检测的函数。
- 返回值:
result – 从缓冲区到对其所有访问的 LCA 的映射。
- 返回类型:
- tvm.tir.analysis.analysis.estimate_tir_flops(stmt_or_mod: Stmt | IRModule) float
估计 TIR 片段的 FLOPs。
- tvm.tir.analysis.analysis.undefined_vars(node: Stmt | PrimExpr, defs: List[Var] | None = None) List[Var]
在 TIR 语句或表达式中查找未定义的变量。
- tvm.tir.analysis.analysis.verify_well_formed(obj: PrimFunc | IRModule, assert_mode: bool = True) bool
- 验证给定的 TIR 是否格式良好。验证包括
检查表达式是否不包含在块外部定义的变量。
- 参数:
obj (Union[tvm.tir.PrimFunc, tvm.ir.IRModule]) – 要验证的函数或模块。
assert_mode (bool) – 指示函数格式不正确时是否引发错误。
- 返回值:
result – 它是否是格式良好的 TIR 函数。
- 返回类型:
- tvm.tir.analysis.analysis.OOBChecker()
检测数组中的越界内存访问。
- 返回值:
fpass – 结果 pass
- 返回类型:
- tvm.tir.analysis.analysis.find_anchor_block(mod: IRModule) Block
查找给定模块的“锚定块”。
我们将锚定块定义为具有 (1) 初始化语句和 (2) 具有最大 flops 计数的块。后一个条件仅在有多个具有初始化语句的块时使用。
例如,如果输入模块是 conv2d + 融合空间块,则 conv2d 是锚定块。输入模块可能不包含多个这样的块。例如,具有两个 conv2d 的模块不允许作为输入。
但是,从 Winograd 卷积创建的模块具有多个带有初始化语句的块(输入变换、批量 GEMM 和输出变换)。我们使用第二个条件,即 flops 计数,来确定批量 GEMM 块是锚定块。
- 参数:
mod (tvm.ir.IRModule) – 输入 TIR 模块。
- 返回值:
anchor_block – 如果找到锚定块,否则为 None。
- 返回类型:
- tvm.tir.analysis.analysis.get_vtcm_compaction_passes() List[Pass]
用于获取要应用于计算压缩 VTCM 分配大小的 lowering passes 列表的实用函数
- 返回值:
result – 返回 passes 列表
- 返回类型:
List[tvm.transform.Pass]