已合并
将GMM/MM下imageXX.png重新命名 #182
将GMM/MM下imageXX.png重新命名 #182
已合并
wuyi_51创建于 4月22日
共 44 个文件变更+44-44
RSamples/2_Performance/grouped_matmul_story/docs/images/image33.png→Samples/2_Performance/grouped_matmul_story/docs/images/double-buffer-l1-l0-pipeline-compare.png+0-0
RSamples/2_Performance/grouped_matmul_story/docs/images/image29.png→Samples/2_Performance/grouped_matmul_story/docs/images/l1-double-buffer-bank-conflict-compare.png+0-0
RSamples/2_Performance/grouped_matmul_story/docs/images/image30.png→Samples/2_Performance/grouped_matmul_story/docs/images/mx-quant-scale-l1-cache-reuse.png+0-0
RSamples/2_Performance/grouped_matmul_story/docs/images/image28.png→Samples/2_Performance/grouped_matmul_story/docs/images/swat-column-major-vs-adaptive-window.png+0-0
RSamples/2_Performance/grouped_matmul_story/docs/images/image32.png→Samples/2_Performance/grouped_matmul_story/docs/images/tail-round-multicore-load-balance.png+0-0
RSamples/2_Performance/grouped_matmul_story/docs/images/image34.png→Samples/2_Performance/grouped_matmul_story/docs/images/unitflag-mmad-fixpipe-parallel-compare.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image1.png→Samples/2_Performance/matmul_story/docs/images/ai-core-abstract-architecture.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image11.png→Samples/2_Performance/matmul_story/docs/images/aiv-nd2nz-gm-ub-offload-flow.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image2.png→Samples/2_Performance/matmul_story/docs/images/ascend-a2-aic-aiv-architecture.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image4.png→Samples/2_Performance/matmul_story/docs/images/cube-multicore-load-balance-tiling.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image17.png→Samples/2_Performance/matmul_story/docs/images/dma-bank-conflict-row-col-major.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image18.png→Samples/2_Performance/matmul_story/docs/images/dma-bank-conflict-staggered-cores.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image33.png→Samples/2_Performance/matmul_story/docs/images/double-buffer-l1-l0-pipeline-compare.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image19.png→Samples/2_Performance/matmul_story/docs/images/dual-page-table-l2-bypass-flow.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image3.png→Samples/2_Performance/matmul_story/docs/images/l0-cube-fractal-zz-zn-nz-layout.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image29.png→Samples/2_Performance/matmul_story/docs/images/l1-double-buffer-bank-conflict-compare.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image9.png→Samples/2_Performance/matmul_story/docs/images/matmul-l2-cache-miss-large-matrix.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image10.png→Samples/2_Performance/matmul_story/docs/images/matmul-l2-z-pattern-tiling-reuse.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image31.png→Samples/2_Performance/matmul_story/docs/images/matmul-mte2-full-load-l1-template.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image21.png→Samples/2_Performance/matmul_story/docs/images/mte2-issue-queue-full-pipeline-block.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image22.png→Samples/2_Performance/matmul_story/docs/images/mte2-preload-reordered-pipeline.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image23.png→Samples/2_Performance/matmul_story/docs/images/mx-quant-matmul-data-movement-overview.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image30.png→Samples/2_Performance/matmul_story/docs/images/mx-quant-scale-l1-cache-reuse.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image26.png→Samples/2_Performance/matmul_story/docs/images/mx-quant-scalea-gm-l1-l0-mx-path.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image27.png→Samples/2_Performance/matmul_story/docs/images/mx-quant-scaleb-gm-l1-l0-mx-path.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image24.png→Samples/2_Performance/matmul_story/docs/images/mx-quant-tensor-a-gm-l1-l0-path.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image25.png→Samples/2_Performance/matmul_story/docs/images/mx-quant-tensor-b-gm-l1-l0-path.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image12.png→Samples/2_Performance/matmul_story/docs/images/nd2nz-transpose-in-input-layout.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image13.png→Samples/2_Performance/matmul_story/docs/images/nd2nz-transpose-in-output-layout.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image14.png→Samples/2_Performance/matmul_story/docs/images/nd2nz-transpose-out-input-layout.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image15.png→Samples/2_Performance/matmul_story/docs/images/nd2nz-transpose-out-output-layout.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image6.png→Samples/2_Performance/matmul_story/docs/images/split-k-deterministic-accumulation-flow.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image5.png→Samples/2_Performance/matmul_story/docs/images/split-k-multi-core-parallel-schematic.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image8.png→Samples/2_Performance/matmul_story/docs/images/split-k-profiling-after.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image7.png→Samples/2_Performance/matmul_story/docs/images/split-k-profiling-before.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image28.png→Samples/2_Performance/matmul_story/docs/images/swat-column-major-vs-adaptive-window.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image32.png→Samples/2_Performance/matmul_story/docs/images/tail-round-multicore-load-balance.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image20.png→Samples/2_Performance/matmul_story/docs/images/unitflag-mmad-fixpipe-block-sync.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image34.png→Samples/2_Performance/matmul_story/docs/images/unitflag-mmad-fixpipe-parallel-compare.png+0-0
RSamples/2_Performance/matmul_story/docs/images/image16.png→Samples/2_Performance/matmul_story/docs/images/weight-nz-preprocess-inference-matmul.png+0-0
@@ -31,7 +31,7 @@ AI Core是AI处理器的计算核心,AI处理器内部有多个AI Core。本
31 31 
32**图 1** 抽象硬件架构 <a name="image1"></a>32**图 1** 抽象硬件架构 <a name="image1"></a>
33 33 
34-![](images/image1.png)34+![](images/ai-core-abstract-architecture.png)
35 35 
36 36 
37AI Core中包含**计算单元、存储单元、搬运单元**等核心组件。37AI Core中包含**计算单元、存储单元、搬运单元**等核心组件。
@@ -91,7 +91,7 @@ AI Core内部核心组件及组件功能详细说明如下表。
91以Atlas A2系列产品为例,硬件架构如下,本文只介绍关键模块,更多介绍请参考[《Ascend C算子开发》](https://hiascend.com/document/redirect/CannCommunityOpdevAscendC)中关于硬件实现相关的内容。91以Atlas A2系列产品为例,硬件架构如下,本文只介绍关键模块,更多介绍请参考[《Ascend C算子开发》](https://hiascend.com/document/redirect/CannCommunityOpdevAscendC)中关于硬件实现相关的内容。
92 92 
93 93 
94- ![](images/image2.png)94+ ![](images/ascend-a2-aic-aiv-architecture.png)
95 95 
96 96 
97- **计算单元**97- **计算单元**
@@ -116,7 +116,7 @@ AI Core内部核心组件及组件功能详细说明如下表。
116 - L0B Buffer:FRACTAL\_ZN116 - L0B Buffer:FRACTAL\_ZN
117 - L0C Buffer:FRACTAL\_NZ117 - L0C Buffer:FRACTAL\_NZ
118 118 
119- ![](images/image3.png)119+ ![](images/l0-cube-fractal-zz-zn-nz-layout.png)
120 120 
121 这些格式针对矩阵乘法等计算密集型任务进行优化,通过将矩阵划分成一些分形(Fractal Matrix),分形shape为16 x \(32B / sizeof\(AType\)\),Cube计算一个cycle执行16 \* 16 \* 16个乘加运算,重排数据可以连续读取,硬件计算更加亲和,可显著提升计算效率。121 这些格式针对矩阵乘法等计算密集型任务进行优化,通过将矩阵划分成一些分形(Fractal Matrix),分形shape为16 x \(32B / sizeof\(AType\)\),Cube计算一个cycle执行16 \* 16 \* 16个乘加运算,重排数据可以连续读取,硬件计算更加亲和,可显著提升计算效率。
122 122 
@@ -174,7 +174,7 @@ AI Core内部核心组件及组件功能详细说明如下表。
174 174 
175 ![](images/formula4.png)175 ![](images/formula4.png)
176 176 
177- ![图4](images/image4.png)177+ ![图4](images/cube-multicore-load-balance-tiling.png)
178 178 
179- **代码实践**179- **代码实践**
180 180 
@@ -300,7 +300,7 @@ AI Core内部核心组件及组件功能详细说明如下表。
300 300 
301 MTE2 bound情况下,增加singleCoreN和singleCoreM,减少重复搬运,可提升并行度。在普通模板多核并行时切分M轴、N轴的基础上,增加核与核之间对K轴的切分。301 MTE2 bound情况下,增加singleCoreN和singleCoreM,减少重复搬运,可提升并行度。在普通模板多核并行时切分M轴、N轴的基础上,增加核与核之间对K轴的切分。
302 302 
303- ![](images/image5.png)303+ ![](images/split-k-multi-core-parallel-schematic.png)
304 304 
305- **确定性切K计算**305- **确定性切K计算**
306 306 
@@ -308,7 +308,7 @@ AI Core内部核心组件及组件功能详细说明如下表。
308 308 
309 如上所述,通过atomic实现的多核切K再累加可能存在确定性问题(即相同case多次执行后结果存在不一致)。因此,在L0C搬移到workspace过程中,不能直接使用atomic完成累加,而是在单核内K轴累加后整体搬移到workspace(workspace按核数开辟,并非一份)。在UB上,需要先完成多核累加,再完成cast和removepad。309 如上所述,通过atomic实现的多核切K再累加可能存在确定性问题(即相同case多次执行后结果存在不一致)。因此,在L0C搬移到workspace过程中,不能直接使用atomic完成累加,而是在单核内K轴累加后整体搬移到workspace(workspace按核数开辟,并非一份)。在UB上,需要先完成多核累加,再完成cast和removepad。
310 310 
311- ![](images/image6.png)311+ ![](images/split-k-deterministic-accumulation-flow.png)
312 312 
313- **代码实践**313- **代码实践**
314 314 
@@ -342,11 +342,11 @@ AI Core内部核心组件及组件功能详细说明如下表。
342 342 
343 - 切K前:若使用普通代码逻辑,运行耗时需要12.17us。343 - 切K前:若使用普通代码逻辑,运行耗时需要12.17us。
344 344 
345- ![](images/image7.png)345+ ![](images/split-k-profiling-before.png)
346 346 
347 - 切K后:采用切K模板代码逻辑,运行耗时需要8.44us。347 - 切K后:采用切K模板代码逻辑,运行耗时需要8.44us。
348 348 
349- ![](images/image8.png)349+ ![](images/split-k-profiling-after.png)
350 350 
351 351 
352### 提升搬运带宽352### 提升搬运带宽
@@ -359,11 +359,11 @@ AI Core内部核心组件及组件功能详细说明如下表。
359 359 
360 MatMul计算依赖左、右矩阵循环读取,当输入超L2 Size时会遇到L2数据被置换剔除,导致整体L2命中率下降,带宽效率降低,出现流水断流。360 MatMul计算依赖左、右矩阵循环读取,当输入超L2 Size时会遇到L2数据被置换剔除,导致整体L2命中率下降,带宽效率降低,出现流水断流。
361 361 
362- ![](images/image9.png)362+ ![](images/matmul-l2-cache-miss-large-matrix.png)
363 363 
364 为提升这类场景的L2命中率,可将单轮计算设计的输入矩阵限制在L2 Buffer Size内,并在多轮计算之间采用“Z”型循环展开遍历,实现数据更换中至少单边数据可复用,提高整体L2命中率。364 为提升这类场景的L2命中率,可将单轮计算设计的输入矩阵限制在L2 Buffer Size内,并在多轮计算之间采用“Z”型循环展开遍历,实现数据更换中至少单边数据可复用,提高整体L2命中率。
365 365 
366- ![](images/image10.png)366+ ![](images/matmul-l2-z-pattern-tiling-reuse.png)
367 367 
368- **代码实践**368- **代码实践**
369 369 
@@ -417,7 +417,7 @@ AI Core内部核心组件及组件功能详细说明如下表。
417 417 
418 **优化思路**:不使用随路ND2NZ指令,通过AIV核,先将数据从GM搬到UB,再通过AIV指令完成ND转NZ,然后AIC核直接读取NZ数据进L1,提升带宽效率,降低端到端耗时。418 **优化思路**:不使用随路ND2NZ指令,通过AIV核,先将数据从GM搬到UB,再通过AIV指令完成ND转NZ,然后AIC核直接读取NZ数据进L1,提升带宽效率,降低端到端耗时。
419 419 
420- ![](images/image11.png)420+ ![](images/aiv-nd2nz-gm-ub-offload-flow.png)
421 421 
422 **数据从GM搬到UB有2种方案**:422 **数据从GM搬到UB有2种方案**:
423 423 
@@ -458,11 +458,11 @@ AI Core内部核心组件及组件功能详细说明如下表。
458 458 
459 输入排布如下:459 输入排布如下:
460 460 
461- ![](images/image12.png)461+ ![](images/nd2nz-transpose-in-input-layout.png)
462 462 
463 输出排布如下:463 输出排布如下:
464 464 
465- ![](images/image13.png)465+ ![](images/nd2nz-transpose-in-output-layout.png)
466 466 
467 3. **TransposeOut**467 3. **TransposeOut**
468 468 
@@ -470,11 +470,11 @@ AI Core内部核心组件及组件功能详细说明如下表。
470 470 
471 输入排布如下:471 输入排布如下:
472 472 
473- ![](images/image14.png)473+ ![](images/nd2nz-transpose-out-input-layout.png)
474 474 
475 输出排布如下:475 输出排布如下:
476 476 
477- ![](images/image15.png)477+ ![](images/nd2nz-transpose-out-output-layout.png)
478 478 
479 4. **CopyOut**:最终将NZ结果搬到workspace。479 4. **CopyOut**:最终将NZ结果搬到workspace。
480 480 
@@ -500,7 +500,7 @@ AI Core内部核心组件及组件功能详细说明如下表。
500 500 
501 NPU内部使用硬件亲和的数据排布格式FRACTAL_NZ(简写NZ格式),MatMul使用传统排布ND传入时,会随路进行格式转换,转换过程中存在一定带宽损失。因此在推理场景中,可以对权重进行预处理转换成NZ排布,充分发挥带宽利用率。501 NPU内部使用硬件亲和的数据排布格式FRACTAL_NZ(简写NZ格式),MatMul使用传统排布ND传入时,会随路进行格式转换,转换过程中存在一定带宽损失。因此在推理场景中,可以对权重进行预处理转换成NZ排布,充分发挥带宽利用率。
502 502 
503- ![](images/image16.png)503+ ![](images/weight-nz-preprocess-inference-matmul.png)
504 504 
505 该方法仅适用于推理场景,训练场景由于无法对权重预处理,实际ND转NZ的操作会引入额外耗时。505 该方法仅适用于推理场景,训练场景由于无法对权重预处理,实际ND转NZ的操作会引入额外耗时。
506 506 
@@ -524,11 +524,11 @@ AI Core内部核心组件及组件功能详细说明如下表。
524 524 
525 每个channel包含多个bank,但同一bank无法同时处理多个请求(需先关闭当前行才能访问新行)。冲突场景:若多个请求访问同一channel的同一bank,需排队处理,导致bank conflict,影响数据搬运。传统的按照行/列优先分核的方式,会导致单边多核冲突过多而影响数据搬运效率,导致整体搬运效率较低。525 每个channel包含多个bank,但同一bank无法同时处理多个请求(需先关闭当前行才能访问新行)。冲突场景:若多个请求访问同一channel的同一bank,需排队处理,导致bank conflict,影响数据搬运。传统的按照行/列优先分核的方式,会导致单边多核冲突过多而影响数据搬运效率,导致整体搬运效率较低。
526 526 
527- ![](images/image17.png)527+ ![](images/dma-bank-conflict-row-col-major.png)
528 528 
529 为此可以使用错位分核的方式,减少M/N方向上的冲突核数,提升A/B矩阵的搬运带宽,优化整体带宽效率。529 为此可以使用错位分核的方式,减少M/N方向上的冲突核数,提升A/B矩阵的搬运带宽,优化整体带宽效率。
530 530 
531- ![](images/image18.png)531+ ![](images/dma-bank-conflict-staggered-cores.png)
532 532 
533- **代码实践**533- **代码实践**
534 534 
@@ -563,7 +563,7 @@ AI Core内部核心组件及组件功能详细说明如下表。
563 563 
564 对于读写只使用一次的数据,可以控制该数据进入L2缓存,减少读/写数据经过L2的处理开销,如下图,采用双页表\(拆分进入L2内存和不进入L2内存\),搬运数据流程中,通过设置内存使用标记,在黄色块处控制读写数据是否经过L2,走绿色的线单次读写更快。564 对于读写只使用一次的数据,可以控制该数据进入L2缓存,减少读/写数据经过L2的处理开销,如下图,采用双页表\(拆分进入L2内存和不进入L2内存\),搬运数据流程中,通过设置内存使用标记,在黄色块处控制读写数据是否经过L2,走绿色的线单次读写更快。
565 565 
566- ![](images/image19.png)566+ ![](images/dual-page-table-l2-bypass-flow.png)
567 567 
568- **代码实践**568- **代码实践**
569 569 
@@ -623,7 +623,7 @@ AI Core内部核心组件及组件功能详细说明如下表。
623 623 
624为了解决这类问题,当前支持通过Unitflag能力,实现MMAD指令和FIXP指令从指令级的同步转变成Block级同步。当最后一条MMAD指令计算完一个Block后,对应Block的矩阵输出结果已经完成计算,FIXP就可以从L0C搬出,优化流水如下所示:624为了解决这类问题,当前支持通过Unitflag能力,实现MMAD指令和FIXP指令从指令级的同步转变成Block级同步。当最后一条MMAD指令计算完一个Block后,对应Block的矩阵输出结果已经完成计算,FIXP就可以从L0C搬出,优化流水如下所示:
625 625 
626-![](images/image20.png)626+![](images/unitflag-mmad-fixpipe-block-sync.png)
627 627 
628```cpp628```cpp
629// 第7位表示是否使能Untifalg,置True即使能629// 第7位表示是否使能Untifalg,置True即使能
@@ -647,7 +647,7 @@ MTE2_PONG()
647 647 
648MTE2\_PONG的指令会在MTE2\_PING类的全部指令发射完毕后才会发射,如果中间MTE1/MMAD的指令过多,超出了芯片预设的指令队列深度,就会导致MTE2\_PONG指令无法发出,即使前面没有同步依赖。具体流水如下:648MTE2\_PONG的指令会在MTE2\_PING类的全部指令发射完毕后才会发射,如果中间MTE1/MMAD的指令过多,超出了芯片预设的指令队列深度,就会导致MTE2\_PONG指令无法发出,即使前面没有同步依赖。具体流水如下:
649 649 
650-![](images/image21.png)650+![](images/mte2-issue-queue-full-pipeline-block.png)
651 651 
652为此可以对MTE2指令使能preload,让指令提前发射,从而避免因ISSUE QUEE FULL导致指令阻塞,出现流水断流,修改后的指令发射顺序为:652为此可以对MTE2指令使能preload,让指令提前发射,从而避免因ISSUE QUEE FULL导致指令阻塞,出现流水断流,修改后的指令发射顺序为:
653 653 
@@ -669,4 +669,4 @@ MTE2_PING() // 继续优先发送下一轮PING的MTE2
669 669 
670优化完的流水如下所示:670优化完的流水如下所示:
671 671 
672-![](images/image22.png)672+![](images/mte2-preload-reordered-pipeline.png)
MSamples/2_Performance/matmul_story/docs/quant_matmul_mx_performance.md+12-12文件内容审核中,请稍后刷新重试
MSamples/2_Performance/matmul_story/docs/quant_matmul_mxfp4_tutorials.md+4-4文件内容审核中,请稍后刷新重试