已合并
将GMM/MM下imageXX.png重新命名 #182
wuyi_51创建于 4月22日
将GMM/MM下imageXX.png重新命名 #182
已合并
共 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 | - | 34 | + |
| 35 | 35 | ||
| 36 | 36 | ||
| 37 | AI Core中包含**计算单元、存储单元、搬运单元**等核心组件。 | 37 | AI 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 | -  | 94 | +  |
| 95 | 95 | ||
| 96 | 96 | ||
| 97 | - **计算单元** | 97 | - **计算单元** |
| @@ -116,7 +116,7 @@ AI Core内部核心组件及组件功能详细说明如下表。 | |||
| 116 | - L0B Buffer:FRACTAL\_ZN | 116 | - L0B Buffer:FRACTAL\_ZN |
| 117 | - L0C Buffer:FRACTAL\_NZ | 117 | - L0C Buffer:FRACTAL\_NZ |
| 118 | 118 | ||
| 119 | -  | 119 | +  |
| 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 |  | 175 |  |
| 176 | 176 | ||
| 177 | -  | 177 | +  |
| 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 | -  | 303 | +  |
| 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 | -  | 311 | +  |
| 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 | -  | 345 | +  |
| 346 | 346 | ||
| 347 | - 切K后:采用切K模板代码逻辑,运行耗时需要8.44us。 | 347 | - 切K后:采用切K模板代码逻辑,运行耗时需要8.44us。 |
| 348 | 348 | ||
| 349 | -  | 349 | +  |
| 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 | -  | 362 | +  |
| 363 | 363 | ||
| 364 | 为提升这类场景的L2命中率,可将单轮计算设计的输入矩阵限制在L2 Buffer Size内,并在多轮计算之间采用“Z”型循环展开遍历,实现数据更换中至少单边数据可复用,提高整体L2命中率。 | 364 | 为提升这类场景的L2命中率,可将单轮计算设计的输入矩阵限制在L2 Buffer Size内,并在多轮计算之间采用“Z”型循环展开遍历,实现数据更换中至少单边数据可复用,提高整体L2命中率。 |
| 365 | 365 | ||
| 366 | -  | 366 | +  |
| 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 | -  | 420 | +  |
| 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 | -  | 461 | +  |
| 462 | 462 | ||
| 463 | 输出排布如下: | 463 | 输出排布如下: |
| 464 | 464 | ||
| 465 | -  | 465 | +  |
| 466 | 466 | ||
| 467 | 3. **TransposeOut** | 467 | 3. **TransposeOut** |
| 468 | 468 | ||
| @@ -470,11 +470,11 @@ AI Core内部核心组件及组件功能详细说明如下表。 | |||
| 470 | 470 | ||
| 471 | 输入排布如下: | 471 | 输入排布如下: |
| 472 | 472 | ||
| 473 | -  | 473 | +  |
| 474 | 474 | ||
| 475 | 输出排布如下: | 475 | 输出排布如下: |
| 476 | 476 | ||
| 477 | -  | 477 | +  |
| 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 | -  | 503 | +  |
| 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 | -  | 527 | +  |
| 528 | 528 | ||
| 529 | 为此可以使用错位分核的方式,减少M/N方向上的冲突核数,提升A/B矩阵的搬运带宽,优化整体带宽效率。 | 529 | 为此可以使用错位分核的方式,减少M/N方向上的冲突核数,提升A/B矩阵的搬运带宽,优化整体带宽效率。 |
| 530 | 530 | ||
| 531 | -  | 531 | +  |
| 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 | -  | 566 | +  |
| 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 | - | 626 | + |
| 627 | 627 | ||
| 628 | ```cpp | 628 | ```cpp |
| 629 | // 第7位表示是否使能Untifalg,置True即使能 | 629 | // 第7位表示是否使能Untifalg,置True即使能 |
| @@ -647,7 +647,7 @@ MTE2_PONG() | |||
| 647 | 647 | ||
| 648 | MTE2\_PONG的指令会在MTE2\_PING类的全部指令发射完毕后才会发射,如果中间MTE1/MMAD的指令过多,超出了芯片预设的指令队列深度,就会导致MTE2\_PONG指令无法发出,即使前面没有同步依赖。具体流水如下: | 648 | MTE2\_PONG的指令会在MTE2\_PING类的全部指令发射完毕后才会发射,如果中间MTE1/MMAD的指令过多,超出了芯片预设的指令队列深度,就会导致MTE2\_PONG指令无法发出,即使前面没有同步依赖。具体流水如下: |
| 649 | 649 | ||
| 650 | - | 650 | + |
| 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 | - | 672 | + |