写点什么

AscendC 编程中的 double buffer 是什么?

作者:zjun
  • 2024-12-24
    上海
  • 本文字数:928 字

    阅读完需:约 3 分钟

AscendC编程中的double buffer是什么?

执行于 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。

数据搬运与计算串行

在此过程中,数据搬运与 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 闲置问题得以有效缓解。

数据搬运与计算并行

总体来说,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 算力、数据量大小、搬运与计算时间占比等多种因素。

用户头像

zjun

关注

还未添加个人签名 2020-03-06 加入

还未添加个人简介

评论

发布
暂无评论
AscendC编程中的double buffer是什么?_编程_zjun_InfoQ写作社区