new_stmt_scope
功能说明
代表一个c语言的大括号,new_stmt_scope范围内空间代表一个新作用域。disable_sync配置是否在当前作用域内自动插入同步指令。
当API之间有数据依赖时,确保前一个API执行完,再执行后一个API,就需要在API之间插入同步指令;如果API之间没有数据依赖,则可以不插入同步指令。disable_sync配置为False时,系统会自动判断是否需要插入同步指令;如果用户能够确保当前API之间没有数据依赖,则可以配置disable_sync为True,不插入同步指令,算子性能会更高,但准确性需要用户自行保证。
函数原型
new_stmt_scope(disable_sync=False)
参数说明
参数名称 |
输入/输出 |
含义 |
---|---|---|
disable_sync |
输入 |
配置是否在当前作用域内自动插入同步指令。 如果为True,则不会自动插入同步指令。算子开发者需要确保API之间没有数据依赖,否则可能导致功能错误。 如果为False,则系统自动判断是否插入同步指令。当API之间有数据依赖时,系统会自动插入同步指令。 默认为False。 |
支持的芯片型号
Atlas 200/500 A2推理产品
注意事项
- 在new_stmt_scope内的定义的tensor,离开new_stmt_scope后,外部不可以访问new_stmt_scope内定义的tensor。
- 如果关闭自动插入同步指令,则该作用域内不支持高级API。因为高级API为多个低级API组合而成,这些低级API之间有数据依赖,如果关闭自动插入同步指令,则会导致结果异常。
高级API:vec_expm1_high_preci、vec_ln_high_preci、vec_rec_high_preci、vec_rsqrt_high_preci、conv2d、fixpipe、matmul、vec_reduce_max、vec_reduce_min、vec_reduce_add、printf。
- 如果new_stmt_scope里disable_sync=True,则该作用域内不支持嵌套调用new_stmt_scope。
返回值
TikWithScope对象
调用示例
tik_instance = tik.Tik() dtype = "float16" shape = (2, 128) src_gm = tik_instance.Tensor(dtype, shape, name="src_gm", scope=tik.scope_gm) src_ub = tik_instance.Tensor(dtype, shape, name="src_ub", scope=tik.scope_ubuf) dst_gm = tik_instance.Tensor(dtype, shape, name="dst_gm", scope=tik.scope_gm) dst_ub = tik_instance.Tensor(dtype, shape, name="dst_ub", scope=tik.scope_ubuf) a = tik_instance.InputScalar(dtype="int32", name="a") b = tik_instance.InputScalar(dtype="int32", name="b") tik_instance.data_move(src_ub, src_gm, 0, 1, 16, 0, 0) # 如果配置disable_sync为False,data_move的offset为Scalar,系统无法判断两个data_move之间数据地址是否有重叠,系统就会自动插入同步指令。 # 如果知道a和b的具体值,比如输入a为0,b为1,那么两个data_move之间没有数据依赖,就可以配置disable_sync为True,不插入同步指令,取消搬运指令间的同步等待,可以提升性能。 with tik_instance.new_stmt_scope(disable_sync=True): tik_instance.data_move(dst_ub[a*128:], src_ub[a*128:], 0, 1, 8, 0, 0) tik_instance.data_move(dst_ub[b*128:], src_ub[b*128:], 0, 1, 8, 0, 0) tik_instance.data_move(dst_gm, dst_ub, 0, 1, 16, 0, 0) tik_instance.BuildCCE(kernel_name="sample", inputs=[src_gm, a, b], outputs=[dst_gm])
父主题: 程序控制