【TBE算子开发】TIK Debug调试越界错误问题指导

举报
kourei 发表于 2020/03/31 11:40:03 2020/03/31
【摘要】 在用TIK开发算子时,debug调试是一个非常有用的工具,它能够利用仿真工具验证你开发的算子运行结果是否符合你的预期结果。但是在调用debug时,tik的debug工具会做一个内存越界的检查,对几乎每一个指令做检查,因此在开发算子的过程中会经常遇到如下报错:上述报错表明,在运行debug时,该指令调用存在内存越界行为。针对该错误,具体查看过程如下:对于这种报错,先看”------“下面的打印...

在用TIK开发算子时,debug调试是一个非常有用的工具,它能够利用仿真工具验证你开发的算子运行结果是否符合你的预期结果。

但是在调用debug时,tik的debug工具会做一个内存越界的检查,对几乎每一个指令做检查,因此在开发算子的过程中会经常遇到如下报错:

1.png

上述报错表明,在运行debug时,该指令调用存在内存越界行为。针对该错误,具体查看过程如下:

2.png

对于这种报错,先看”------“下面的打印信息,然后对比上面的打印信息:
先对比1, 查看是UB还是gm越界;
然后对比2,查看mode是否一致,不一致可能是该buffer空间为写mode,但是对该空间进行了读操作,这是认为不合理的,但是也可能存在某几条特殊指令,对同一空间先读再写,这要看具体指令的实现方式,一般情况下这种越界报错二者都是相同的;
然后对4,首先看“------”上面的打印信息,buf_addr代表这个buffer空间的起始地址,size表示空间大小,name表示对应tensor的名字,access_mode即为该空间为读或写mode;然后看"------"下面的打印信息,scope为buffer的类型(ub或者gm等,与上面的buffer对应),addr代表对这个buffer空间进行此次操作(读或者写根据mode)的起始地址,size为读或者写的字节数。 然后根据addr+size 与 上面的信息的buf_addr+buf_size,进行比较,若addr+size > buf_addr+buf_size则代表(mode)越界。 这才会导致报错


针对定义的gm空间不满足32Byte对齐问题解决:

    在很多开发算子场景中,存在着gm空间中定义申请的空间不是32B的整数倍,如下一个定义:

        test_gm = tik_instance.Tensor((100,), "float16", scope=tik.scope_gm)

    对于上述定义的gm空间,它的size是100*2B=200B,是不满足32Byte对齐的,即空间大小不是32B的整数倍,这使得在算子开发过程中,利用data_move搬运指令时出现内存越界错误。

    针对上述越界错误情况,tik给出的解决方案是在检查内存越界时,对gm空间进行了一定的扩充,具体方案是:在data_move时会对gm空间大小size进行32取余,然后将gm空间的size加上(32-余数),从而对gm空间大小进行扩充。如上述定义的test_gm, 在data_move时可以搬运200B+(32-200%32)=224B空间大小的数据。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。