tvm.tir.analysis

包装现有的分析工具。

tvm.tir.analysis.analysis.expr_deep_equal(lhs: PrimExpr, rhs: PrimExpr) bool

深度比较两个嵌套的表达式。

参数:
返回值:

result – 比较结果

返回类型:

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 – 验证结果。

返回类型:

bool

tvm.tir.analysis.analysis.verify_memory(func: PrimFunc) bool

验证 func 是否包含非法的主机端直接内存访问。

参数:

func (tvm.tir.PrimFunc) – 要验证的模块。

返回值:

result – 验证结果。

返回类型:

bool

tvm.tir.analysis.analysis.verify_gpu_code(func: PrimFunc, constraints: Dict[str, int]) None

验证模块是否包含非法的主机端直接内存访问。

参数:
返回值:

result – 验证结果。

返回类型:

bool

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 所需的每个内存范围的已分配内存。

参数:

func_or_mod (Union[PrimFunc, IRModule]) – 要检测的函数或模块。如果传递模块,则会计算模块内所有 PrimFunc 的已分配内存

返回值:

result – IRModule 中每个函数的每个范围的已分配内存大小(以字节为单位),以函数名称作为键和已分配大小的字典作为值的字典形式返回。如果传递单个 PrimFunc,则函数名称将作为“main”返回

返回类型:

Union[Dict[str, int], Dict[str, Dict[str, int]]]

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 的映射。

返回类型:

Dict[Buffer, Stmt]

tvm.tir.analysis.analysis.estimate_tir_flops(stmt_or_mod: Stmt | IRModule) float

估计 TIR 片段的 FLOPs。

参数:

stmt_or_mod (Union[Stmt, IRModule]) – 要估计的 TIR 片段或 IRModule。

返回值:

flops – 估计的 FLOPs。

返回类型:

float

tvm.tir.analysis.analysis.undefined_vars(node: Stmt | PrimExpr, defs: List[Var] | None = None) List[Var]

在 TIR 语句或表达式中查找未定义的变量。

参数:
  • node (Union[Stmt, PrimExpr]) – 要检查的 TIR 语句或表达式。

  • defs (Optional[List[tir.Var]]) – 已定义的变量

返回值:

result – 未定义的变量。

返回类型:

List[tir.Var]

tvm.tir.analysis.analysis.verify_well_formed(obj: PrimFunc | IRModule, assert_mode: bool = True) bool
验证给定的 TIR 是否格式良好。验证包括
  • 检查表达式是否不包含在块外部定义的变量。

参数:
返回值:

result – 它是否是格式良好的 TIR 函数。

返回类型:

bool

tvm.tir.analysis.analysis.OOBChecker()

检测数组中的越界内存访问。

返回值:

fpass – 结果 pass

返回类型:

tvm.transform.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。

返回类型:

Block

tvm.tir.analysis.analysis.get_vtcm_compaction_passes() List[Pass]

用于获取要应用于计算压缩 VTCM 分配大小的 lowering passes 列表的实用函数

返回值:

result – 返回 passes 列表

返回类型:

List[tvm.transform.Pass]

tvm.tir.analysis.analysis.is_pure_function(func: PrimFunc) bool

检查函数是否为纯函数

tvm.tir.analysis.analysis.assert_pure_function(func: PrimFunc) bool

断言函数是纯函数