【TBE算子开发】TIK Debug调试越界错误问题指导
在用TIK开发算子时,debug调试是一个非常有用的工具,它能够利用仿真工具验证你开发的算子运行结果是否符合你的预期结果。
但是在调用debug时,tik的debug工具会做一个内存越界的检查,对几乎每一个指令做检查,因此在开发算子的过程中会经常遇到如下报错:
上述报错表明,在运行debug时,该指令调用存在内存越界行为。针对该错误,具体查看过程如下:
对于这种报错,先看”------“下面的打印信息,然后对比上面的打印信息:
先对比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空间大小的数据。
- 点赞
- 收藏
- 关注作者
评论(0)