已关闭
[Question|问题咨询]: 多核调度的MTE瓶颈问题如何解决? #283
changke2024创建于  4月22日关闭于  5月7日
changke2024
changke2024
4月22日 创建

Welcome to ask questions and discuss with other members.

问题描述

image.png
image.png
image.png

我在自己制作一些领域专用加速算子时,发现主要性能瓶颈为MTE,对MTE进行单独测试时,发现无法准确把握理解910B4芯片的MTE单元性能“甜”点,特来求助。

上述3张图时热力图,分别为时间、带宽和搬用时MTE计算单元的峰值使用率,横坐标为核数、纵坐标为每核搬运数据量。以下时我对MTE单元的理解与问题,请指正:

  1. MTE的数量有限,随着参与搬运的vector数增加,总搬运带宽增大,但是mte峰值率会降低,MTE实际上Mesh NoC。
  2. NOC不是针对每个vector core应该是256GB/s的吗?但是实际使用中这个最大峰值好像并不是标准值,比如使用:Effective Throughput Heatmap列对应Usage去比较,好像并没有一个定数。
    image.png
    1. 从数据上来看,在小的数据搬用情况下,无法跑满峰值,即使时满足https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/83RC1/opdevg/ascendcbestP/atlas_ascendc_best_practices_10_0013.html,https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/83RC1/opdevg/ascendcbestP/atlas_ascendc_best_practices_10_0014.html给出的示例。甚至910B4芯片的搬运曲线也很怪异,和给出示例不一样。
  3. 在IO占主导的算子中,ascend910B4如何优化?或者说,性能甜点在哪里?我如何写代码,才能够解决这个io瓶颈(因为从搬运大规模数据来看,这个性能还挺好,感觉还有很大的性能压榨空间)。
likedislike
vallenChen成员
4月23日 评论:

您好,非常感谢您的反馈,当前已联系相应专家

likedislike
changke2024
changke2024
4月23日 评论:

您好,非常感谢您的反馈,当前已联系相应专家

@vallenChen

感谢!

likedislike
vallenChen成员
4月23日 评论:

当前SOC资源是多核竞争的,多核同时读写不保证每个核的带宽。实际上,甜点不是“想”出来的,是“摸”出来的。对于IO占主导的算子,建议尽可能的从512B对齐的维度去设计搬运粒度,UB上最小访问粒度:32B。

likedislike
changke2024
changke2024
4月24日 评论:

当前SOC资源是多核竞争的,多核同时读写不保证每个核的带宽。实际上,甜点不是“想”出来的,是“摸”出来的。对于IO占主导的算子,建议尽可能的从512B对齐的维度去设计搬运粒度,从经验上建议尝试>32KB/burst的颗粒度。

@vallenChen 感谢大佬分享经验。

>32KB/burst>32KB/burst是一个很有挑战的事情,以UB大小限制位192KB来计算,2个输入、1个输出、1个片上的temp,开启double buffer后共有(2+1)*2+1 = 7份数据,那么192/7/32=876 个 数据的slot,与512对齐后,876/16*16=864个。因此输入数据最多为864*32B=27KB数据。很难实现到32KB/burst的颗粒度。
这种情况下,算法设计上已经是比较绝望了,有无改进方法。另外,现在发现一个奇怪的问题:
当有mte2开启多个数据通路后,不同数据通路之间有明显的竞争状态,会导致每个数据通路的带宽都降低(output搬出一个tile时间是340us,但是MTE2搬入x1需要500多us,x2甚至需要700-900us),这是硬件特性环是算法问题,有解决方法吗?

除开算法优化部分,考虑硬件:这是910B4的性能问题吗?我换910B2是否有明显改善(除了MTE2带宽扩到了1.6T外)。

likedislike
vallenChen成员
4月28日 评论:

当前SOC资源是多核竞争的,多核同时读写不保证每个核的带宽。实际上,甜点不是“想”出来的,是“摸”出来的。对于IO占主导的算子,建议尽可能的从512B对齐的维度去设计搬运粒度,从经验上建议尝试>32KB/burst的颗粒度。

@vallenChen 感谢大佬分享经验。

>32KB/burst>32KB/burst是一个很有挑战的事情,以UB大小限制位192KB来计算,2个输入、1个输出、1个片上的temp,开启double buffer后共有(2+1)*2+1 = 7份数据,那么192/7/32=876 个 数据的slot,与512对齐后,876/16*16=864个。因此输入数据最多为864*32B=27KB数据。很难实现到32KB/burst的颗粒度。
这种情况下,算法设计上已经是比较绝望了,有无改进方法。另外,现在发现一个奇怪的问题:
当有mte2开启多个数据通路后,不同数据通路之间有明显的竞争状态,会导致每个数据通路的带宽都降低(output搬出一个tile时间是340us,但是MTE2搬入x1需要500多us,x2甚至需要700-900us),这是硬件特性环是算法问题,有解决方法吗?

除开算法优化部分,考虑硬件:这是910B4的性能问题吗?我换910B2是否有明显改善(除了MTE2带宽扩到了1.6T外)。

@KervinSherman
您好开发者,非常感谢您对当前带宽的探索。

  • 对于上文中开启double buffer后最多为27KB/burst的情况,尽可能多的使用即可,从经验上来说小于32KB/burst时,带宽是随数据粒度递增的。对于double buffer的使用有一些建议:
    • 当数据搬运时间较短,而Vector计算时间显著较长时,由于数据搬运在整个计算过程中的时间占比较低,double buffer机制带来的性能收益会偏小。
    • 当原始数据较小且Vector可一次性完成所有数据量的计算时,强行使用double buffer会降低Vector计算资源的利用率,最终效果可能适得其反。
  • 就mte2开启多数据通路后数据带宽下降是一个资源问题,可以这么理解:MTE通路可以搬运货物A或者B,搬运货物A多点那么搬运货物B就少点,反之亦然。相较于只搬运货物A或者货物B(单独数据搬运)带宽下降,是因为同时搬运了货物A和B。多通路下对比单通路确实会降低带宽。
  • 和上面说的一样,甜点是摸出来的,可以尝试固定搬运的总数据量,尝试不同的nBurst和lenBurst组合来选择当前场景下带宽利用率最高的tile大小。
  • 910B2和910B4对于多通路中的竞争带宽应该是没有区别的属于硬件特性。
likedislike
VvallenChen成员
4月28日 将 vallenChen 设为负责人
changke2024
changke2024
5月7日 评论:

感谢大佬解答,万分宝贵的经验。

likedislike
changke2024changke2024
5月7日 issue状态由 进行中 改变为 已完成
changke2024changke2024
5月7日 关闭了 issue
CANN-robotCANN-robot成员
5月7日 添加了label:Accepted