我在开发一个昇腾Ascend C算子时遇到了一个比较隐蔽的问题。算子的计算流程比较复杂,需要多次读写统一缓冲区(UB)中的数据。为了节省片上内存空间,我对UB中的同一块区域进行了复用,在不同计算阶段存放不同的中间结果。
在单次调用时一切正常,计算结果准确。但当我将这个算子嵌入到完整的网络中运行时,发现某些batch的计算结果出现了异常,数值明显不对,像是中间结果被后续计算污染了。我怀疑是内存复用的时机控制出了问题,但调试起来非常困难,因为UB空间是片上内存,无法像DDR那样通过简单的打印来观察数据变化。
想请教一下大家在Ascend C开发中,对于UB内存复用的设计和调试有什么好的经验和方法?
我在开发一个昇腾Ascend C算子时遇到了一个比较隐蔽的问题。算子的计算流程比较复杂,需要多次读写统一缓冲区(UB)中的数据。为了节省片上内存空间,我对UB中的同一块区域进行了复用,在不同计算阶段存放不同的中间结果。
在单次调用时一切正常,计算结果准确。但当我将这个算子嵌入到完整的网络中运行时,发现某些batch的计算结果出现了异常,数值明显不对,像是中间结果被后续计算污染了。我怀疑是内存复用的时机控制出了问题,但调试起来非常困难,因为UB空间是片上内存,无法像DDR那样通过简单的打印来观察数据变化。
想请教一下大家在Ascend C开发中,对于UB内存复用的设计和调试有什么好的经验和方法?