CANN学习资源开源仓的算子性能优化
开源仓的tutorials到这里结束了。感觉有点虎头蛇尾,记录点理论知识吧。
切分
数据切分后,部分核有计算拖尾,即需要部分尾核来计算尾块数据,此时,部分核始终处于空闲状态,从而使得算子的整体性能变差。假设总的数据量为[45, 20480],原Tiling设计每个核计算20480个数据,使用40个Vector核(假设设备有40个Vector核可用),多余的数据由前5个核每个核多处理20480个数据。假设每个核处理20480数据的耗时相同为x,那么这种方案的算子耗时为2x。
如果调整每个核多处理2560数据,总耗时为x + 2560数据耗时, 2560 < 20480, 所以处理耗时小于x, 整体耗时预期小于2x。
流水线
执行于AI Core上的指令队列主要包括如下几类,Vector指令队列(V)、Cube指令队列(M)、Scalar指令队列(S)和搬运指令队列(MTE1/MTE2/MTE3)。以AddCustomTemplate算子为例,矢量计算前后的CopyIn、CopyOut过程使用搬运指令队列(MTE2/MTE3),Compute过程使用Vector指令队列(V),不同指令队列可并行执行,意味着CopyIn、CopyOut过程和Compute过程是可以并行的。一个完整的数据搬运和计算过程,CopyIn过程将数据从Global Memory搬运到Local Memory,Vector计算单元完成Compute计算后,经过CopyOut过程将计算结果搬回Global Memory。在此过程中,数据搬运与Vector计算串行执行,Vector计算单元不可避免存在资源闲置问题,假设CopyIn、Compute、CopyOut三阶段分别耗时相同均为t(实际Vector计算更快),则Vector的利用率仅为1/3。
为减少Vector等待时间,使能DoubleBuffer机制将待处理的数据一分为二,当Vector单元对Tensor1中数据进行Compute计算时,Tensor2数据流可以执行CopyIn的过程;而当Vector切换到计算Tensor2时,Tensor1数据流可以执行CopyOut的过程。由此,数据的进出搬运和Vector计算实现并行执行,Vector闲置问题得以有效缓解。
访存
搬运不同大小的数据块时,对带宽的利用率不一样。根据实测经验,单次搬运数据长度16KB以上时,通常能较好地发挥出带宽的最佳性能。因此对于单次搬运,应考虑尽可能的搬运较大的数据块。
- 点赞
- 收藏
- 关注作者
评论(0)