TIK常见编译错误
错误信息
当发生TIK编译错误时,在界面上显示错误信息、发生错误时算子的代码行、算子源代码的上下文和算子调用堆栈,下面是部分英文错误信息,中文含义, 处理方式:
错误信息 |
中文含义 |
处理方式 |
---|---|---|
Compile Error: The parameter type may be wrong, please check the api document |
编译错误:参数类型不正确,请查阅api文档。 |
TIK API 参数类型不正确,请仔细核对TIK API 文档参数说明章节及注意事项 |
Compile Error: Scalar operation may be wrong |
编译错误:标量操作错误。 |
标量操作不支持对应的操作数的类型,例如标量加操作不支持float类型。 |
Compile Error: The compile command may be wrong |
编译错误:编译命令错误。 |
编译命令有误,可能是编译器版本不对,可能是编译参数不支持,请核对编译器版本是否准确。 |
Compile Error: Instruction selection may be wrong |
编译错误:内部指令映射错误。 |
内部指令映射错误,可能是编译器版本不对,请核对编译器版本是否准确 |
Compile Error: Unknown errors |
编译错误:未知错误。 |
未知类型错误,可能是编译器版本不对,请核对编译器版本是否准确。 |
Error: Check failed: !invalid_vars.count(op): j is used out of scope |
编译错误:变量超出了其定义的作用域。 |
根据对应的报错语句查看哪个变量超出了其定义的作用域。 报错信息中,"j"为定义的变量名称。如果算子实现中没有定义名称为"j"的变量,则"j"可能是某个for_range()语句的索引变量。详细分析可参考示例说明2。 |
注意事项
- 编译命令错误和部分未知错误不支持打印错误代码行及上下文,其余部分编译错误支持定位到具体代码行,
- 需要在调用BuildCCE时,配置tbe_debug_level=2。
tik_instance.BuildCCE(..., config = {"tbe_debug_level": 2})
示例说明1
错误信息:"Scalar operation may be wrong"
示例中报错信息如下图所示:
通过第一行的报错信息,在上述表格中找到错误原因,然后根据tik算子文件中错误行的上下文上的错误代码行,可以判断出是16行标量b的赋值语句出现问题,经过查看Scalar的注意事项,并结合代码可以定位出,在设置标量值时,值是一个表达式,不支持scalar变量加float类型的数据。
示例说明2
错误信息::" xxx is used out of scope"
- 样例1
示例代码如下所示:
from tbe import tik tik_instance = tik.Tik() b = tik_instance.Scalar(dtype="int32", init_value=2, name="b") dup_value = tik_instance.Scalar(dtype="int32", init_value=3, name="dup_value") a_ub = tik_instance.Tensor(shape=(192,), name="a_ub", scope=tik.scope_ubuf, dtype="int32") with tik_instance.for_range(0, 2) as index: dup_value.set_as(b * dup_value) tik_instance.vec_dup(64, a_ub[index*64:], dup_value, 1, 8) tik_instance.vec_dup(64, a_ub[index*64:], dup_value, 1, 8) # index超作用域 tik_instance.BuildCCE("test_for_range", inputs=[], outputs=[])
编译时,报错信息如下图所示:
- 样例2
示例代码如下所示:
from tbe import tik tik_instance = tik.Tik() b = tik_instance.Scalar(dtype="int32", init_value=2, name="b") dup_value = tik_instance.Scalar(dtype="int32", init_value=3, name="dup_value") a_ub = tik_instance.Tensor(shape=(192,), name="a_ub", scope=tik.scope_ubuf, dtype="int32") with tik_instance.for_range(0, 2) as index: dup_value.set_as(b * dup_value) tik_instance.vec_dup(64, a_ub[index*64:], dup_value, 1, 8) with tik_instance.for_range(0, 2) as index: dup_value.set_as(b * dup_value) tik_instance.vec_dup(64, a_ub[index*64:], dup_value, 1, 8) tik_instance.vec_dup(64, a_ub[index*64:], dup_value, 1, 8) # index超作用域 tik_instance.BuildCCE("test_for_range", inputs=[], outputs=[])
编译时,报错信息如下图所示:
- 样例3
from tbe import tik tik_instance = tik.Tik() b = tik_instance.Scalar(dtype="int32", init_value=2, name="b") dup_value = tik_instance.Scalar(dtype="int32", init_value=3, name="dup_value") a_ub = tik_instance.Tensor(shape=(192,), name="a_ub", scope=tik.scope_ubuf, dtype="int32") with tik_instance.for_range(0, 2, name="index1") as index: # 指定index的变量名 dup_value.set_as(b * dup_value) tik_instance.vec_dup(64, a_ub[index*64:], dup_value, 1, 8) with tik_instance.for_range(0, 2, name="index2") as index: # 指定index的变量名 dup_value.set_as(b * dup_value) tik_instance.vec_dup(64, a_ub[index*64:], dup_value, 1, 8) tik_instance.vec_dup(64, a_ub[index*64:], dup_value, 1, 8) # index超作用域 tik_instance.BuildCCE("test_for_range", inputs=[], outputs=[])
编译时,报错信息如下图所示:
注意:
•样例1与•样例2的报错原因都是索引变量index超出了其定义的作用域,且索引变量都是for_range语句中定义的,但两个样例的报错中,变量名称不同。在for_range()语句中,如果没有指定索引index的name,则会自动命名为“i”,“j”,“k”,......
•样例3与•样例2的实现代码的区别为:样例3对for_range()语句的index变量进行了命名,其他完全一致。由•样例3的报错信息可以看出,对for_range()语句的index变量命名之后,可以快速确认是哪个变量超出了作用域。