AscendC编程中的double buffer是什么?

举报
zjun 发表于 2024/12/24 09:54:29 2024/12/24
【摘要】 执行于AI Core上的指令队列主要包括如下几类,即:Vector指令队列(V)Matrix指令队列(M)存储移动指令队列(MTE2、MTE3)。不同指令队列间的相互独立性和可并行执行性,是double buffer优化机制的基石。矢量计算CopyIn、CopyOut过程使用存储移动指令队列(MTE2、MTE3),Compute过程使用Vector指令队列(V),意味着CopyIn、Copy...

执行于AI Core上的指令队列主要包括如下几类,即:

  • Vector指令队列(V)
  • Matrix指令队列(M)
  • 存储移动指令队列(MTE2、MTE3)。

不同指令队列间的相互独立性和可并行执行性,是double buffer优化机制的基石
矢量计算CopyIn、CopyOut过程使用存储移动指令队列(MTE2、MTE3),Compute过程使用Vector指令队列(V),意味着CopyIn、CopyOut过程和Compute过程是可以并行的。
如图1所示,考虑一个完整的数据搬运和计算过程,CopyIn过程将数据从Global Memory搬运到Local Memory,Vector计算单元完成计算后,经过CopyOut过程将计算结果搬回Global Memory。
image.png

在此过程中,数据搬运与Vector计算串行执行,Vector计算单元无可避免存在资源闲置问题。举例而言,若CopyIn、Compute、CopyOut三阶段分别耗时t,则Vector的时间利用率仅为1/3,等待时间过长,Vector利用率严重不足。

为减少Vector等待时间,double buffer机制将待处理的数据一分为二,比如Tensor1、Tensor2。如图2所示,当Vector对Tensor1中数据进行Compute时,Tensor2可以执行CopyIn的过程;而当Vector切换到计算Tensor2时,Tensor1可以执行CopyOut的过程。由此,数据的进出搬运和Vector计算实现并行执行,Vector闲置问题得以有效缓解。
image.png

总体来说,double buffer是基于MTE指令队列与Vector指令队列的独立性和可并行性,通过将数据搬运与Vector计算并行执行以隐藏数据搬运时间并降低Vector指令的等待时间,最终提高Vector单元的利用效率,您可以通过为队列申请内存时设置内存块的个数来实现数据并行,简单代码示例如下:

pipe.InitBuffer(inQueueX, 2, 256);

需要注意:
多数情况下,采用double buffer能有效提升Vector的时间利用率,缩减算子执行时间。然而,double buffer机制缓解Vector闲置问题并不代表它总能带来整体的性能提升。例如:

  • 当数据搬运时间较短,而Vector计算时间显著较长时,由于数据搬运在整个计算过程中的时间占比较低,double buffer机制带来的性能收益会偏小。
  • 又如,当原始数据较小且Vector可一次性完成所有计算时,强行使用double buffer会降低Vector计算资源的利用率,最终效果可能适得其反。

因此,double buffer的性能收益需综合考虑Vector算力、数据量大小、搬运与计算时间占比等多种因素。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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