下载
EN
注册

TIK常见编译错误

错误信息

当发生TIK编译错误时,在界面上显示错误信息、发生错误时算子的代码行、算子源代码的上下文和算子调用堆栈,下面是部分英文错误信息,中文含义, 处理方式:

表1 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

注意事项

  1. 编译命令错误和部分未知错误不支持打印错误代码行及上下文,其余部分编译错误支持定位到具体代码行,
  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变量命名之后,可以快速确认是哪个变量超出了作用域。