已合并
fix docs #4086
yhkz9211创建于 7月7日
fix docs #4086
已合并
yhkz9211创建于 7月7日
共 33 个文件变更+283-328
@@ -60,6 +60,8 @@ asc-devkit:
60 - impl/c_api/instr_impl/npu_arch_2201/debug_impl/printf_impl.h60 - impl/c_api/instr_impl/npu_arch_2201/debug_impl/printf_impl.h
61 - impl/c_api/instr_impl/npu_arch_2201/debug_impl.h61 - impl/c_api/instr_impl/npu_arch_2201/debug_impl.h
62 - impl/basic_api/common_types.h62 - impl/basic_api/common_types.h
63+ - impl/basic_api/kernel_operator_gemm_base_impl.h
64+ - impl/basic_api/kernel_operator_gemm_intf_impl.h
63 - impl/adv_api/detail/hccl/common/hccl_inner_def.h65 - impl/adv_api/detail/hccl/common/hccl_inner_def.h
64 - impl/adv_api/detail/hccl/common/hccl_base.h66 - impl/adv_api/detail/hccl/common/hccl_base.h
65 - impl/adv_api/detail/hccl/common/hccl_aicpu_def.h67 - impl/adv_api/detail/hccl/common/hccl_aicpu_def.h
@@ -49,12 +49,12 @@
49 49 
50## 功能说明<a name="section618mcpsimp"></a>50## 功能说明<a name="section618mcpsimp"></a>
51 51 
52-将dstReg中数据根据mask进行解压缩。解压缩方式:dstReg中第0个元素置为0,dstReg中的第i个元素等于mask中从第0个到第\(i-1\)个元素中1的数量。mask最高位被忽略不参与统计。以uint8\_t类型为例,算法逻辑表示如下:52+以dstReg为源操作数和目的操作数,根据mask进行解压缩。解压缩方式:dstReg中第0个元素置为0,dstReg中的第i个元素等于mask中从第0个到第\(i-1\)个元素中1的数量。mask最高位被忽略不参与统计。以uint8\_t类型为例,算法逻辑表示如下:
53 53 
54```54```
55dstReg[0] = 0;55dstReg[0] = 0;
56for(int i = 1; i < AscendC::GetVecLen() / sizeof(uint8_t); i++){56for(int i = 1; i < AscendC::GetVecLen() / sizeof(uint8_t); i++){
57-dstReg[i] = mask[i - 1] ? (dstReg[i - 1] + 1) : dstReg[i - 1];57+ dstReg[i] = mask[i - 1] ? (dstReg[i - 1] + 1) : dstReg[i - 1];
58}58}
59```59```
60 60 
@@ -94,33 +94,18 @@ __simd_callee__ inline void Unsqueeze(U& dstReg, MaskReg& mask)
94 94 
95**表2** 函数参数说明95**表2** 函数参数说明
96 96 
97-<a name="zh-cn_topic_0235751031_table33761356"></a>97+| 参数名称 | 输入/输出 | 描述 |
Y
YYifan Wang7月7日

[V0-P2] 文档清理 | Unsqueeze参数描述需同步

dstReg参数标注已从"输出"改为"输入/输出"(正确,因为Unsqueeze以dstReg为源和目的),但Histograms.md中dstReg参数表未同步清理为markdown格式(仍为HTML table)。建议确认是否遗漏。

此评论由AI生成,如有异议,请回复帮助我更快成长:)

likedislike
98-<table><thead align="left"><tr id="zh-cn_topic_0235751031_row27598891"><th class="cellrowborder" valign="top" width="18.54%" id="mcps1.2.4.1.1"><p id="zh-cn_topic_0235751031_p20917673"><a name="zh-cn_topic_0235751031_p20917673"></a><a name="zh-cn_topic_0235751031_p20917673"></a>参数名</p>98+| ------ | ------ | ------ |
99-</th>99+| dstReg | 输入/输出 | 源操作数和目的操作数。<br>类型为[RegTensor](../寄存器数据类型/RegTensor.md)。 |
100-<th class="cellrowborder" valign="top" width="10.05%" id="mcps1.2.4.1.2"><p id="zh-cn_topic_0235751031_p16609919"><a name="zh-cn_topic_0235751031_p16609919"></a><a name="zh-cn_topic_0235751031_p16609919"></a>输入/输出</p>100+| mask | 输入 | mask用于提供dstReg解压缩信息。<br>类型为[MaskReg](../寄存器数据类型/MaskReg.md)。 |
101-</th>101+ 
102-<th class="cellrowborder" valign="top" width="71.41%" id="mcps1.2.4.1.3"><p id="zh-cn_topic_0235751031_p59995477"><a name="zh-cn_topic_0235751031_p59995477"></a><a name="zh-cn_topic_0235751031_p59995477"></a>描述</p>102+## 返回值说明
103-</th>103+ 
104-</tr>104+无
105-</thead>105+ 
106-<tbody><tr id="row42461942101815"><td class="cellrowborder" valign="top" width="18.54%" headers="mcps1.2.4.1.1 "><p id="p284425844311"><a name="p284425844311"></a><a name="p284425844311"></a>dstReg</p>106+## 数据类型
107-</td>107+ 
108-<td class="cellrowborder" valign="top" width="10.05%" headers="mcps1.2.4.1.2 "><p id="p158449584436"><a name="p158449584436"></a><a name="p158449584436"></a>输出</p>108+支持的数据类型为:int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t。
109-</td>
110-<td class="cellrowborder" valign="top" width="71.41%" headers="mcps1.2.4.1.3 "><p id="p6389114616514"><a name="p6389114616514"></a><a name="p6389114616514"></a>目的操作数和源操作数。</p>
111-<p id="p1818424418593"><a name="p1818424418593"></a><a name="p1818424418593"></a>类型为<a href="../寄存器数据类型/RegTensor.md">RegTensor</a>。</p>
112-</td>
113-</tr>
114-<tr id="row17332152321719"><td class="cellrowborder" valign="top" width="18.54%" headers="mcps1.2.4.1.1 "><p id="p1538745616196"><a name="p1538745616196"></a><a name="p1538745616196"></a>mask</p>
115-</td>
116-<td class="cellrowborder" valign="top" width="10.05%" headers="mcps1.2.4.1.2 "><p id="p73331523101710"><a name="p73331523101710"></a><a name="p73331523101710"></a>输入</p>
117-</td>
118-<td class="cellrowborder" valign="top" width="71.41%" headers="mcps1.2.4.1.3 "><p id="p1559991025517"><a name="p1559991025517"></a><a name="p1559991025517"></a>mask用于提供dstReg解压缩信息。</p>
119-<p id="p911252842816"><a name="p911252842816"></a><a name="p911252842816"></a>类型为MaskReg。</p>
120-</td>
121-</tr>
122-</tbody>
123-</table>
124 109 
125## 约束说明<a name="section177921451558"></a>110## 约束说明<a name="section177921451558"></a>
126 111 
@@ -141,4 +126,3 @@ __simd_vf__ inline void UnsqueezeVF(__ubuf__ T* dstAddr, uint32_t oneRepeatSize,
141 }126 }
142}127}
143```128```
144- 
@@ -76,49 +76,14 @@ __simd_callee__ inline void Histograms(V& dstReg, S& srcReg, MaskReg& mask)
76 76 
77**表1** 模板参数说明77**表1** 模板参数说明
78 78 
79-<a name="table4835205712588"></a>79+| 参数名称 | 描述 |
80-<table><thead align="left"><tr id="row118356578583"><th class="cellrowborder" valign="top" width="17.94%" id="mcps1.2.3.1.1"><p id="p48354572582"><a name="p48354572582"></a><a name="p48354572582"></a>参数名</p>80+| ------ | ------ |
81-</th>81+| T | 源操作数的数据类型。 |
82-<th class="cellrowborder" valign="top" width="82.06%" id="mcps1.2.3.1.2"><p id="p583535795817"><a name="p583535795817"></a><a name="p583535795817"></a>描述</p>82+| U | 目的操作数的数据类型。 |
83-</th>83+| mode | HistogramsBinType枚举类型,用于选择统计srcReg的低位区间或高位区间。Histograms将uint8_t类型srcReg的[0, 255]取值范围划分为低位、高位两个区间;每个区间包含128个取值,对应uint16_t类型dstReg在一个VL(256Byte)内可保存的128个统计结果。单次调用只统计其中一个区间,并将该区间的统计结果写入传入的dstReg。若需要获得完整[0, 255]范围的统计结果,需要分别以BIN0和BIN1调用两次接口,并使用两个目的寄存器保存结果,例如dst0保存低位区间结果,dst1保存高位区间结果。<br>• BIN0:统计srcReg中[0, 127]范围内的数据,结果写入传入的dstReg。<br>• BIN1:统计srcReg中[128, 255]范围内的数据,结果写入传入的dstReg。 |
84-</tr>84+| type | HistogramsType 枚举类型,表示统计模式。<br>• FREQUENCY:频率统计模式,统计srcReg中[0, 255]每个数的数量。每个dst有128个元素,其中低位模式dstReg中每个元素对应src中[0, 127]每个元素的累加个数,高位模式dstReg中每个元素对应src中[128,255]每个元素的累加个数。<br>• ACCUMULATE:累计统计模式,统计srcReg中[0, 255]每个数及其之前出现数的数量总和。每个dst有128个元素,其中低位模式dstReg中每个元素对应src中[0, 127]每个元素区间累加个数,高位模式dstReg中每个元素对应src中[128,255]每个元素区间累加个数。 |
85-</thead>85+| S | 源操作数RegTensor类型,由编译器自动推导,用户不需要填写。 |
86-<tbody><tr id="row1835857145817"><td class="cellrowborder" valign="top" width="17.94%" headers="mcps1.2.3.1.1 "><p id="p5835457165816"><a name="p5835457165816"></a><a name="p5835457165816"></a>T</p>86+| V | 目的操作数RegTensor类型,由编译器自动推导,用户不需要填写。 |
87-</td>
88-<td class="cellrowborder" valign="top" width="82.06%" headers="mcps1.2.3.1.2 "><p id="p168351657155818"><a name="p168351657155818"></a><a name="p168351657155818"></a>源操作数的数据类型。</p>
89-<p id="p188929596549"><a name="p188929596549"></a><a name="p188929596549"></a><span id="ph1479120155519"><a name="ph1479120155519"></a><a name="ph1479120155519"></a>Ascend 950PR/Ascend 950DT</span>,支持的数据类型为:uint8_t</p>
90-</td>
91-</tr>
92-<tr id="row18835145716587"><td class="cellrowborder" valign="top" width="17.94%" headers="mcps1.2.3.1.1 "><p id="p1383515717581"><a name="p1383515717581"></a><a name="p1383515717581"></a>U</p>
93-</td>
94-<td class="cellrowborder" valign="top" width="82.06%" headers="mcps1.2.3.1.2 "><p id="p1775118537244"><a name="p1775118537244"></a><a name="p1775118537244"></a>目的操作数的数据类型。</p>
95-<p id="p18114175555419"><a name="p18114175555419"></a><a name="p18114175555419"></a><span id="ph811495510548"><a name="ph811495510548"></a><a name="ph811495510548"></a>Ascend 950PR/Ascend 950DT</span>,支持的数据类型为:uint16_t</p>
96-</td>
97-</tr>
98-<tr id="row18128134152619"><td class="cellrowborder" valign="top" width="17.94%" headers="mcps1.2.3.1.1 "><p id="p2012917416262"><a name="p2012917416262"></a><a name="p2012917416262"></a>mode</p>
99-</td>
100-<td class="cellrowborder" valign="top" width="82.06%" headers="mcps1.2.3.1.2 "><p id="p9905165812547"><a name="p9905165812547"></a><a name="p9905165812547"></a>HistogramsBinType枚举类型,用于控制统计src的低位区间[0-127](前半部分)或高位区间[128-255](后半部分)的数据。VL长度为256Byte,dst数据类型为uint16_t,一个dst可以存储128个数据,因此需要两个dst。</p>
101-<a name="ul59931348346"></a><a name="ul59931348346"></a><ul id="ul59931348346"><li>BIN0表示低位模式,统计src中[0-127]范围内的数据写入dst0。</li><li>BIN1表示高位模式,统计src中[128-255]范围内的数据写入dst1。</li></ul>
102-</td>
103-</tr>
104-<tr id="row134244441918"><td class="cellrowborder" valign="top" width="17.94%" headers="mcps1.2.3.1.1 "><p id="p916243141912"><a name="p916243141912"></a><a name="p916243141912"></a>type</p>
105-</td>
106-<td class="cellrowborder" valign="top" width="82.06%" headers="mcps1.2.3.1.2 "><div class="p" id="p1663311238518"><a name="p1663311238518"></a><a name="p1663311238518"></a>HistogramsType枚举类型,表示统计模式。<a name="ul36112038046"></a><a name="ul36112038046"></a><ul id="ul36112038046"><li>FREQUENCY:频率统计模式,统计src中[0, 255]每个数的数量。每个dst有128个元素,其中dst0中每个元素对应src中[0, 127]每个元素的累加个数,dst1中每个元素对应src中[128,255]每个元素的累加个数。</li><li>ACCUMULATE:累计统计模式,统计src中x&lt;=0、x&lt;=1、x&lt;=2、x&lt;=3......x&lt;=254、x&lt;=255每个区间的元素个数。每个dst有128个元素,其中dst0中每个元素对应src中[0, 127]每个元素区间累加个数,dst1中每个元素对应src中[128,255]每个元素区间累加个数。</li></ul>
107-</div>
108-</td>
109-</tr>
110-<tr id="row1237743311380"><td class="cellrowborder" valign="top" width="17.94%" headers="mcps1.2.3.1.1 "><p id="p6377173353817"><a name="p6377173353817"></a><a name="p6377173353817"></a>S</p>
111-</td>
112-<td class="cellrowborder" valign="top" width="82.06%" headers="mcps1.2.3.1.2 "><p id="p2304311103410"><a name="p2304311103410"></a><a name="p2304311103410"></a>目的操作数RegTensor类型,由编译器自动推导,用户不需要填写。</p>
113-</td>
114-</tr>
115-<tr id="row175751956133812"><td class="cellrowborder" valign="top" width="17.94%" headers="mcps1.2.3.1.1 "><p id="p357565618387"><a name="p357565618387"></a><a name="p357565618387"></a>V</p>
116-</td>
117-<td class="cellrowborder" valign="top" width="82.06%" headers="mcps1.2.3.1.2 "><p id="p12801441174416"><a name="p12801441174416"></a><a name="p12801441174416"></a>源操作数RegTensor类型,由编译器自动推导,用户不需要填写。</p>
118-</td>
119-</tr>
120-</tbody>
121-</table>
122 87 
123**表2** 参数说明88**表2** 参数说明
124 89 
@@ -36,7 +36,7 @@
36 36 
37 ```cpp37 ```cpp
38 template <typename T, typename U, typename S>38 template <typename T, typename U, typename S>
39- __aicore__ inline void Gemm(const LocalTensor<T>& dst, const LocalTensor<U>& src0, const LocalTensor<S>& src1, const uint32_t m, const uint32_t k, const uint32_t n, GemmTiling tilling, bool partialsum = true, int32_t initValue = 0)39+ __aicore__ inline void Gemm(const LocalTensor<T>& dst, const LocalTensor<U>& src0, const LocalTensor<S>& src1, const uint32_t m, const uint32_t k, const uint32_t n, GemmTiling tiling, bool partialsum = true, int32_t initValue = 0)
40 ```40 ```
41 41 
42- 切分方案计算接口:42- 切分方案计算接口:
@@ -58,9 +58,9 @@
58| m | 输入 | 左矩阵Src0Local有效Height,范围:[1, 4096]。<br>注意:m可以不是16的倍数。 |58| m | 输入 | 左矩阵Src0Local有效Height,范围:[1, 4096]。<br>注意:m可以不是16的倍数。 |
59| k | 输入 | 左矩阵Src0Local有效Width、右矩阵Src1Local有效Height。<br>&bull; 当输入张量Src0Local的数据类型为float时,范围:[1, 8192]<br>&bull; 当输入张量Src0Local的数据类型为half时,范围:[1, 16384]<br>&bull; 当输入张量Src0Local的数据类型为int8_t时,范围:[1, 32768]<br><br>注意:k可以不是16的倍数。 |59| k | 输入 | 左矩阵Src0Local有效Width、右矩阵Src1Local有效Height。<br>&bull; 当输入张量Src0Local的数据类型为float时,范围:[1, 8192]<br>&bull; 当输入张量Src0Local的数据类型为half时,范围:[1, 16384]<br>&bull; 当输入张量Src0Local的数据类型为int8_t时,范围:[1, 32768]<br><br>注意:k可以不是16的倍数。 |
60| n | 输入 | 右矩阵Src1Local有效Width,范围:[1, 4096]。<br>注意:n可以不是16的倍数。 |60| n | 输入 | 右矩阵Src1Local有效Width,范围:[1, 4096]。<br>注意:n可以不是16的倍数。 |
61-| tilling | 输入 | 切分规则,类型为GemmTiling,结构体具体定义为:<br><br><pre>struct GemmTiling {<br> const uint32_t blockSize = 16;<br> LoopMode loopMode = LoopMode::MODE_NM;<br> uint32_t mNum = 0;<br> uint32_t nNum = 0;<br> uint32_t kNum = 0;<br> uint32_t roundM = 0;<br> uint32_t roundN = 0;<br> uint32_t roundK = 0;<br> uint32_t c0Size = 32;<br> uint32_t dtypeSize = 1;<br> uint32_t mBlockNum = 0;<br> uint32_t nBlockNum = 0;<br> uint32_t kBlockNum = 0;<br> uint32_t mIterNum = 0;<br> uint32_t nIterNum = 0;<br> uint32_t kIterNum = 0;<br> uint32_t mTileBlock = 0;<br> uint32_t nTileBlock = 0;<br> uint32_t kTileBlock = 0;<br> uint32_t kTailBlock = 0;<br> uint32_t mTailBlock = 0;<br> uint32_t nTailBlock = 0;<br> bool kHasTail = false;<br> bool mHasTail = false;<br> bool nHasTail = false;<br> bool kHasTailEle = false;<br> uint32_t kTailEle = 0;<br>};<br></pre><br>参数说明请参考[表3](#table3)。 |61+| tiling | 输入 | 切分规则,类型为GemmTiling,结构体具体定义为:<br><br><pre>struct GemmTiling {<br> const uint32_t blockSize = 16;<br> LoopMode loopMode = LoopMode::MODE_NM;<br> uint32_t mNum = 0;<br> uint32_t nNum = 0;<br> uint32_t kNum = 0;<br> uint32_t roundM = 0;<br> uint32_t roundN = 0;<br> uint32_t roundK = 0;<br> uint32_t c0Size = 32;<br> uint32_t dtypeSize = 1;<br> uint32_t mBlockNum = 0;<br> uint32_t nBlockNum = 0;<br> uint32_t kBlockNum = 0;<br> uint32_t mIterNum = 0;<br> uint32_t nIterNum = 0;<br> uint32_t kIterNum = 0;<br> uint32_t mTileBlock = 0;<br> uint32_t nTileBlock = 0;<br> uint32_t kTileBlock = 0;<br> uint32_t kTailBlock = 0;<br> uint32_t mTailBlock = 0;<br> uint32_t nTailBlock = 0;<br> bool kHasTail = false;<br> bool mHasTail = false;<br> bool nHasTail = false;<br> bool kHasTailEle = false;<br> uint32_t kTailEle = 0;<br>};<br></pre><br>参数说明请参考[表3](#table3)。 |
62-| partialsum | 输入 | 当dst参数所在的TPosition为CO2时,通过该参数控制计算结果是否搬出。<br>&bull; 取值0:搬出计算结果;<br>&bull; 取值1:不搬出计算结果,可以进行后续计算。 |62+| partialsum | 输入 | 当dst参数所在的TPosition为CO2时,通过该参数控制计算结果是否搬出。<br>&bull;取值0:搬出计算结果;<br>&bull;取值1:不搬出计算结果,可以进行后续计算。 |
63-| initValue | 输入 | 表示dst是否需要初始化。<br>&bull; 取值0:dst需要初始化,dst初始矩阵保存有之前结果,新计算结果会累加前一次Gemm计算结果。<br>&bull; 取值1:dst不需要初始化,dst初始矩阵中数据无意义,计算结果直接覆盖dst中的数据。 |63+| initValue | 输入 | 表示dst是否需要初始化。<br>&bull;取值0:dst需要初始化,dst初始矩阵保存有之前结果,新计算结果会累加前一次Gemm计算结果。<br>&bull;取值1:dst不需要初始化,dst初始矩阵中数据无意义,计算结果直接覆盖dst中的数据。 |
64 64 
65**表2** src0、src1和dst的数据类型组合65**表2** src0、src1和dst的数据类型组合
66 66 
@@ -164,10 +164,10 @@ Atlas A2 训练系列产品/Atlas A2 推理系列产品
164 164 
165| 参数名称 | 含义 |165| 参数名称 | 含义 |
166| --- | --- |166| --- | --- |
167-| m | 左矩阵Height,取值范围:m∈[0,4095]。默认值为0。 |167+| m | 左矩阵Height,取值范围:m∈[0, 4095]。默认值为0。 |
168-| n | 右矩阵Width,取值范围:n∈[0,4095]。默认值为0。 |168+| n | 右矩阵Width,取值范围:n∈[0, 4095]。默认值为0。 |
169-| k | 左矩阵Width、右矩阵Height,取值范围:k∈[0,4095]。默认值为0。 |169+| k | 左矩阵Width、右矩阵Height,取值范围:k∈[0, 4095]。默认值为0。 |
170-| cmatrixInitVal | 是否开启C矩阵默认初始化清零操作。默认值true。<br>&nbsp;&nbsp;&bull; true:C矩阵默认初始化为0;<br>&nbsp;&nbsp;&bull; false:C矩阵不进行默认操作,通过设置cmatrixSource参数进行初始化。 |170+| cmatrixInitVal | 是否开启C矩阵默认初始化清零操作。默认值为 true。<br>&nbsp;&nbsp;&bull; true:C矩阵默认初始化为0;<br>&nbsp;&nbsp;&bull; false:C矩阵不进行默认操作,通过设置cmatrixSource参数进行初始化。 |
171| cmatrixSource | 配置C矩阵初始值是否来源于BT Buffer。默认值为false。<br>&nbsp;&nbsp;&bull; false:不对L0C Buffer进行初始化操作;<br>&nbsp;&nbsp;&bull; true:使用BT Buffer(TPosition:C2)的数据对L0C Buffer进行初始化操作。<br><br>Atlas 训练系列产品,仅支持配置为false。<br><br>Atlas 推理系列产品AI Core,仅支持配置为false。<br><br>Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持配置为true/false。<br><br>Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持配置为true/false。<br><br>Atlas 200I/500 A2 推理产品,支持配置为true/false。<br><br>Ascend 950PR/Ascend 950DT,支持配置为true/false。<br><br>Kirin X90仅支持配置为false。<br><br>Kirin 9030仅支持配置为false。<br><br>注意:带Bias输入的接口配置该参数无效,会根据bias输入的位置来判断C矩阵初始值是否来源于BT Buffer。 |171| cmatrixSource | 配置C矩阵初始值是否来源于BT Buffer。默认值为false。<br>&nbsp;&nbsp;&bull; false:不对L0C Buffer进行初始化操作;<br>&nbsp;&nbsp;&bull; true:使用BT Buffer(TPosition:C2)的数据对L0C Buffer进行初始化操作。<br><br>Atlas 训练系列产品,仅支持配置为false。<br><br>Atlas 推理系列产品AI Core,仅支持配置为false。<br><br>Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持配置为true/false。<br><br>Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持配置为true/false。<br><br>Atlas 200I/500 A2 推理产品,支持配置为true/false。<br><br>Ascend 950PR/Ascend 950DT,支持配置为true/false。<br><br>Kirin X90仅支持配置为false。<br><br>Kirin 9030仅支持配置为false。<br><br>注意:带Bias输入的接口配置该参数无效,会根据bias输入的位置来判断C矩阵初始值是否来源于BT Buffer。 |
172| isBias | 该参数废弃,新开发内容不要使用该参数。如果需要累加初始矩阵,请使用带Bias的接口来实现;也可以通过cmatrixInitVal和cmatrixSource参数配置C矩阵的初始值来源来实现。推荐使用带Bias的接口,相比于配置cmatrixInitVal和cmatrixSource参数更加简单方便。<br><br>配置是否需要累加初始矩阵,默认值为false,取值说明如下:<br>&nbsp;&nbsp;&bull; false:矩阵乘,无需累加初始矩阵,C = A \* B。<br>&nbsp;&nbsp;&bull; true:矩阵乘加,需要累加初始矩阵,C += A \* B。 |172| isBias | 该参数废弃,新开发内容不要使用该参数。如果需要累加初始矩阵,请使用带Bias的接口来实现;也可以通过cmatrixInitVal和cmatrixSource参数配置C矩阵的初始值来源来实现。推荐使用带Bias的接口,相比于配置cmatrixInitVal和cmatrixSource参数更加简单方便。<br><br>配置是否需要累加初始矩阵,默认值为false,取值说明如下:<br>&nbsp;&nbsp;&bull; false:矩阵乘,无需累加初始矩阵,C = A \* B。<br>&nbsp;&nbsp;&bull; true:矩阵乘加,需要累加初始矩阵,C += A \* B。 |
173| disableGemv | M=1时,该参数用来配置Mmad计算是否开启[GEMV](关键特性说明/GEMV.md#ZH-CN_TOPIC_0000002538231187)模式。<br>&nbsp;&nbsp;&bull; false:开启GEMV模式。<br>&nbsp;&nbsp;&bull; true:关闭GEMV模式。<br><br>该参数仅支持如下型号:<br><br>Ascend 950PR/Ascend 950DT |173| disableGemv | M=1时,该参数用来配置Mmad计算是否开启[GEMV](关键特性说明/GEMV.md#ZH-CN_TOPIC_0000002538231187)模式。<br>&nbsp;&nbsp;&bull; false:开启GEMV模式。<br>&nbsp;&nbsp;&bull; true:关闭GEMV模式。<br><br>该参数仅支持如下型号:<br><br>Ascend 950PR/Ascend 950DT |
@@ -127,13 +127,13 @@ __aicore__ inline MmadBitModeParams(const MmadBitModeParams &mmadParams_);
127 127 
128| 参数名称 | 含义 |128| 参数名称 | 含义 |
129| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |129| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
130-| m | 左矩阵Height,取值范围:m∈[0,4095]。默认值为0。<br>该参数是位域结构体的最低位参数,占用12bit,可以使用MmadBitModeParams类对象的SetM()函数设置其值,使用GetM()函数获取其值。 |130+| m | 左矩阵Height,取值范围:m∈[0, 4095]。默认值为0。<br>该参数是位域结构体的最低位参数,占用12bit,可以使用MmadBitModeParams类对象的SetM()函数设置其值,使用GetM()函数获取其值。 |
131-| k | 左矩阵Width、右矩阵Height,取值范围:k∈[0,4095]。默认值为0。<br>该参数是位域结构体的第二低位参数,占用12bit,可以使用MmadBitModeParams类对象的SetK()函数设置其值,使用GetK()函数获取其值。 |131+| k | 左矩阵Width、右矩阵Height,取值范围:k∈[0, 4095]。默认值为0。<br>该参数是位域结构体的第二低位参数,占用12bit,可以使用MmadBitModeParams类对象的SetK()函数设置其值,使用GetK()函数获取其值。 |
132-| n | 右矩阵Width,取值范围:n∈[0,4095]。默认值为0。<br>该参数是位域结构体的第三低位参数,占用12bit,可以使用MmadBitModeParams类对象的SetN()函数设置其值,使用GetN()函数获取其值。 |132+| n | 右矩阵Width,取值范围:n∈[0, 4095]。默认值为0。<br>该参数是位域结构体的第三低位参数,占用12bit,可以使用MmadBitModeParams类对象的SetN()函数设置其值,使用GetN()函数获取其值。 |
133| unitFlag | 预留参数。为后续的功能做保留,开发者暂时无需关注,使用默认值即可。<br>该参数是位域结构体的第四低位参数,占用2bit,可以使用MmadBitModeParams类对象的SetUnitFlag()函数设置其值,使用GetUnitFlag()函数获取其值。 |133| unitFlag | 预留参数。为后续的功能做保留,开发者暂时无需关注,使用默认值即可。<br>该参数是位域结构体的第四低位参数,占用2bit,可以使用MmadBitModeParams类对象的SetUnitFlag()函数设置其值,使用GetUnitFlag()函数获取其值。 |
134| disableGemv | M = 1时,用于配置Mmad计算是否开启GEMV。当输入为false时,表示开启GEMV;反之,输入为true时,表示关闭GEMV。<br>GEMV(General Matrix-Vector Multiplication)表示实现矩阵和向量的乘积,开启GEMV后,Mmad API从L0A Buffer读取数据时,数据将以ND格式进行读取,而不会将其视为ZZ格式。<br>该参数是位域结构体的第五低位参数,占用1bit,可以使用MmadBitModeParams类对象的SetDisableGemv()函数设置其值,使用GetDisableGemv()函数获取其值。 |134| disableGemv | M = 1时,用于配置Mmad计算是否开启GEMV。当输入为false时,表示开启GEMV;反之,输入为true时,表示关闭GEMV。<br>GEMV(General Matrix-Vector Multiplication)表示实现矩阵和向量的乘积,开启GEMV后,Mmad API从L0A Buffer读取数据时,数据将以ND格式进行读取,而不会将其视为ZZ格式。<br>该参数是位域结构体的第五低位参数,占用1bit,可以使用MmadBitModeParams类对象的SetDisableGemv()函数设置其值,使用GetDisableGemv()函数获取其值。 |
135| cmatrixSource | 配置C矩阵初始值是否来源于BT Buffer(TPosition:C2)。默认值为false。<br>&nbsp;&nbsp;&bull; false:来源于L0C Buffer(TPosition:CO1);<br>&nbsp;&nbsp;&bull; true:来源于BT Buffer(TPosition:C2)。<br>注意:带bias输入的接口配置该参数无效,会根据bias输入的位置来判断C矩阵初始值是否来源于L0C Buffer还是BT Buffer。<br>该参数是位域结构体的第六低位参数,占用1bit,可以使用MmadBitModeParams类对象的SetCmatrixSource()函数设置其值,使用GetCmatrixSource()函数获取其值。 |135| cmatrixSource | 配置C矩阵初始值是否来源于BT Buffer(TPosition:C2)。默认值为false。<br>&nbsp;&nbsp;&bull; false:来源于L0C Buffer(TPosition:CO1);<br>&nbsp;&nbsp;&bull; true:来源于BT Buffer(TPosition:C2)。<br>注意:带bias输入的接口配置该参数无效,会根据bias输入的位置来判断C矩阵初始值是否来源于L0C Buffer还是BT Buffer。<br>该参数是位域结构体的第六低位参数,占用1bit,可以使用MmadBitModeParams类对象的SetCmatrixSource()函数设置其值,使用GetCmatrixSource()函数获取其值。 |
136-| cmatrixInitVal | 配置C矩阵初始值是否为0。默认值true。<br>&nbsp;&nbsp;&bull; true:C矩阵初始值为0;<br>&nbsp;&nbsp;&bull; false:C矩阵初始值通过cmatrixSource参数进行配置。<br>该参数是位域结构体的最高位参数,占用1bit,可以使用MmadBitModeParams类对象的SetCmatrixInitVal()函数设置其值,使用GetCmatrixInitVal()函数获取其值。 |136+| cmatrixInitVal | 配置C矩阵初始值是否为0。默认值为 true。<br>&nbsp;&nbsp;&bull; true:C矩阵初始值为0;<br>&nbsp;&nbsp;&bull; false:C矩阵初始值通过cmatrixSource参数进行配置。<br>该参数是位域结构体的最高位参数,占用1bit,可以使用MmadBitModeParams类对象的SetCmatrixInitVal()函数设置其值,使用GetCmatrixInitVal()函数获取其值。 |
137 137 
138## 数据类型<a id="zh_cn_topic_mmadbitmode_section_datatype"></a>138## 数据类型<a id="zh_cn_topic_mmadbitmode_section_datatype"></a>
139 139 
@@ -113,10 +113,10 @@ __aicore__ inline void MmadWithSparse(const LocalTensor<T>& dst, const LocalTens
113 113 
114| 参数名称 | 含义 |114| 参数名称 | 含义 |
115| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |115| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
116-| m | 左矩阵Height,取值范围:m∈[0,4095]。默认值为0。 |116+| m | 左矩阵Height,取值范围:m∈[0, 4095]。默认值为0。 |
117-| n | 右矩阵Width,取值范围:n∈[0,4095]。默认值为0。 |117+| n | 右矩阵Width,取值范围:n∈[0, 4095]。默认值为0。 |
118-| k | 左矩阵Width、右矩阵Height,取值范围:k∈[0,4095]。默认值为0。 |118+| k | 左矩阵Width、右矩阵Height,取值范围:k∈[0, 4095]。默认值为0。 |
119-| cmatrixInitVal | 是否开启C矩阵默认初始化清零操作。默认值true。<br>&nbsp;&nbsp;&bull; true:C矩阵默认初始化为0;<br>&nbsp;&nbsp;&bull; false:C矩阵不进行默认操作,通过设置cmatrixSource参数进行初始化。 |119+| cmatrixInitVal | 是否开启C矩阵默认初始化清零操作。默认值为 true。<br>&nbsp;&nbsp;&bull; true:C矩阵默认初始化为0;<br>&nbsp;&nbsp;&bull; false:C矩阵不进行默认操作,通过设置cmatrixSource参数进行初始化。 |
120| cmatrixSource | 配置C矩阵初始值是否来源于BT Buffer。默认值为false。<br>&nbsp;&nbsp;&bull; false:不对L0C Buffer进行初始化操作;<br>&nbsp;&nbsp;&bull; true:使用BT Buffer(TPosition:C2)的数据对L0C Buffer进行初始化操作。<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持配置为true/false。<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持配置为true/false。<br>Atlas 200I/500 A2 推理产品,支持配置为true/false。<br>注意:带Bias输入的接口配置该参数无效,会根据Bias输入的位置来判断C矩阵初始值是否来源于BT Buffer。 |120| cmatrixSource | 配置C矩阵初始值是否来源于BT Buffer。默认值为false。<br>&nbsp;&nbsp;&bull; false:不对L0C Buffer进行初始化操作;<br>&nbsp;&nbsp;&bull; true:使用BT Buffer(TPosition:C2)的数据对L0C Buffer进行初始化操作。<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持配置为true/false。<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持配置为true/false。<br>Atlas 200I/500 A2 推理产品,支持配置为true/false。<br>注意:带Bias输入的接口配置该参数无效,会根据Bias输入的位置来判断C矩阵初始值是否来源于BT Buffer。 |
121| isBias | 该参数废弃,新开发内容不要使用该参数。如果需要累加初始矩阵,请使用带Bias的接口来实现;也可以通过cmatrixInitVal和cmatrixSource参数配置C矩阵的初始值来源来实现。推荐使用带Bias的接口,相比于配置cmatrixInitVal和cmatrixSource参数更加简单方便。<br>配置是否需要累加初始矩阵,默认值为false,取值说明如下:<br>&nbsp;&nbsp;&bull; false:矩阵乘,无需累加初始矩阵,C = A \* B。<br>&nbsp;&nbsp;&bull; true:矩阵乘加,需要累加初始矩阵,C += A \* B。 |121| isBias | 该参数废弃,新开发内容不要使用该参数。如果需要累加初始矩阵,请使用带Bias的接口来实现;也可以通过cmatrixInitVal和cmatrixSource参数配置C矩阵的初始值来源来实现。推荐使用带Bias的接口,相比于配置cmatrixInitVal和cmatrixSource参数更加简单方便。<br>配置是否需要累加初始矩阵,默认值为false,取值说明如下:<br>&nbsp;&nbsp;&bull; false:矩阵乘,无需累加初始矩阵,C = A \* B。<br>&nbsp;&nbsp;&bull; true:矩阵乘加,需要累加初始矩阵,C += A \* B。 |
122| unitFlag | unitFlag是一种Mmad指令和Fixpipe指令细粒度的并行,开启该功能后,硬件每计算完一个分形,计算结果就会被搬出。取值说明如下:<br>&nbsp;&nbsp;&bull; 0(2'b00):不开启unitFlag;<br>&nbsp;&nbsp;&bull; 2(2'b10):开启unitFlag,硬件执行完指令之后,不复位单元标记位;<br>&nbsp;&nbsp;&bull; 3(2'b11):开启unitFlag,硬件执行完指令之后,复位单元标记位。<br>开启该功能时,须将Mmad指令和Fixpipe指令的unitFlag值设置为2或3。<br>该参数仅支持如下型号:<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品;<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品。<br>参数设置方案和特性细节可参考:[UnitFlag](关键特性说明/UnitFlag.md#ZH-CN_TOPIC_00000025690709788)。 |122| unitFlag | unitFlag是一种Mmad指令和Fixpipe指令细粒度的并行,开启该功能后,硬件每计算完一个分形,计算结果就会被搬出。取值说明如下:<br>&nbsp;&nbsp;&bull; 0(2'b00):不开启unitFlag;<br>&nbsp;&nbsp;&bull; 2(2'b10):开启unitFlag,硬件执行完指令之后,不复位单元标记位;<br>&nbsp;&nbsp;&bull; 3(2'b11):开启unitFlag,硬件执行完指令之后,复位单元标记位。<br>开启该功能时,须将Mmad指令和Fixpipe指令的unitFlag值设置为2或3。<br>该参数仅支持如下型号:<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品;<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品。<br>参数设置方案和特性细节可参考:[UnitFlag](关键特性说明/UnitFlag.md#ZH-CN_TOPIC_00000025690709788)。 |
@@ -88,7 +88,7 @@ __aicore__ inline void LoadData(const LocalTensor<T>& dst, const LocalTensor<T>&
88| sid | 此参数用户无需关注,设置为0即可。<br>**注:预留的扩展参数,当前因后续架构升级,该参数已废弃,不对其进行业务处理。** |88| sid | 此参数用户无需关注,设置为0即可。<br>**注:预留的扩展参数,当前因后续架构升级,该参数已废弃,不对其进行业务处理。** |
89| dstGap | 相邻迭代间,目的操作数前一个分形结束地址与后一个分形起始地址的间隔,单位:512字节。取值范围:dstGap∈[0, 65535]。默认为0。<br>特性细节可参考:[非连续搬入](#非连续搬入)。<br>**注:dstGap=0表示相邻repeat目的操作数起始地址间隔1个数据分形即连续存放。** |89| dstGap | 相邻迭代间,目的操作数前一个分形结束地址与后一个分形起始地址的间隔,单位:512字节。取值范围:dstGap∈[0, 65535]。默认为0。<br>特性细节可参考:[非连续搬入](#非连续搬入)。<br>**注:dstGap=0表示相邻repeat目的操作数起始地址间隔1个数据分形即连续存放。** |
90| ifTranspose | 是否启用转置功能,对每个分形矩阵进行转置,默认为false:<br>&nbsp;&nbsp;&bull; true:启用<br>&nbsp;&nbsp;&bull; false:不启用<br>特性细节可参考:[分形转置](#分形转置)。<br>**注:只有L1 Buffer->L0A Buffer和L1 Buffer->L0B Buffer通路才能开启转置,开启转置功能时,源操作数、目的操作数仅支持b16数据类型。** |90| ifTranspose | 是否启用转置功能,对每个分形矩阵进行转置,默认为false:<br>&nbsp;&nbsp;&bull; true:启用<br>&nbsp;&nbsp;&bull; false:不启用<br>特性细节可参考:[分形转置](#分形转置)。<br>**注:只有L1 Buffer->L0A Buffer和L1 Buffer->L0B Buffer通路才能开启转置,开启转置功能时,源操作数、目的操作数仅支持b16数据类型。** |
91-| addrMode | 用于控制多次迭代场景下,源操作数中每一次迭代的分形矩阵索引ID是递增还是递减:<br>&nbsp;&nbsp;&bull; 0(默认):递增,下一次repeat index = startIndex + srcStride×repeatTime;<br>&nbsp;&nbsp;&bull; 1:递减,下一次repeat index = startIndex - srcStride×repeatTime。<br>特性细节可参考:[控制地址更新方式](#控制地址更新方式)。<br>**注:目前仅GM->L1 Buffer通路支持配置,保持默认值0即可,该参数不涉及性能。** |91+| addrMode | 用于控制多次迭代场景下,源操作数中每一次迭代的分形矩阵索引ID是递增还是递减:<br>&nbsp;&nbsp;&bull; 0(默认):递增,下一次repeat index = startIndex + srcStride \* repeatTimes;<br>&nbsp;&nbsp;&bull; 1:递减,下一次repeat index = startIndex - srcStride \* repeatTimes。<br>特性细节可参考:[控制地址更新方式](#控制地址更新方式)。<br>**注:目前仅GM->L1 Buffer通路支持配置,保持默认值0即可,该参数不涉及性能。** |
92 92 
93## 数据类型93## 数据类型
94 94 
@@ -506,7 +506,7 @@ repeatMode =1的时候filter窗口中读取数据的位置保持不变,每个r
506 506 
507## 调用示例<a id="zh-cn_topic_0000002512171652_section088124295117"></a>507## 调用示例<a id="zh-cn_topic_0000002512171652_section088124295117"></a>
508 508 
509-如下示例中:A矩阵转置,shape为[k,m],b32数据类型下,GM->L1 Buffer->L0A Buffer数据排布分别是ND、NZ和ZZ。但是L1 Buffer->L0A Buffer的时候,无法调用LoadDataWithTranspose指令对进行转置,因为在K轴方向两个连续的分形并不能合并为一个16\*16的方块,示意图如下:509+如下示例中:A矩阵转置,shape为[k,m],b32数据类型下,GM->L1 Buffer->L0A Buffer数据排布分别是ND、NZ和ZZ。但是L1 Buffer->L0A Buffer的时候,无法调用LoadDataWithTranspose指令对其进行转置,因为在K轴方向两个连续的分形并不能合并为一个16\*16的方块,示意图如下:
510 510 
511![](../../../../../figures/load3d_l1tol0a_b32demo.png)511![](../../../../../figures/load3d_l1tol0a_b32demo.png)
512 512 
@@ -164,7 +164,7 @@ Kirin X90,支持数据类型:int8_t、half。
164 164 
165 如下图示例:165 如下图示例:
166 166 
167- - 共需要处理3072字节的数据,每次迭代处理32\*32\*1字节数据,需要3次迭代可以完成,repeatTime = 3;167+ - 共需要处理3072字节的数据,每次迭代处理32\*32\*1字节数据,需要3次迭代可以完成,repeatTimes = 3;
168 - srcStride = 1,表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1(单位:32\*32\*1字节),这里的单位实际上是拼接后的方块矩阵的大小;168 - srcStride = 1,表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1(单位:32\*32\*1字节),这里的单位实际上是拼接后的方块矩阵的大小;
169 - dstGap = 1,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址的间隔为1(单位:512字节);169 - dstGap = 1,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址的间隔为1(单位:512字节);
170 - dstFracGap = 0,表示每个迭代内目的操作数前一个分形的结束地址与后一个分形起始地址的间隔为0(单位:512字节)。170 - dstFracGap = 0,表示每个迭代内目的操作数前一个分形的结束地址与后一个分形起始地址的间隔为0(单位:512字节)。
@@ -173,7 +173,7 @@ Kirin X90,支持数据类型:int8_t、half。
173 173 
174 如下图示例:174 如下图示例:
175 175 
176- - repeatTime和srcStride的解释和上图示例一致;176+ - repeatTimes和srcStride的解释和上图示例一致;
177 - dstGap = 0,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址和下一个迭代第一个分形起始地址无间隔;177 - dstGap = 0,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址和下一个迭代第一个分形起始地址无间隔;
178 - dstFracGap = 2,表示每个迭代内目的操作数前一个分形的结束地址与后一个分形起始地址的间隔为2(单位:512字节)。178 - dstFracGap = 2,表示每个迭代内目的操作数前一个分形的结束地址与后一个分形起始地址的间隔为2(单位:512字节)。
179 179 
@@ -181,7 +181,7 @@ Kirin X90,支持数据类型:int8_t、half。
181 181 
182- 对于half/bfloat16\_t数据类型,每次迭代处理16\*16\*2字节数据,可处理1个分形(一个分形512字节),每次迭代中,源操作数中1个16\*16分形将被转置。182- 对于half/bfloat16\_t数据类型,每次迭代处理16\*16\*2字节数据,可处理1个分形(一个分形512字节),每次迭代中,源操作数中1个16\*16分形将被转置。
183 183 
184- - 共需要处理1536字节的数据,每次迭代处理16\*16\*2字节数据,需要3次迭代可以完成,repeatTime = 3;184+ - 共需要处理1536字节的数据,每次迭代处理16\*16\*2字节数据,需要3次迭代可以完成,repeatTimes = 3;
185 - srcStride = 1,表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1 (单位:16\*16\*2字节);185 - srcStride = 1,表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1 (单位:16\*16\*2字节);
186 - dstGap = 0,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址无间隔;186 - dstGap = 0,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址无间隔;
187 - 该场景下,因为其分形即为方块矩阵,每个迭代处理一个分形,不存在迭代内分形的间隔,该参数设置无效。187 - 该场景下,因为其分形即为方块矩阵,每个迭代处理一个分形,不存在迭代内分形的间隔,该参数设置无效。
@@ -192,7 +192,7 @@ Kirin X90,支持数据类型:int8_t、half。
192 192 
193 如下图示例:193 如下图示例:
194 194 
195- - 共需要处理3072字节的数据,每次迭代处理16\*16\*4字节数据,需要3次迭代可以完成,repeatTime = 3;195+ - 共需要处理3072字节的数据,每次迭代处理16\*16\*4字节数据,需要3次迭代可以完成,repeatTimes = 3;
196 - srcStride = 1,表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1(单位:16\*16\*4字节),这里的单位实际上是拼接后的方块矩阵的大小;196 - srcStride = 1,表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1(单位:16\*16\*4字节),这里的单位实际上是拼接后的方块矩阵的大小;
197 - dstGap = 1,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址的间隔为1(单位:512字节);197 - dstGap = 1,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址的间隔为1(单位:512字节);
198 - dstFracGap = 0,表示每个迭代内目的操作数前一个分形结束地址与后一个分形起始地址的间隔为0(单位:512字节)。198 - dstFracGap = 0,表示每个迭代内目的操作数前一个分形结束地址与后一个分形起始地址的间隔为0(单位:512字节)。
@@ -201,7 +201,7 @@ Kirin X90,支持数据类型:int8_t、half。
201 201 
202 如下图示例:202 如下图示例:
203 203 
204- - repeatTime和srcStride的解释和上图示例一致;204+ - repeatTimes和srcStride的解释和上图示例一致;
205 - dstGap = 0,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址和下一个迭代第一个分形起始地址无间隔;205 - dstGap = 0,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址和下一个迭代第一个分形起始地址无间隔;
206 - dstFracGap = 2,表示每个迭代内目的操作数前一个分形结束地址与后一个分形起始地址的间隔为2(单位:512字节)。206 - dstFracGap = 2,表示每个迭代内目的操作数前一个分形结束地址与后一个分形起始地址的间隔为2(单位:512字节)。
207 207 
@@ -215,7 +215,7 @@ Kirin X90,支持数据类型:int8_t、half。
215 215 
216 如下图示例:216 如下图示例:
217 217 
218- - 共需要处理6144字节的数据,每次迭代处理64\*64\*0.5字节数据,需要3次迭代可以完成,repeatTime = 3;218+ - 共需要处理6144字节的数据,每次迭代处理64\*64\*0.5字节数据,需要3次迭代可以完成,repeatTimes = 3;
219 - srcStride = 1,表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1(单位:64\*64\*0.5字节),这里的单位实际上是拼接后的方块矩阵的大小;219 - srcStride = 1,表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1(单位:64\*64\*0.5字节),这里的单位实际上是拼接后的方块矩阵的大小;
220 - dstGap = 1,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址的间隔为1(单位:512字节);220 - dstGap = 1,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址的间隔为1(单位:512字节);
221 - dstFracGap = 0,表示每个迭代内目的操作数前一个分形的结束地址与后一个分形起始地址的间隔为0(单位:512字节)。221 - dstFracGap = 0,表示每个迭代内目的操作数前一个分形的结束地址与后一个分形起始地址的间隔为0(单位:512字节)。
@@ -224,7 +224,7 @@ Kirin X90,支持数据类型:int8_t、half。
224 224 
225 如下图示例:225 如下图示例:
226 226 
227- - repeatTime和srcStride的解释和上图示例一致;227+ - repeatTimes和srcStride的解释和上图示例一致;
228 - dstGap = 0,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址和下一个迭代第一个分形起始地址无间隔;228 - dstGap = 0,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址和下一个迭代第一个分形起始地址无间隔;
229 - dstFracGap = 2,表示每个迭代内目的操作数前一个分形的结束地址与后一个分形起始地址的间隔为2(单位:512字节)。229 - dstFracGap = 2,表示每个迭代内目的操作数前一个分形的结束地址与后一个分形起始地址的间隔为2(单位:512字节)。
230 230 
@@ -251,7 +251,7 @@ Kirin X90,支持数据类型:int8_t、half。
251 251 
252 如下图示例:252 如下图示例:
253 253 
254- - 共需要处理12288字节的数据,每次迭代处理64\*64\*0.5字节数据,需要3次迭代可以完成,repeatTime = 3;254+ - 共需要处理12288字节的数据,每次迭代处理64\*64\*0.5字节数据,需要3次迭代可以完成,repeatTimes = 3;
255 - srcStride = 1,表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1(单位:64\*64\*0.5字节);255 - srcStride = 1,表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1(单位:64\*64\*0.5字节);
256 - dstGap = 7,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址的间隔为7(单位:512字节);256 - dstGap = 7,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址的间隔为7(单位:512字节);
257 - dstFracGap = 0,表示每个迭代内目的操作数前一个分形的结束地址与后一个分形起始地址的间隔为0(单位:512字节);257 - dstFracGap = 0,表示每个迭代内目的操作数前一个分形的结束地址与后一个分形起始地址的间隔为0(单位:512字节);
@@ -261,7 +261,7 @@ Kirin X90,支持数据类型:int8_t、half。
261 261 
262 如下图示例:262 如下图示例:
263 263 
264- - repeatTime和srcStride的解释和上图示例一致;264+ - repeatTimes和srcStride的解释和上图示例一致;
265 - dstGap = 0,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址和下一个迭代第一个分形起始地址无间隔;265 - dstGap = 0,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址和下一个迭代第一个分形起始地址无间隔;
266 - dstFracGap = 2,表示每个迭代内目的操作数前一个分形的结束地址与后一个分形起始地址的间隔为2(单位:512字节);266 - dstFracGap = 2,表示每个迭代内目的操作数前一个分形的结束地址与后一个分形起始地址的间隔为2(单位:512字节);
267 - 外层for循环的循环次数是2,源操作数的地址偏移量是3(单位:64\*64\*0.5字节),目的操作数的地址偏移量是3(单位:64\*64\*0.5字节)。267 - 外层for循环的循环次数是2,源操作数的地址偏移量是3(单位:64\*64\*0.5字节),目的操作数的地址偏移量是3(单位:64\*64\*0.5字节)。
@@ -291,7 +291,7 @@ Kirin X90,支持数据类型:int8_t、half。
291 291 
292- 对于half数据类型,每次迭代处理16\*16\*2字节数据,可处理1个分形(一个分形512字节),每次迭代中,源操作数中1个16\*16分形将被转置。292- 对于half数据类型,每次迭代处理16\*16\*2字节数据,可处理1个分形(一个分形512字节),每次迭代中,源操作数中1个16\*16分形将被转置。
293 293 
294- - 共需要处理3072字节的数据,每次迭代处理16\*16\*2字节数据,需要3次迭代可以完成,repeatTime = 3;294+ - 共需要处理3072字节的数据,每次迭代处理16\*16\*2字节数据,需要3次迭代可以完成,repeatTimes = 3;
295 - srcStride = 1,表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1 (单位:16\*16\*2字节);295 - srcStride = 1,表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1 (单位:16\*16\*2字节);
296 - dstGap = 0,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址无间隔;296 - dstGap = 0,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址无间隔;
297 - 该场景下,因为其分形即为方块矩阵,每个迭代处理一个分形,不存在迭代内分形的间隔,dstFracGap参数设置无效。297 - 该场景下,因为其分形即为方块矩阵,每个迭代处理一个分形,不存在迭代内分形的间隔,dstFracGap参数设置无效。
@@ -303,7 +303,7 @@ Kirin X90,支持数据类型:int8_t、half。
303 303 
304 如下图示例:304 如下图示例:
305 305 
306- - 共需要处理6144字节的数据,每次迭代处理16\*16\*4字节数据,需要3次迭代可以完成,repeatTime = 3;306+ - 共需要处理6144字节的数据,每次迭代处理16\*16\*4字节数据,需要3次迭代可以完成,repeatTimes = 3;
307 - srcStride = 1,表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1(单位:16\*16\*4字节);307 - srcStride = 1,表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1(单位:16\*16\*4字节);
308 - dstGap = 3,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址的间隔为3(单位:512字节);308 - dstGap = 3,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址的间隔为3(单位:512字节);
309 - dstFracGap = 0,表示每个迭代内目的操作数前一个分形结束地址与后一个分形起始地址的间隔为0(单位:512字节)。309 - dstFracGap = 0,表示每个迭代内目的操作数前一个分形结束地址与后一个分形起始地址的间隔为0(单位:512字节)。
@@ -313,7 +313,7 @@ Kirin X90,支持数据类型:int8_t、half。
313 313 
314 如下图示例:314 如下图示例:
315 315 
316- - repeatTime和srcStride的解释和上图示例一致;316+ - repeatTimes和srcStride的解释和上图示例一致;
317 - dstGap = 0,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址和下一个迭代第一个分形起始地址无间隔;317 - dstGap = 0,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址和下一个迭代第一个分形起始地址无间隔;
318 - dstFracGap = 2,表示每个迭代内目的操作数前一个分形结束地址与后一个分形起始地址的间隔为2(单位:512字节);318 - dstFracGap = 2,表示每个迭代内目的操作数前一个分形结束地址与后一个分形起始地址的间隔为2(单位:512字节);
319 - 外层for循环的循环次数是2,源操作数的地址偏移量是3(单位:16\*16\*4字节),目的操作数的地址偏移量是3(单位:16\*16\*4字节)。319 - 外层for循环的循环次数是2,源操作数的地址偏移量是3(单位:16\*16\*4字节),目的操作数的地址偏移量是3(单位:16\*16\*4字节)。
@@ -63,7 +63,7 @@ __aicore__ inline void LoadData(const LocalTensor<T>& dst, const GlobalTensor<T>
63| sid | 此参数用户无需关注,设置为0即可。 |63| sid | 此参数用户无需关注,设置为0即可。 |
64| dstGap | 相邻迭代间,目的操作数前一个分形**结束地址**与后一个分形**起始地址**的间隔,单位:512字节。取值范围:dstGap∈[0, 65535]。默认为0。<br>**注:dstGap = 0表示相邻repeat目的操作数起始地址间隔1个数据分形即连续存放。** |64| dstGap | 相邻迭代间,目的操作数前一个分形**结束地址**与后一个分形**起始地址**的间隔,单位:512字节。取值范围:dstGap∈[0, 65535]。默认为0。<br>**注:dstGap = 0表示相邻repeat目的操作数起始地址间隔1个数据分形即连续存放。** |
65| ifTranspose | 是否启用转置功能,对每个分形矩阵进行转置,默认为false:<br>&nbsp;&nbsp;&bull; true:启用。<br>&nbsp;&nbsp;&bull; false:不启用。<br>**注:本通路场景下不支持转置,参数无意义,保持默认即可。** |65| ifTranspose | 是否启用转置功能,对每个分形矩阵进行转置,默认为false:<br>&nbsp;&nbsp;&bull; true:启用。<br>&nbsp;&nbsp;&bull; false:不启用。<br>**注:本通路场景下不支持转置,参数无意义,保持默认即可。** |
66-| addrMode | 用于控制多次迭代场景下,源操作数中每一次迭代的分形矩阵索引ID是递增还是递减,0表示递增,下一次repeat index = startIndex + srcStride \* repeatTime。1表示递减,下一次repeat index = startIndex - srcStride \* repeatTime。 |66+| addrMode | 用于控制多次迭代场景下,源操作数中每一次迭代的分形矩阵索引ID是递增还是递减,0表示递增,下一次repeat index = startIndex + srcStride \* repeatTimes。1表示递减,下一次repeat index = startIndex - srcStride \* repeatTimes。 |
67 67 
68## 数据类型<a id="zh-cn_topic_0000002567745223_section4219135304818"></a>68## 数据类型<a id="zh-cn_topic_0000002567745223_section4219135304818"></a>
69 69 
@@ -98,7 +98,7 @@ DataCopy矩阵搬出接口支持多种随路能力的组合,需要设置不同
98| dstStride | &bull; 不开启NZ2ND功能([NZ2NZ搬运](./关键特性说明/NZ2NZ.md)):目的NZ矩阵中相邻Z排布的起始地址偏移,取值不为0,单位为datablock(32字节)。<br>&bull; 开启随路[NZ2ND](./关键特性说明/NZ2ND.md)功能:目的ND矩阵每一行中的元素个数,取值不为0 ,单位为element。 |98| dstStride | &bull; 不开启NZ2ND功能([NZ2NZ搬运](./关键特性说明/NZ2NZ.md)):目的NZ矩阵中相邻Z排布的起始地址偏移,取值不为0,单位为datablock(32字节)。<br>&bull; 开启随路[NZ2ND](./关键特性说明/NZ2ND.md)功能:目的ND矩阵每一行中的元素个数,取值不为0 ,单位为element。 |
99| srcStride | 源NZ矩阵中相邻Z排布的起始地址偏移,取值范围为srcStride∈[0, 65535],单位为C0_Size(16*sizeof(T)),T为src的数据类型,其值应填成mSize对16向上取整。 |99| srcStride | 源NZ矩阵中相邻Z排布的起始地址偏移,取值范围为srcStride∈[0, 65535],单位为C0_Size(16*sizeof(T)),T为src的数据类型,其值应填成mSize对16向上取整。 |
100| unitFlag | unitFlag是一种Mmad指令和Fixpipe指令细粒度的并行,开启该功能后,硬件每计算完一个分形,计算结果就会被搬出。取值说明如下:<br>&nbsp;&nbsp;&bull; 0(2'b00):不开启unitFlag。<br>&nbsp;&nbsp;&bull; 2(2'b10):开启unitFlag,硬件执行完指令之后,不复位单元标记位。<br>&nbsp;&nbsp;&bull; 3(2'b11):开启unitFlag,硬件执行完指令之后,复位单元标记位。<br>开启该功能时,须将Mmad指令和Fixpipe指令的unitFlag值设置为2或3。<br>参数设置方案和特性细节可参考:Mmad计算中关键特性说明的[UnitFlag](../Mmad计算/关键特性说明/UnitFlag.md)章节。 |100| unitFlag | unitFlag是一种Mmad指令和Fixpipe指令细粒度的并行,开启该功能后,硬件每计算完一个分形,计算结果就会被搬出。取值说明如下:<br>&nbsp;&nbsp;&bull; 0(2'b00):不开启unitFlag。<br>&nbsp;&nbsp;&bull; 2(2'b10):开启unitFlag,硬件执行完指令之后,不复位单元标记位。<br>&nbsp;&nbsp;&bull; 3(2'b11):开启unitFlag,硬件执行完指令之后,复位单元标记位。<br>开启该功能时,须将Mmad指令和Fixpipe指令的unitFlag值设置为2或3。<br>参数设置方案和特性细节可参考:Mmad计算中关键特性说明的[UnitFlag](../Mmad计算/关键特性说明/UnitFlag.md)章节。 |
101-| clipReluPre | <!-- npu="950,A3,910b" id13 -->该参数仅在Atlas 200I/500 A2 推理产品支持。<br><!-- end id13 --><!-- npu="310b" id14 -->用于配置是否开启ClipReLU操作,参数类型为uint8_t,取值如下:0,不开启ClipReLU;1,开启ClipReLU,此时需要调用[SetFixPipeClipRelu](./寄存器配置说明/SetFixPipeClipRelu.md)来设置clipReLU的最大值。<br>&nbsp;&nbsp;&bull; 该操作在随路量化后进行,quantPre配置后才能使用,当前支持的量化模式有F322F16/DEQF16/VDEQF16/QF322B8_PRE/VQF322B8_PRE/REQ8/VREQ8。<br><!-- end id14 --> |101+| clipReluPre | <!-- npu="950,A3,910b" id13 -->该参数仅在Atlas 200I/500 A2 推理产品支持。<br><!-- end id13 --><!-- npu="310b" id14 -->用于配置是否开启ClipReLU操作,参数类型为uint8_t,取值如下:0,不开启ClipReLU;1,开启ClipReLU,此时需要调用[SetFixPipeClipRelu](./寄存器配置说明/SetFixPipeClipRelu.md)来设置ClipReLU的最大值。<br>&nbsp;&nbsp;&bull; 该操作在随路量化后进行,quantPre配置后才能使用,当前支持的量化模式有F322F16/DEQF16/VDEQF16/QF322B8_PRE/VQF322B8_PRE/REQ8/VREQ8。<br><!-- end id14 --> |
102| eltWiseOp | <!-- npu="950,A3,910b" id15 -->该参数仅在Atlas 200I/500 A2 推理产品支持。<br><!-- end id15 --><!-- npu="310b" id16 -->用于配置是否开启Elementwise操作及操作模式。Elementwise操作是指进行随路量化后,可以逐个元素加/减一个LocalTensor,大小为mSize * nSize,具体LocalTensor地址相关参数需要调用[SetFixPipeAddr](./寄存器配置说明/SetFixPipeAddr.md)来设置。<br>eltWiseOp参数类型为uint8_t,取值如下:<br>&nbsp;&nbsp;&bull; 0:不开启Elementwise;<br>&nbsp;&nbsp;&bull; 1:Elementwise Addition;<br>&nbsp;&nbsp;&bull; 2:Elementwise Subtraction。<br><!-- end id16 --> |102| eltWiseOp | <!-- npu="950,A3,910b" id15 -->该参数仅在Atlas 200I/500 A2 推理产品支持。<br><!-- end id15 --><!-- npu="310b" id16 -->用于配置是否开启Elementwise操作及操作模式。Elementwise操作是指进行随路量化后,可以逐个元素加/减一个LocalTensor,大小为mSize * nSize,具体LocalTensor地址相关参数需要调用[SetFixPipeAddr](./寄存器配置说明/SetFixPipeAddr.md)来设置。<br>eltWiseOp参数类型为uint8_t,取值如下:<br>&nbsp;&nbsp;&bull; 0:不开启Elementwise;<br>&nbsp;&nbsp;&bull; 1:Elementwise Addition;<br>&nbsp;&nbsp;&bull; 2:Elementwise Subtraction。<br><!-- end id16 --> |
103| quantPre | 用于控制量化模式,QuantMode_t类型,具体定义如下:<br>&nbsp;&nbsp;&bull; float/int32_t输出此需配置为QuantMode_t::NoQuant。<br>&nbsp;&nbsp;&bull; half/bfloat16_t输出,此参数需配置为QuantMode_t::F322F16/QuantMode_t::F322BF16。<br>&nbsp;&nbsp;&bull; 配置为scalar量化时,需要调用[SetFixpipePreQuantFlag](./寄存器配置说明/SetFixpipePreQuantFlag.md)接口来设置scalar量化参数。<br>&nbsp;&nbsp;&bull; 配置为tensor量化时,需要调用[SetFixPipeConfig](./寄存器配置说明/SetFixPipeConfig.md)来设置tensor量化参数,其中tensor量化参数需要通过DataCopy从L1 Buffer搬运至Fixpipe Buffer。<br>注:此参数需要用户手动配置,不会自动推导配置对应量化模式。<br><pre>enum QuantMode_t<br>{<br> NoQuant, // 不开启量化功能<br> F322F16, // Float32_2_Float16:float cast成half,cast mode为CAST_RINT模式<br> F322BF16, // Float32_2_BFloat16:float cast成bfloat16_t,cast mode为CAST_RINT模式<br> DEQF16, // DeQuant_Float16:int32_t量化成half,scalar量化<br> VDEQF16, // Vector_DeQuant_Float16:int32_t量化成half,tensor量化<br> QF322B8_PRE, // Quant_Float32_2_B8:float量化成int8_t/uint8_t,scalar量化<br> VQF322B8_PRE, // Vector_Quant_Float32_2_B8:float量化成int8_t/uint8_t,tensor量化<br> REQ8, // ReQuant_int8:int32_t量化成int8_t/uint8_t,scalar量化<br> VREQ8, // Vector_ReQuant_int8:int32_t量化成int8_t/uint8_t,tensor量化<br>};</pre> |103| quantPre | 用于控制量化模式,QuantMode_t类型,具体定义如下:<br>&nbsp;&nbsp;&bull; float/int32_t输出此需配置为QuantMode_t::NoQuant。<br>&nbsp;&nbsp;&bull; half/bfloat16_t输出,此参数需配置为QuantMode_t::F322F16/QuantMode_t::F322BF16。<br>&nbsp;&nbsp;&bull; 配置为scalar量化时,需要调用[SetFixpipePreQuantFlag](./寄存器配置说明/SetFixpipePreQuantFlag.md)接口来设置scalar量化参数。<br>&nbsp;&nbsp;&bull; 配置为tensor量化时,需要调用[SetFixPipeConfig](./寄存器配置说明/SetFixPipeConfig.md)来设置tensor量化参数,其中tensor量化参数需要通过DataCopy从L1 Buffer搬运至Fixpipe Buffer。<br>注:此参数需要用户手动配置,不会自动推导配置对应量化模式。<br><pre>enum QuantMode_t<br>{<br> NoQuant, // 不开启量化功能<br> F322F16, // Float32_2_Float16:float cast成half,cast mode为CAST_RINT模式<br> F322BF16, // Float32_2_BFloat16:float cast成bfloat16_t,cast mode为CAST_RINT模式<br> DEQF16, // DeQuant_Float16:int32_t量化成half,scalar量化<br> VDEQF16, // Vector_DeQuant_Float16:int32_t量化成half,tensor量化<br> QF322B8_PRE, // Quant_Float32_2_B8:float量化成int8_t/uint8_t,scalar量化<br> VQF322B8_PRE, // Vector_Quant_Float32_2_B8:float量化成int8_t/uint8_t,tensor量化<br> REQ8, // ReQuant_int8:int32_t量化成int8_t/uint8_t,scalar量化<br> VREQ8, // Vector_ReQuant_int8:int32_t量化成int8_t/uint8_t,tensor量化<br>};</pre> |
104| reluPre | 用于配置ReLU操作的模式,类型为uint8_t,取值如下:<br>&nbsp;&nbsp;&bull; 0:不开启ReLU;<br>&nbsp;&nbsp;&bull; 1:Normal ReLU。 |104| reluPre | 用于配置ReLU操作的模式,类型为uint8_t,取值如下:<br>&nbsp;&nbsp;&bull; 0:不开启ReLU;<br>&nbsp;&nbsp;&bull; 1:Normal ReLU。 |
@@ -375,7 +375,7 @@ DataCopy矩阵搬出接口支持多种随路能力的组合,需要设置不同
375 // AscendC::PipeBarrier<PIPE_FIX>();375 // AscendC::PipeBarrier<PIPE_FIX>();
376 // // mov l0c to gm,量化操作后开启ClipReLU操作376 // // mov l0c to gm,量化操作后开启ClipReLU操作
377 // intriParams.clipReluPre = 1; 377 // intriParams.clipReluPre = 1;
378- // // 设置clip ReLU的值到寄存器378+ // // 设置ClipReLU的值到寄存器
379 // uint64_t clipReluVal = 0x3c00; // value 1, half379 // uint64_t clipReluVal = 0x3c00; // value 1, half
380 // SetFixPipeClipRelu(clipReluVal);380 // SetFixPipeClipRelu(clipReluVal);
381 // //mov l0c to gm,量化操作后,设置element-wise操作,Add381 // //mov l0c to gm,量化操作后,设置element-wise操作,Add
@@ -136,7 +136,7 @@
136| deqScalar | 可选输入 | scalar量化参数,表示单个scale值,quantPre量化模式为[随路量化](./关键特性说明/随路量化.md)时需要设置该参数。支持的数据类型为`uint64_t`。 |136| deqScalar | 可选输入 | scalar量化参数,表示单个scale值,quantPre量化模式为[随路量化](./关键特性说明/随路量化.md)时需要设置该参数。支持的数据类型为`uint64_t`。 |
137| [reluEn](./关键特性说明/随路ReLU.md) | 可选输入 | 是否开启NormReLU的开关:<br>&nbsp;&nbsp;&bull; `false`:不开启NormReLU功能, 默认为`false`;<br>&nbsp;&nbsp;&bull; `true`:开启NormReLU功能。 |137| [reluEn](./关键特性说明/随路ReLU.md) | 可选输入 | 是否开启NormReLU的开关:<br>&nbsp;&nbsp;&bull; `false`:不开启NormReLU功能, 默认为`false`;<br>&nbsp;&nbsp;&bull; `true`:开启NormReLU功能。 |
138| unitFlag | 可选输入 | unitFlag是一种Mmad指令和Fixpipe指令细粒度的并行,开启该功能后,硬件每计算完一个分形,计算结果就会被搬出。取值说明如下:<br>&nbsp;&nbsp;&bull; 0(2'b00):不开启unitFlag;<br>&nbsp;&nbsp;&bull; 2(2'b10):开启unitFlag,硬件执行完指令之后,不复位单元标记位;<br>&nbsp;&nbsp;&bull; 3(2'b11):开启unitFlag,硬件执行完指令之后,复位单元标记位。<br>开启该功能时,须将Mmad指令和Fixpipe指令的unitFlag值设置为2或3。<br>参数设置方案和特性细节可参考:Mmad计算中关键特性说明的[UnitFlag](../Mmad计算/关键特性说明/UnitFlag.md)章节。 |138| unitFlag | 可选输入 | unitFlag是一种Mmad指令和Fixpipe指令细粒度的并行,开启该功能后,硬件每计算完一个分形,计算结果就会被搬出。取值说明如下:<br>&nbsp;&nbsp;&bull; 0(2'b00):不开启unitFlag;<br>&nbsp;&nbsp;&bull; 2(2'b10):开启unitFlag,硬件执行完指令之后,不复位单元标记位;<br>&nbsp;&nbsp;&bull; 3(2'b11):开启unitFlag,硬件执行完指令之后,复位单元标记位。<br>开启该功能时,须将Mmad指令和Fixpipe指令的unitFlag值设置为2或3。<br>参数设置方案和特性细节可参考:Mmad计算中关键特性说明的[UnitFlag](../Mmad计算/关键特性说明/UnitFlag.md)章节。 |
139-| params | 可选输入 | 用于选择和配置不同的随路格式转换(NZ2ZN/NZ2ND/NZ2DN),该参数为TransformParams类型的结构体。TransformParams结构体是一个基于模板参数的类型选择器,用于在编译时根据定义FixpipeParamsArch3510搬运参数时使用的模板参数,自动选择对应的参数类型。<br><pre>template \<CO2Layout format\><br>struct TransformParams {};<br>template \<\><br>struct TransformParams\<CO2Layout::NZ\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = uint8_t;<br>};<br>template \<\><br>struct TransformParams\<CO2Layout::ROW_MAJOR\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = Nz2NdParams;<br>};<br>template \<\><br>struct TransformParams\<CO2Layout::COLUMN_MAJOR\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = Nz2DnParams;<br>};</pre><br>CO2Layout布局类型为ROW_MAJOR时, 该指令被定义为从L0C Buffer到目标位置的数据移动,并附带NZ2ND转换,结构体参数如下:<br><pre>struct Nz2NdParams {<br> uint16_t ndNum = 1;<br> uint16_t srcNdStride = 0;<br> uint32_t dstNdStride = 0; <br>};</pre>&nbsp;&nbsp;&bull; ndNum:源NZ矩阵的数目,也就是传输ND矩阵的数目,取值范围为ndNum∈[0, 65535]。**注:ndNum=0表示不执行搬运,该接口将被视为NOP(空操作)。**<br>&nbsp;&nbsp;&bull; srcNdStride:不同NZ矩阵起始地址之间的间隔,取值范围为srcNdStride∈[0, 65535],单位为C0_SIZE。当ndNum配置为1时,srcNdStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; dstNdStride:目的相邻ND矩阵起始地址之间的偏移,取值范围为dstNdStride∈[1, 2^32 -1],单位为element。当ndNum配置为1时,dstNdStride配置为0即可,不生效。<br><br>CO2Layout布局类型为COLUMN_MAJOR时, 该指令被定义为从L0C Buffer到目标位置的数据移动,并附带NZ2DN转换,结构体参数如下:<br><pre>struct Nz2DnParams {<br> uint16_t dnNum = 1;<br> uint16_t srcNzMatrixStride = 0;<br> uint32_t dstDnMatrixStride = 0;<br> uint16_t srcNzC0Stride = 0; <br>};</pre>&nbsp;&nbsp;&bull; dnNum:传输DN矩阵的数目,取值范围为dnNum∈[0, 65535]。**注:dnNum=0表示不执行搬运,该接口将被视为NOP(空操作)。**<br>&nbsp;&nbsp;&bull; srcNzMatrixStride:不同源NZ矩阵的偏移(头与头),取值范围srcNzMatrixStride∈[0, 65535],单位C0_SIZE。当dnNum配置为1时,srcNzMatrixStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; dstDnMatrixStride:目的相邻ND矩阵起始地址之间的偏移,取值范围dstDnMatrixStride∈[0, 2^32 -1],单位element。当dnNum配置为1时,dstDnMatrixStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; srcNzC0Stride:源矩阵NZ分形中相邻行的地址偏移(头与头),取值范围srcNzC0Stride∈[0, 65535],单位C0_SIZE。当启用NZ2DN时,srcNzC0Stride不能为0。<br><br>CO2Layout布局类型为NZ时,为普通搬运DMA模式,表示从L0C Buffer到目标位置的正常数据移动。 |139+| params | 可选输入 | 用于选择和配置不同的随路格式转换(NZ2NZ/NZ2ND/NZ2DN),该参数为TransformParams类型的结构体。TransformParams结构体是一个基于模板参数的类型选择器,用于在编译时根据定义FixpipeParamsArch3510搬运参数时使用的模板参数,自动选择对应的参数类型。<br><pre>template \<CO2Layout format\><br>struct TransformParams {};<br>template \<\><br>struct TransformParams\<CO2Layout::NZ\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = uint8_t;<br>};<br>template \<\><br>struct TransformParams\<CO2Layout::ROW_MAJOR\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = Nz2NdParams;<br>};<br>template \<\><br>struct TransformParams\<CO2Layout::COLUMN_MAJOR\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = Nz2DnParams;<br>};</pre><br>CO2Layout布局类型为ROW_MAJOR时, 该指令被定义为从L0C Buffer到目标位置的数据移动,并附带NZ2ND转换,结构体参数如下:<br><pre>struct Nz2NdParams {<br> uint16_t ndNum = 1;<br> uint16_t srcNdStride = 0;<br> uint32_t dstNdStride = 0; <br>};</pre>&nbsp;&nbsp;&bull; ndNum:源NZ矩阵的数目,也就是传输ND矩阵的数目,取值范围为ndNum∈[0, 65535]。**注:ndNum=0表示不执行搬运,该接口将被视为NOP(空操作)。**<br>&nbsp;&nbsp;&bull; srcNdStride:不同NZ矩阵起始地址之间的间隔,取值范围为srcNdStride∈[0, 65535],单位为C0_SIZE。当ndNum配置为1时,srcNdStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; dstNdStride:目的相邻ND矩阵起始地址之间的偏移,取值范围为dstNdStride∈[1, 2^32 -1],单位为element。当ndNum配置为1时,dstNdStride配置为0即可,不生效。<br><br>CO2Layout布局类型为COLUMN_MAJOR时, 该指令被定义为从L0C Buffer到目标位置的数据移动,并附带NZ2DN转换,结构体参数如下:<br><pre>struct Nz2DnParams {<br> uint16_t dnNum = 1;<br> uint16_t srcNzMatrixStride = 0;<br> uint32_t dstDnMatrixStride = 0;<br> uint16_t srcNzC0Stride = 0; <br>};</pre>&nbsp;&nbsp;&bull; dnNum:传输DN矩阵的数目,取值范围为dnNum∈[0, 65535]。**注:dnNum=0表示不执行搬运,该接口将被视为NOP(空操作)。**<br>&nbsp;&nbsp;&bull; srcNzMatrixStride:不同源NZ矩阵的偏移(头与头),取值范围srcNzMatrixStride∈[0, 65535],单位C0_SIZE。当dnNum配置为1时,srcNzMatrixStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; dstDnMatrixStride:目的相邻ND矩阵起始地址之间的偏移,取值范围dstDnMatrixStride∈[0, 2^32 -1],单位element。当dnNum配置为1时,dstDnMatrixStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; srcNzC0Stride:源矩阵NZ分形中相邻行的地址偏移(头与头),取值范围srcNzC0Stride∈[0, 65535],单位C0_SIZE。当启用NZ2DN时,srcNzC0Stride不能为0。<br><br>CO2Layout布局类型为NZ时,为普通搬运DMA模式,表示从L0C Buffer到目标位置的正常数据移动。 |
140| dualDstCtrl | 可选输入 | 此参数仅在L0C Buffer到Unified Buffer通路下有效。 |140| dualDstCtrl | 可选输入 | 此参数仅在L0C Buffer到Unified Buffer通路下有效。 |
141| subBlockId | 可选输入 | 此参数仅在L0C Buffer到Unified Buffer通路下有效。 |141| subBlockId | 可选输入 | 此参数仅在L0C Buffer到Unified Buffer通路下有效。 |
142| [isChannelSplit](./关键特性说明/F32-Channel-Split.md) | 可选输入 | 是否开启通道拆分的功能。默认为false,不开启该功能。仅在src和dst都为float时才能开启通道拆分,且不能同时开启ChannelSplit和NZ2ND/NZ2DN功能。 |142| [isChannelSplit](./关键特性说明/F32-Channel-Split.md) | 可选输入 | 是否开启通道拆分的功能。默认为false,不开启该功能。仅在src和dst都为float时才能开启通道拆分,且不能同时开启ChannelSplit和NZ2ND/NZ2DN功能。 |
@@ -169,7 +169,7 @@
169| quantPre | 输入 | QuantMode_t是一个枚举类型,用于控制量化模式,默认值为QuantMode_t::NoQuant,即不开启量化功能。QuantMode_t取值如下:<br>&nbsp;&nbsp;&bull; NoQuant,不开启量化功能;<br>&nbsp;&nbsp;&bull; F322F16,float cast成half,cast mode为CAST_RINT模式;<br>&nbsp;&nbsp;&bull; F322BF16,float cast成bfloat16_t,cast mode为CAST_RINT模式;<br>&nbsp;&nbsp;&bull; DEQF16,int32_t量化成half,scalar量化;<br>&nbsp;&nbsp;&bull; VDEQF16,int32_t量化成half,tensor量化;<br>&nbsp;&nbsp;&bull; QF322B8_PRE,float量化成uint8_t/int8_t,scalar量化;<br>&nbsp;&nbsp;&bull; VQF322B8_PRE,float量化成uint8_t/int8_t,tensor量化;<br>&nbsp;&nbsp;&bull; REQ8,int32_t量化成uint8_t/int8_t,scalar量化;<br>&nbsp;&nbsp;&bull; VREQ8,int32_t量化成uint8_t/int8_t,tensor量化。 |169| quantPre | 输入 | QuantMode_t是一个枚举类型,用于控制量化模式,默认值为QuantMode_t::NoQuant,即不开启量化功能。QuantMode_t取值如下:<br>&nbsp;&nbsp;&bull; NoQuant,不开启量化功能;<br>&nbsp;&nbsp;&bull; F322F16,float cast成half,cast mode为CAST_RINT模式;<br>&nbsp;&nbsp;&bull; F322BF16,float cast成bfloat16_t,cast mode为CAST_RINT模式;<br>&nbsp;&nbsp;&bull; DEQF16,int32_t量化成half,scalar量化;<br>&nbsp;&nbsp;&bull; VDEQF16,int32_t量化成half,tensor量化;<br>&nbsp;&nbsp;&bull; QF322B8_PRE,float量化成uint8_t/int8_t,scalar量化;<br>&nbsp;&nbsp;&bull; VQF322B8_PRE,float量化成uint8_t/int8_t,tensor量化;<br>&nbsp;&nbsp;&bull; REQ8,int32_t量化成uint8_t/int8_t,scalar量化;<br>&nbsp;&nbsp;&bull; VREQ8,int32_t量化成uint8_t/int8_t,tensor量化。 |
170| deqScalar | 输入 | scalar量化参数,表示单个scale值,quantPre量化模式为scalar量化时需要设置该参数。支持的数据类型为uint64_t。 |170| deqScalar | 输入 | scalar量化参数,表示单个scale值,quantPre量化模式为scalar量化时需要设置该参数。支持的数据类型为uint64_t。 |
171| ndNum | 输入 | 源NZ矩阵的数目,也就是传输ND矩阵的数目,取值范围为ndNum∈[1, 65535]。 |171| ndNum | 输入 | 源NZ矩阵的数目,也就是传输ND矩阵的数目,取值范围为ndNum∈[1, 65535]。 |
172-| srcNdStride | 输入 | 不同NZ矩阵起始地址之间的间隔,取值范围为srcNdStride∈[1, 512],单位为数据块(16 \* C0_Size)。当ndNum配置为1时,srcNdStride配置为0即可,不生效。 |172+| srcNdStride | 输入 | 不同NZ矩阵起始地址之间的间隔。当ndNum大于1时,取值范围为srcNdStride∈[1, 512];当ndNum配置为1时,srcNdStride可配置为0,此时不生效。单位为数据块(16 \* C0_Size)。 |
173| dstNdStride | 输入 | 目的相邻ND矩阵起始地址之间的偏移,取值范围为dstNdStride∈[1, 65535],单位为element。当ndNum配置为1时,dstNdStride配置为0即可,不生效。 |173| dstNdStride | 输入 | 目的相邻ND矩阵起始地址之间的偏移,取值范围为dstNdStride∈[1, 65535],单位为element。当ndNum配置为1时,dstNdStride配置为0即可,不生效。 |
174| reluEn | 输入 | 是否开启ReLU的开关:<br>&nbsp;&nbsp;&bull; false:不开启ReLU功能;<br>&nbsp;&nbsp;&bull; true:开启ReLU功能。 |174| reluEn | 输入 | 是否开启ReLU的开关:<br>&nbsp;&nbsp;&bull; false:不开启ReLU功能;<br>&nbsp;&nbsp;&bull; true:开启ReLU功能。 |
175| unitFlag | 输入 | unitFlag是一种Mmad指令和Fixpipe指令细粒度的并行,开启该功能后,硬件每计算完一个分形,计算结果就会被搬出,该功能不适用于在L0C Buffer累加的场景。取值说明如下:<br>&nbsp;&nbsp;&bull; 0(2'b00):不开启unitFlag;<br>&nbsp;&nbsp;&bull; 2(2'b10):开启unitFlag,硬件执行完指令之后,不会设置寄存器;<br>&nbsp;&nbsp;&bull; 3(2'b11):开启unitFlag,硬件执行完指令之后,会将unitFlag关闭。 |175| unitFlag | 输入 | unitFlag是一种Mmad指令和Fixpipe指令细粒度的并行,开启该功能后,硬件每计算完一个分形,计算结果就会被搬出,该功能不适用于在L0C Buffer累加的场景。取值说明如下:<br>&nbsp;&nbsp;&bull; 0(2'b00):不开启unitFlag;<br>&nbsp;&nbsp;&bull; 2(2'b10):开启unitFlag,硬件执行完指令之后,不会设置寄存器;<br>&nbsp;&nbsp;&bull; 3(2'b11):开启unitFlag,硬件执行完指令之后,会将unitFlag关闭。 |
@@ -249,7 +249,7 @@
249- 目标数据不能有重叠。如果对目的地址有重叠写入,硬件不会报告任何警告和错误,也不保证重叠数据的写入顺序。249- 目标数据不能有重叠。如果对目的地址有重叠写入,硬件不会报告任何警告和错误,也不保证重叠数据的写入顺序。
250- unitFlag特性开启需要配合Mmad同时开启。250- unitFlag特性开启需要配合Mmad同时开启。
251<!-- npu="950" id28 -->251<!-- npu="950" id28 -->
252-- 当启用NZ2DN且srcNzC0Stride不等于1时,不能同时开启unitflag。252+- 当启用NZ2DN且srcNzC0Stride不等于1时,不能同时开启unitFlag。
253<!-- end id28 -->253<!-- end id28 -->
254<!-- npu="A3,910b" id27 -->254<!-- npu="A3,910b" id27 -->
255- 针对如下产品型号,特殊值/边界值约束说明如下:255- 针对如下产品型号,特殊值/边界值约束说明如下:
@@ -98,7 +98,7 @@ DataCopy矩阵搬出接口支持多种随路能力的组合,需要设置不同
98| dstStride | 目的NZ矩阵中相邻Z排布的起始地址偏移,取值不为0, 单位为datablock(32字节)。 |98| dstStride | 目的NZ矩阵中相邻Z排布的起始地址偏移,取值不为0, 单位为datablock(32字节)。 |
99| srcStride | 源NZ矩阵中相邻Z排布的起始地址偏移,取值范围为srcStride∈[0, 65535],单位为C0_Size(16*sizeof(T)),T为src的数据类型,其值应填成mSize对16向上取整。 |99| srcStride | 源NZ矩阵中相邻Z排布的起始地址偏移,取值范围为srcStride∈[0, 65535],单位为C0_Size(16*sizeof(T)),T为src的数据类型,其值应填成mSize对16向上取整。 |
100| unitFlag | unitFlag是一种Mmad指令和Fixpipe指令细粒度的并行,开启该功能后,硬件每计算完一个分形,计算结果就会被搬出。取值说明如下:<br>&nbsp;&nbsp;&bull; 0(2'b00):不开启unitFlag。<br>&nbsp;&nbsp;&bull; 2(2'b10):开启unitFlag,硬件执行完指令之后,不复位单元标记位。<br>&nbsp;&nbsp;&bull; 3(2'b11):开启unitFlag,硬件执行完指令之后,复位单元标记位。<br>开启该功能时,须将Mmad指令和Fixpipe指令的unitFlag值设置为2或3。<br>参数设置方案和特性细节可参考:Mmad计算中关键特性说明的[UnitFlag](../Mmad计算/关键特性说明/UnitFlag.md)章节。 |100| unitFlag | unitFlag是一种Mmad指令和Fixpipe指令细粒度的并行,开启该功能后,硬件每计算完一个分形,计算结果就会被搬出。取值说明如下:<br>&nbsp;&nbsp;&bull; 0(2'b00):不开启unitFlag。<br>&nbsp;&nbsp;&bull; 2(2'b10):开启unitFlag,硬件执行完指令之后,不复位单元标记位。<br>&nbsp;&nbsp;&bull; 3(2'b11):开启unitFlag,硬件执行完指令之后,复位单元标记位。<br>开启该功能时,须将Mmad指令和Fixpipe指令的unitFlag值设置为2或3。<br>参数设置方案和特性细节可参考:Mmad计算中关键特性说明的[UnitFlag](../Mmad计算/关键特性说明/UnitFlag.md)章节。 |
101-| clipReluPre | <!-- npu="950,A3,910b" id13 -->该参数仅在Atlas 200I/500 A2 推理产品支持。<br><!-- end id13 --><!-- npu="310b" id14 -->用于配置是否开启ClipReLU操作,参数类型为uint8_t,取值如下:0,不开启ClipReLU;1,开启ClipReLU,此时需要调用[SetFixPipeClipRelu](./寄存器配置说明/SetFixPipeClipRelu.md)来设置clipReLU的最大值。<br>&nbsp;&nbsp;&bull;该操作在随路量化后进行,quantPre配置后才能使用,当前支持的量化模式有F322F16/DEQF16/VDEQF16/QF322B8_PRE/VQF322B8_PRE/REQ8/VREQ8。<br><!-- end id14 --> |101+| clipReluPre | <!-- npu="950,A3,910b" id13 -->该参数仅在Atlas 200I/500 A2 推理产品支持。<br><!-- end id13 --><!-- npu="310b" id14 -->用于配置是否开启ClipReLU操作,参数类型为uint8_t,取值如下:0,不开启ClipReLU;1,开启ClipReLU,此时需要调用[SetFixPipeClipRelu](./寄存器配置说明/SetFixPipeClipRelu.md)来设置ClipReLU的最大值。<br>&nbsp;&nbsp;&bull;该操作在随路量化后进行,quantPre配置后才能使用,当前支持的量化模式有F322F16/DEQF16/VDEQF16/QF322B8_PRE/VQF322B8_PRE/REQ8/VREQ8。<br><!-- end id14 --> |
102| eltWiseOp | <!-- npu="950,A3,910b" id15 -->该参数仅在Atlas 200I/500 A2 推理产品支持。<br><!-- end id15 --><!-- npu="310b" id16 -->用于配置是否开启Elementwise操作及操作模式。Elementwise操作是指进行随路量化后,可以逐个元素加/减一个LocalTensor,大小为mSize * nSize,具体LocalTensor地址相关参数需要调用[SetFixPipeAddr](./寄存器配置说明/SetFixPipeAddr.md)来设置。<br>eltWiseOp参数类型为uint8_t,取值如下:<br>&nbsp;&nbsp;&bull; 0:不开启Elementwise;<br>&nbsp;&nbsp;&bull; 1:Elementwise Addition;<br>&nbsp;&nbsp;&bull; 2:Elementwise Subtraction。<br><!-- end id16 --> |102| eltWiseOp | <!-- npu="950,A3,910b" id15 -->该参数仅在Atlas 200I/500 A2 推理产品支持。<br><!-- end id15 --><!-- npu="310b" id16 -->用于配置是否开启Elementwise操作及操作模式。Elementwise操作是指进行随路量化后,可以逐个元素加/减一个LocalTensor,大小为mSize * nSize,具体LocalTensor地址相关参数需要调用[SetFixPipeAddr](./寄存器配置说明/SetFixPipeAddr.md)来设置。<br>eltWiseOp参数类型为uint8_t,取值如下:<br>&nbsp;&nbsp;&bull; 0:不开启Elementwise;<br>&nbsp;&nbsp;&bull; 1:Elementwise Addition;<br>&nbsp;&nbsp;&bull; 2:Elementwise Subtraction。<br><!-- end id16 --> |
103| quantPre | 用于控制量化模式,QuantMode_t类型,具体定义如下:<br>&nbsp;&nbsp;&bull; half/bfloat16_t输出,此参数需配置为QuantMode_t::F322F16/QuantMode_t::F322BF16。<br>&nbsp;&nbsp;&bull;配置为scalar量化时,需要调用[SetFixpipePreQuantFlag](./寄存器配置说明/SetFixpipePreQuantFlag.md)接口来设置scalar量化参数。<br>&nbsp;&nbsp;&bull;配置为tensor量化时,需要调用[SetFixPipeConfig](./寄存器配置说明/SetFixPipeConfig.md)来设置tensor量化参数,其中tensor量化参数需要通过DataCopy从L1 Buffer搬运至Fixpipe Buffer。<br>注:此参数需要用户手动配置,不会自动推导配置对应量化模式。此通路不支持NoQuant模式。<br><pre>enum QuantMode_t<br>{<br> NoQuant, // 不开启量化功能,此通路不支持<br> F322F16, // Float32_2_Float16:float cast成half,cast mode为CAST_RINT模式<br> F322BF16, // Float32_2_BFloat16:float cast成bfloat16_t,cast mode为CAST_RINT模式<br> DEQF16, // DeQuant_Float16:int32_t量化成half,scalar量化<br> VDEQF16, // Vector_DeQuant_Float16:int32_t量化成half,tensor量化<br> QF322B8_PRE, // Quant_Float32_2_B8:float量化成int8_t/uint8_t,scalar量化<br> VQF322B8_PRE, // Vector_Quant_Float32_2_B8:float量化成int8_t/uint8_t,tensor量化<br> REQ8, // ReQuant_int8:int32_t量化成int8_t/uint8_t,scalar量化<br> VREQ8, // Vector_ReQuant_int8:int32_t量化成int8_t/uint8_t,tensor量化<br>};</pre> |103| quantPre | 用于控制量化模式,QuantMode_t类型,具体定义如下:<br>&nbsp;&nbsp;&bull; half/bfloat16_t输出,此参数需配置为QuantMode_t::F322F16/QuantMode_t::F322BF16。<br>&nbsp;&nbsp;&bull;配置为scalar量化时,需要调用[SetFixpipePreQuantFlag](./寄存器配置说明/SetFixpipePreQuantFlag.md)接口来设置scalar量化参数。<br>&nbsp;&nbsp;&bull;配置为tensor量化时,需要调用[SetFixPipeConfig](./寄存器配置说明/SetFixPipeConfig.md)来设置tensor量化参数,其中tensor量化参数需要通过DataCopy从L1 Buffer搬运至Fixpipe Buffer。<br>注:此参数需要用户手动配置,不会自动推导配置对应量化模式。此通路不支持NoQuant模式。<br><pre>enum QuantMode_t<br>{<br> NoQuant, // 不开启量化功能,此通路不支持<br> F322F16, // Float32_2_Float16:float cast成half,cast mode为CAST_RINT模式<br> F322BF16, // Float32_2_BFloat16:float cast成bfloat16_t,cast mode为CAST_RINT模式<br> DEQF16, // DeQuant_Float16:int32_t量化成half,scalar量化<br> VDEQF16, // Vector_DeQuant_Float16:int32_t量化成half,tensor量化<br> QF322B8_PRE, // Quant_Float32_2_B8:float量化成int8_t/uint8_t,scalar量化<br> VQF322B8_PRE, // Vector_Quant_Float32_2_B8:float量化成int8_t/uint8_t,tensor量化<br> REQ8, // ReQuant_int8:int32_t量化成int8_t/uint8_t,scalar量化<br> VREQ8, // Vector_ReQuant_int8:int32_t量化成int8_t/uint8_t,tensor量化<br>};</pre> |
104| reluPre | 用于配置ReLU操作的模式,类型为uint8_t,取值如下:<br>&nbsp;&nbsp;&bull; 0:不开启ReLU<br>&nbsp;&nbsp;&bull; 1:Normal ReLU |104| reluPre | 用于配置ReLU操作的模式,类型为uint8_t,取值如下:<br>&nbsp;&nbsp;&bull; 0:不开启ReLU<br>&nbsp;&nbsp;&bull; 1:Normal ReLU |
@@ -120,7 +120,7 @@
120| deqScalar | 可选输入 | scalar量化参数,表示单个scale值,quantPre量化模式为[随路量化](./关键特性说明/随路量化.md)时需要设置该参数。支持的数据类型为`uint64_t`。 |120| deqScalar | 可选输入 | scalar量化参数,表示单个scale值,quantPre量化模式为[随路量化](./关键特性说明/随路量化.md)时需要设置该参数。支持的数据类型为`uint64_t`。 |
121| [reluEn](./关键特性说明/随路ReLU.md) | 可选输入 | 是否开启NormReLU的开关:<br>&nbsp;&nbsp;&bull; `false`:不开启NormReLU功能, 默认为`false`;<br>&nbsp;&nbsp;&bull; `true`:开启NormReLU功能。 |121| [reluEn](./关键特性说明/随路ReLU.md) | 可选输入 | 是否开启NormReLU的开关:<br>&nbsp;&nbsp;&bull; `false`:不开启NormReLU功能, 默认为`false`;<br>&nbsp;&nbsp;&bull; `true`:开启NormReLU功能。 |
122| unitFlag | 可选输入 | unitFlag是一种Mmad指令和Fixpipe指令细粒度的并行,开启该功能后,硬件每计算完一个分形,计算结果就会被搬出。取值说明如下:<br>&nbsp;&nbsp;&bull; 0(2'b00):不开启unitFlag;<br>&nbsp;&nbsp;&bull; 2(2'b10):开启unitFlag,硬件执行完指令之后,不复位单元标记位;<br>&nbsp;&nbsp;&bull; 3(2'b11):开启unitFlag,硬件执行完指令之后,复位单元标记位。<br>开启该功能时,须将Mmad指令和Fixpipe指令的unitFlag值设置为2或3。<br>参数设置方案和特性细节可参考:Mmad计算中关键特性说明的[UnitFlag](../Mmad计算/关键特性说明/UnitFlag.md)章节。 |122| unitFlag | 可选输入 | unitFlag是一种Mmad指令和Fixpipe指令细粒度的并行,开启该功能后,硬件每计算完一个分形,计算结果就会被搬出。取值说明如下:<br>&nbsp;&nbsp;&bull; 0(2'b00):不开启unitFlag;<br>&nbsp;&nbsp;&bull; 2(2'b10):开启unitFlag,硬件执行完指令之后,不复位单元标记位;<br>&nbsp;&nbsp;&bull; 3(2'b11):开启unitFlag,硬件执行完指令之后,复位单元标记位。<br>开启该功能时,须将Mmad指令和Fixpipe指令的unitFlag值设置为2或3。<br>参数设置方案和特性细节可参考:Mmad计算中关键特性说明的[UnitFlag](../Mmad计算/关键特性说明/UnitFlag.md)章节。 |
123-| params | 可选输入 | 用于选择和配置不同的随路格式转换(NZ2ZN/NZ2ND/NZ2DN),该参数为TransformParams类型的结构体。TransformParams结构体是一个基于模板参数的类型选择器,用于在编译时根据定义FixpipeParamsArch3510搬运参数时使用的模板参数,自动选择对应的参数类型。<br><pre>template \<CO2Layout format\><br>struct TransformParams {};<br>template \<\><br>struct TransformParams\<CO2Layout::NZ\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = uint8_t;<br>};<br>template \<\><br>struct TransformParams\<CO2Layout::ROW_MAJOR\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = Nz2NdParams;<br>};<br>template \<\><br>struct TransformParams\<CO2Layout::COLUMN_MAJOR\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = Nz2DnParams;<br>};</pre><br>CO2Layout布局类型为ROW_MAJOR时, 该指令被定义为从L0C Buffer到目标位置的数据移动,并附带NZ2ND转换,结构体参数如下:<br><pre>struct Nz2NdParams {<br> uint16_t ndNum = 1;<br> uint16_t srcNdStride = 0;<br> uint32_t dstNdStride = 0; <br>};</pre>&nbsp;&nbsp;&bull; ndNum:源NZ矩阵的数目,也就是传输ND矩阵的数目,取值范围为ndNum∈[0, 65535]。**注:ndNum=0表示不执行搬运,该接口将被视为NOP(空操作)。**<br>&nbsp;&nbsp;&bull; srcNdStride:不同NZ矩阵起始地址之间的间隔,取值范围为srcNdStride∈[0, 65535],单位为C0_SIZE。当ndNum配置为1时,srcNdStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; dstNdStride:目的相邻ND矩阵起始地址之间的偏移,取值范围为dstNdStride∈[1, 2^32 -1],单位为element。当ndNum配置为1时,dstNdStride配置为0即可,不生效。<br><br>CO2Layout布局类型为COLUMN_MAJOR时, 该指令被定义为从L0C Buffer到目标位置的数据移动,并附带NZ2DN转换,结构体参数如下:<br><pre>struct Nz2DnParams {<br> uint16_t dnNum = 1;<br> uint16_t srcNzMatrixStride = 0;<br> uint32_t dstDnMatrixStride = 0;<br> uint16_t srcNzC0Stride = 0; <br>};</pre>&nbsp;&nbsp;&bull; dnNum:传输DN矩阵的数目,取值范围为dnNum∈[0, 65535]。**注:dnNum=0表示不执行搬运,该接口将被视为NOP(空操作)。**<br>&nbsp;&nbsp;&bull; srcNzMatrixStride:不同源NZ矩阵的偏移(头与头),取值范围srcNzMatrixStride∈[0, 65535],单位C0_SIZE。当dnNum配置为1时,srcNzMatrixStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; dstDnMatrixStride:目的相邻ND矩阵起始地址之间的偏移,取值范围dstDnMatrixStride∈[0, 2^32 -1],单位element。当dnNum配置为1时,dstDnMatrixStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; srcNzC0Stride:源矩阵NZ分形中相邻行的地址偏移(头与头),取值范围srcNzC0Stride∈[0, 65535],单位C0_SIZE。当启用NZ2DN时,srcNzC0Stride不能为0。<br><br>CO2Layout布局类型为NZ时,为普通搬运DMA模式,表示从L0C Buffer到目标位置的正常数据移动。 |123+| params | 可选输入 | 用于选择和配置不同的随路格式转换(NZ2NZ/NZ2ND/NZ2DN),该参数为TransformParams类型的结构体。TransformParams结构体是一个基于模板参数的类型选择器,用于在编译时根据定义FixpipeParamsArch3510搬运参数时使用的模板参数,自动选择对应的参数类型。<br><pre>template \<CO2Layout format\><br>struct TransformParams {};<br>template \<\><br>struct TransformParams\<CO2Layout::NZ\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = uint8_t;<br>};<br>template \<\><br>struct TransformParams\<CO2Layout::ROW_MAJOR\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = Nz2NdParams;<br>};<br>template \<\><br>struct TransformParams\<CO2Layout::COLUMN_MAJOR\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = Nz2DnParams;<br>};</pre><br>CO2Layout布局类型为ROW_MAJOR时, 该指令被定义为从L0C Buffer到目标位置的数据移动,并附带NZ2ND转换,结构体参数如下:<br><pre>struct Nz2NdParams {<br> uint16_t ndNum = 1;<br> uint16_t srcNdStride = 0;<br> uint32_t dstNdStride = 0; <br>};</pre>&nbsp;&nbsp;&bull; ndNum:源NZ矩阵的数目,也就是传输ND矩阵的数目,取值范围为ndNum∈[0, 65535]。**注:ndNum=0表示不执行搬运,该接口将被视为NOP(空操作)。**<br>&nbsp;&nbsp;&bull; srcNdStride:不同NZ矩阵起始地址之间的间隔,取值范围为srcNdStride∈[0, 65535],单位为C0_SIZE。当ndNum配置为1时,srcNdStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; dstNdStride:目的相邻ND矩阵起始地址之间的偏移,取值范围为dstNdStride∈[1, 2^32 -1],单位为element。当ndNum配置为1时,dstNdStride配置为0即可,不生效。<br><br>CO2Layout布局类型为COLUMN_MAJOR时, 该指令被定义为从L0C Buffer到目标位置的数据移动,并附带NZ2DN转换,结构体参数如下:<br><pre>struct Nz2DnParams {<br> uint16_t dnNum = 1;<br> uint16_t srcNzMatrixStride = 0;<br> uint32_t dstDnMatrixStride = 0;<br> uint16_t srcNzC0Stride = 0; <br>};</pre>&nbsp;&nbsp;&bull; dnNum:传输DN矩阵的数目,取值范围为dnNum∈[0, 65535]。**注:dnNum=0表示不执行搬运,该接口将被视为NOP(空操作)。**<br>&nbsp;&nbsp;&bull; srcNzMatrixStride:不同源NZ矩阵的偏移(头与头),取值范围srcNzMatrixStride∈[0, 65535],单位C0_SIZE。当dnNum配置为1时,srcNzMatrixStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; dstDnMatrixStride:目的相邻ND矩阵起始地址之间的偏移,取值范围dstDnMatrixStride∈[0, 2^32 -1],单位element。当dnNum配置为1时,dstDnMatrixStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; srcNzC0Stride:源矩阵NZ分形中相邻行的地址偏移(头与头),取值范围srcNzC0Stride∈[0, 65535],单位C0_SIZE。当启用NZ2DN时,srcNzC0Stride不能为0。<br><br>CO2Layout布局类型为NZ时,为普通搬运DMA模式,表示从L0C Buffer到目标位置的正常数据移动。 |
124| dualDstCtrl | 可选输入 | 此参数仅在L0C Buffer到Unified Buffer通路下有效。 |124| dualDstCtrl | 可选输入 | 此参数仅在L0C Buffer到Unified Buffer通路下有效。 |
125| subBlockId | 可选输入 | 此参数仅在L0C Buffer到Unified Buffer通路下有效。 |125| subBlockId | 可选输入 | 此参数仅在L0C Buffer到Unified Buffer通路下有效。 |
126| [isChannelSplit](./关键特性说明/F32-Channel-Split.md) | 可选输入 | 此参数仅在L0C Buffer到Global Memory通路下有效。 |126| [isChannelSplit](./关键特性说明/F32-Channel-Split.md) | 可选输入 | 此参数仅在L0C Buffer到Global Memory通路下有效。 |
@@ -206,7 +206,7 @@
206- 目标数据不能有重叠。如果对目的地址有重叠写入,硬件不会报告任何警告和错误,也不保证重叠数据的写入顺序。206- 目标数据不能有重叠。如果对目的地址有重叠写入,硬件不会报告任何警告和错误,也不保证重叠数据的写入顺序。
207- unitFlag特性开启需要配合Mmad同时开启。207- unitFlag特性开启需要配合Mmad同时开启。
208<!-- npu="950" id27 -->208<!-- npu="950" id27 -->
209-- 当启用NZ2DN且srcNzC0Stride不等于1时,不能同时开启unitflag。209+- 当启用NZ2DN且srcNzC0Stride不等于1时,不能同时开启unitFlag。
210<!-- end id27 -->210<!-- end id27 -->
211<!-- npu="A3,910b" id28 -->211<!-- npu="A3,910b" id28 -->
212- 针对如下产品型号,特殊值/边界值约束说明如下:212- 针对如下产品型号,特殊值/边界值约束说明如下:
@@ -95,7 +95,7 @@ L0C Buffer到UB数据搬运提供矩阵搬出的组合接口Fixpipe,接口内
95| 参数名 | 描述 |95| 参数名 | 描述 |
96| ---------- | ---------- |96| ---------- | ---------- |
97| T/U | 目的操作数/源操作数的数据类型。支持的数据类型请参考[数据类型](#zh-cn_topic_0000002549846732_section4219135304818)。 |97| T/U | 目的操作数/源操作数的数据类型。支持的数据类型请参考[数据类型](#zh-cn_topic_0000002549846732_section4219135304818)。 |
98-| config | Fixpipe相关配置参数,类型为FixpipeConfig,需要显示构造`isToUB = true`的配置,表示目的物理地址为UB,构造示例如下:<br>开启NZ2ND,输出数据格式为ND格式:<pre>constexpr AscendC::FixpipeConfig CFG_ROW_MAJOR_UB = {AscendC::CO2Layout::ROW_MAJOR, true};</pre>NZ2NZ,输出数据格式为NZ格式:<pre>constexpr AscendC::FixpipeConfig CFG_NZ_UB = {AscendC::CO2Layout::NZ, true};</pre>开启NZ2DN,输出数据格式为DN格式:<pre>constexpr AscendC::FixpipeConfig CFG_COLUMN_MAJOR_UB = {AscendC::CO2Layout::COLUMN_MAJOR, true};</pre>FixpipeConfig结构体定义如下:<br><pre>struct FixpipeConfig {<br> CO2Layout format;<br> bool isToUB; // 用于用户指定目的地址的位置是否是UB <br>};<br>enum class CO2Layout : uint8_t {<br> NZ = 0, // 输出数据格式仍为NZ格式。<br> ROW_MAJOR, // 开启NZ2ND,输出数据格式为ND格式。<br><!-- npu="950" id15 --> COLUMN_MAJOR, // 仅Ascend 950PR/Ascend 950DT支持,开启NZ2DN,输出数据格式为DN格式。<br><!-- end id15 -->};<br>constexpr FixpipeConfig CFG_NZ = {CO2Layout::NZ};<br>constexpr FixpipeConfig CFG_ROW_MAJOR = {CO2Layout::ROW_MAJOR};<!-- npu="950" id16 --><br>constexpr FixpipeConfig CFG_COLUMN_MAJOR = {CO2Layout::COLUMN_MAJOR}; // 仅Ascend 950PR/Ascend 950DT支持<!-- end id16 --></pre> |98+| config | Fixpipe相关配置参数,类型为FixpipeConfig,需要显式构造`isToUB = true`的配置,表示目的物理地址为UB,构造示例如下:<br>开启NZ2ND,输出数据格式为ND格式:<pre>constexpr AscendC::FixpipeConfig CFG_ROW_MAJOR_UB = {AscendC::CO2Layout::ROW_MAJOR, true};</pre>NZ2NZ,输出数据格式为NZ格式:<pre>constexpr AscendC::FixpipeConfig CFG_NZ_UB = {AscendC::CO2Layout::NZ, true};</pre>开启NZ2DN,输出数据格式为DN格式:<pre>constexpr AscendC::FixpipeConfig CFG_COLUMN_MAJOR_UB = {AscendC::CO2Layout::COLUMN_MAJOR, true};</pre>FixpipeConfig结构体定义如下:<br><pre>struct FixpipeConfig {<br> CO2Layout format;<br> bool isToUB; // 用于用户指定目的地址的位置是否是UB <br>};<br>enum class CO2Layout : uint8_t {<br> NZ = 0, // 输出数据格式仍为NZ格式。<br> ROW_MAJOR, // 开启NZ2ND,输出数据格式为ND格式。<br><!-- npu="950" id15 --> COLUMN_MAJOR, // 仅Ascend 950PR/Ascend 950DT支持,开启NZ2DN,输出数据格式为DN格式。<br><!-- end id15 -->};<br>constexpr FixpipeConfig CFG_NZ = {CO2Layout::NZ};<br>constexpr FixpipeConfig CFG_ROW_MAJOR = {CO2Layout::ROW_MAJOR};<!-- npu="950" id16 --><br>constexpr FixpipeConfig CFG_COLUMN_MAJOR = {CO2Layout::COLUMN_MAJOR}; // 仅Ascend 950PR/Ascend 950DT支持<!-- end id16 --></pre> |
99| S | 参数cbufWorkspace的数据类型,即随路量化参数的数据类型。<br>&nbsp;&nbsp;&bull;当目的操作数、源操作数、cbufWorkspace使用基础数据类型时,模板参数S必须为uint64_t类型,否则编译失败。<br>&nbsp;&nbsp;&bull;当目的操作数、源操作数、cbufWorkspace使用TensorTrait类型时,模板参数S的LiteType必须为uint64_t类型,否则编译失败。<br>模板参数S后一个模板参数仅用于上述数据类型检查,用户无需关注。 |99| S | 参数cbufWorkspace的数据类型,即随路量化参数的数据类型。<br>&nbsp;&nbsp;&bull;当目的操作数、源操作数、cbufWorkspace使用基础数据类型时,模板参数S必须为uint64_t类型,否则编译失败。<br>&nbsp;&nbsp;&bull;当目的操作数、源操作数、cbufWorkspace使用TensorTrait类型时,模板参数S的LiteType必须为uint64_t类型,否则编译失败。<br>模板参数S后一个模板参数仅用于上述数据类型检查,用户无需关注。 |
100 100 
101**表2** Fixpipe参数说明101**表2** Fixpipe参数说明
@@ -119,7 +119,7 @@ L0C Buffer到UB数据搬运提供矩阵搬出的组合接口Fixpipe,接口内
119| deqScalar | 可选输入 | scalar量化参数,表示单个scale值,quantPre量化模式为[随路量化](./关键特性说明/随路量化.md)时需要设置该参数。支持的数据类型为`uint64_t`。 |119| deqScalar | 可选输入 | scalar量化参数,表示单个scale值,quantPre量化模式为[随路量化](./关键特性说明/随路量化.md)时需要设置该参数。支持的数据类型为`uint64_t`。 |
120| [reluEn](./关键特性说明/随路ReLU.md) | 可选输入 | 是否开启NormReLU的开关:<br>&nbsp;&nbsp;&bull; `false`:不开启NormReLU功能, 默认为`false`;<br>&nbsp;&nbsp;&bull; `true`:开启NormReLU功能。 |120| [reluEn](./关键特性说明/随路ReLU.md) | 可选输入 | 是否开启NormReLU的开关:<br>&nbsp;&nbsp;&bull; `false`:不开启NormReLU功能, 默认为`false`;<br>&nbsp;&nbsp;&bull; `true`:开启NormReLU功能。 |
121| unitFlag | 可选输入 | unitFlag是一种Mmad指令和Fixpipe指令细粒度的并行,开启该功能后,硬件每计算完一个分形,计算结果就会被搬出。取值说明如下:<br>&nbsp;&nbsp;&bull; 0(2'b00):不开启unitFlag;<br>&nbsp;&nbsp;&bull; 2(2'b10):开启unitFlag,硬件执行完指令之后,不复位单元标记位;<br>&nbsp;&nbsp;&bull; 3(2'b11):开启unitFlag,硬件执行完指令之后,复位单元标记位。<br>开启该功能时,须将Mmad指令和Fixpipe指令的unitFlag值设置为2或3。<br>参数设置方案和特性细节可参考:Mmad计算中关键特性说明的[UnitFlag](../Mmad计算/关键特性说明/UnitFlag.md)章节。 |121| unitFlag | 可选输入 | unitFlag是一种Mmad指令和Fixpipe指令细粒度的并行,开启该功能后,硬件每计算完一个分形,计算结果就会被搬出。取值说明如下:<br>&nbsp;&nbsp;&bull; 0(2'b00):不开启unitFlag;<br>&nbsp;&nbsp;&bull; 2(2'b10):开启unitFlag,硬件执行完指令之后,不复位单元标记位;<br>&nbsp;&nbsp;&bull; 3(2'b11):开启unitFlag,硬件执行完指令之后,复位单元标记位。<br>开启该功能时,须将Mmad指令和Fixpipe指令的unitFlag值设置为2或3。<br>参数设置方案和特性细节可参考:Mmad计算中关键特性说明的[UnitFlag](../Mmad计算/关键特性说明/UnitFlag.md)章节。 |
122-| params | 可选输入 | 用于选择和配置不同的随路格式转换(NZ2ZN/NZ2ND/NZ2DN),该参数为TransformParams类型的结构体。TransformParams结构体是一个基于模板参数的类型选择器,用于在编译时根据定义FixpipeParamsArch3510搬运参数时使用的模板参数,自动选择对应的参数类型。<br><pre>template \<CO2Layout format\><br>struct TransformParams {};<br>template \<\><br>struct TransformParams\<CO2Layout::NZ\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = uint8_t;<br>};<br>template \<\><br>struct TransformParams\<CO2Layout::ROW_MAJOR\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = Nz2NdParams;<br>};<br>template \<\><br>struct TransformParams\<CO2Layout::COLUMN_MAJOR\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = Nz2DnParams;<br>};</pre><br>CO2Layout布局类型为ROW_MAJOR时, 该指令被定义为从L0C Buffer到目标位置的数据移动,并附带NZ2ND转换,结构体参数如下:<br><pre>struct Nz2NdParams {<br> uint16_t ndNum = 1;<br> uint16_t srcNdStride = 0;<br> uint32_t dstNdStride = 0; <br>};</pre>&nbsp;&nbsp;&bull; ndNum:源NZ矩阵的数目,也就是传输ND矩阵的数目,取值范围为ndNum∈[0, 65535]。**注:ndNum=0表示不执行搬运,该接口将被视为NOP(空操作)。**<br>&nbsp;&nbsp;&bull; srcNdStride:不同NZ矩阵起始地址之间的间隔,取值范围为srcNdStride∈[0, 65535],单位为C0_SIZE。当ndNum配置为1时,srcNdStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; dstNdStride:目的相邻ND矩阵起始地址之间的偏移,取值范围为dstNdStride∈[1, 2^32 -1],单位为element。当ndNum配置为1时,dstNdStride配置为0即可,不生效。<br><br>CO2Layout布局类型为COLUMN_MAJOR时, 该指令被定义为从L0C Buffer到目标位置的数据移动,并附带NZ2DN转换,结构体参数如下:<br><pre>struct Nz2DnParams {<br> uint16_t dnNum = 1;<br> uint16_t srcNzMatrixStride = 0;<br> uint32_t dstDnMatrixStride = 0;<br> uint16_t srcNzC0Stride = 0; <br>};</pre>&nbsp;&nbsp;&bull; dnNum:传输DN矩阵的数目,取值范围为dnNum∈[0, 65535]。**注:dnNum=0表示不执行搬运,该接口将被视为NOP(空操作)。**<br>&nbsp;&nbsp;&bull; srcNzMatrixStride:不同源NZ矩阵的偏移(头与头),取值范围srcNzMatrixStride∈[0, 65535],单位C0_SIZE。当dnNum配置为1时,srcNzMatrixStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; dstDnMatrixStride:目的相邻ND矩阵起始地址之间的偏移,取值范围dstDnMatrixStride∈[0, 2^32 -1],单位element。当dnNum配置为1时,dstDnMatrixStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; srcNzC0Stride:源矩阵NZ分形中相邻行的地址偏移(头与头),取值范围srcNzC0Stride∈[0, 65535],单位C0_SIZE。当启用NZ2DN时,srcNzC0Stride不能为0。<br><br>CO2Layout布局类型为NZ时,为普通搬运DMA模式,表示从L0C Buffer到目标位置的正常数据移动。 |122+| params | 可选输入 | 用于选择和配置不同的随路格式转换(NZ2NZ/NZ2ND/NZ2DN),该参数为TransformParams类型的结构体。TransformParams结构体是一个基于模板参数的类型选择器,用于在编译时根据定义FixpipeParamsArch3510搬运参数时使用的模板参数,自动选择对应的参数类型。<br><pre>template \<CO2Layout format\><br>struct TransformParams {};<br>template \<\><br>struct TransformParams\<CO2Layout::NZ\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = uint8_t;<br>};<br>template \<\><br>struct TransformParams\<CO2Layout::ROW_MAJOR\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = Nz2NdParams;<br>};<br>template \<\><br>struct TransformParams\<CO2Layout::COLUMN_MAJOR\> {<br> \_\_aicore\_\_ inline TransformParams(){};<br> using PARAMS = Nz2DnParams;<br>};</pre><br>CO2Layout布局类型为ROW_MAJOR时, 该指令被定义为从L0C Buffer到目标位置的数据移动,并附带NZ2ND转换,结构体参数如下:<br><pre>struct Nz2NdParams {<br> uint16_t ndNum = 1;<br> uint16_t srcNdStride = 0;<br> uint32_t dstNdStride = 0; <br>};</pre>&nbsp;&nbsp;&bull; ndNum:源NZ矩阵的数目,也就是传输ND矩阵的数目,取值范围为ndNum∈[0, 65535]。**注:ndNum=0表示不执行搬运,该接口将被视为NOP(空操作)。**<br>&nbsp;&nbsp;&bull; srcNdStride:不同NZ矩阵起始地址之间的间隔,取值范围为srcNdStride∈[0, 65535],单位为C0_SIZE。当ndNum配置为1时,srcNdStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; dstNdStride:目的相邻ND矩阵起始地址之间的偏移,取值范围为dstNdStride∈[1, 2^32 -1],单位为element。当ndNum配置为1时,dstNdStride配置为0即可,不生效。<br><br>CO2Layout布局类型为COLUMN_MAJOR时, 该指令被定义为从L0C Buffer到目标位置的数据移动,并附带NZ2DN转换,结构体参数如下:<br><pre>struct Nz2DnParams {<br> uint16_t dnNum = 1;<br> uint16_t srcNzMatrixStride = 0;<br> uint32_t dstDnMatrixStride = 0;<br> uint16_t srcNzC0Stride = 0; <br>};</pre>&nbsp;&nbsp;&bull; dnNum:传输DN矩阵的数目,取值范围为dnNum∈[0, 65535]。**注:dnNum=0表示不执行搬运,该接口将被视为NOP(空操作)。**<br>&nbsp;&nbsp;&bull; srcNzMatrixStride:不同源NZ矩阵的偏移(头与头),取值范围srcNzMatrixStride∈[0, 65535],单位C0_SIZE。当dnNum配置为1时,srcNzMatrixStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; dstDnMatrixStride:目的相邻ND矩阵起始地址之间的偏移,取值范围dstDnMatrixStride∈[0, 2^32 -1],单位element。当dnNum配置为1时,dstDnMatrixStride配置为0即可,不生效。<br>&nbsp;&nbsp;&bull; srcNzC0Stride:源矩阵NZ分形中相邻行的地址偏移(头与头),取值范围srcNzC0Stride∈[0, 65535],单位C0_SIZE。当启用NZ2DN时,srcNzC0Stride不能为0。<br><br>CO2Layout布局类型为NZ时,为普通搬运DMA模式,表示从L0C Buffer到目标位置的正常数据移动。 |
123| dualDstCtrl | 可选输入 | 双目标模式控制参数。对于Ascend 950PR/Ascend 950DT,同一AI Core内有一个Cube Core和两个Vector Core,当启用双目标模式控制时,L0C Buffer中的M×N矩阵将被分成两半,并同时分别写入两个Vector Core各自的UB中,其中前半部分写入SUB BLOCK0,后半部分写入SUB BLOCK1。<br>&nbsp;&nbsp;&bull; 2'b00:单目标模式,将整个矩阵写入通过subBlockId参数配置的目标UB。<br>&nbsp;&nbsp;&bull; 2'b01:双目标模式,按M维度拆分成形状为M / 2 \* N的两个矩阵,分别写入两个UB, M必须为2的倍数。<br>&nbsp;&nbsp;&bull; 2'b10:双目标模式,按N维度拆分成形状为M \* N / 2的两个矩阵,分别写入两个UB, N须为32的倍数。<br>&nbsp;&nbsp;&bull; 2'b11:保留值。<br>dualDstCtrl仅支持在普通搬运模式(NZ2NZ)或NZ2ND搬运场景下使用,不支持随路功能场景。<br>参数设置方案和特性细节可参考:[L0C到UB双目标模式](./关键特性说明/L0C-Buffer到UB双目标模式.md) |123| dualDstCtrl | 可选输入 | 双目标模式控制参数。对于Ascend 950PR/Ascend 950DT,同一AI Core内有一个Cube Core和两个Vector Core,当启用双目标模式控制时,L0C Buffer中的M×N矩阵将被分成两半,并同时分别写入两个Vector Core各自的UB中,其中前半部分写入SUB BLOCK0,后半部分写入SUB BLOCK1。<br>&nbsp;&nbsp;&bull; 2'b00:单目标模式,将整个矩阵写入通过subBlockId参数配置的目标UB。<br>&nbsp;&nbsp;&bull; 2'b01:双目标模式,按M维度拆分成形状为M / 2 \* N的两个矩阵,分别写入两个UB, M必须为2的倍数。<br>&nbsp;&nbsp;&bull; 2'b10:双目标模式,按N维度拆分成形状为M \* N / 2的两个矩阵,分别写入两个UB, N须为32的倍数。<br>&nbsp;&nbsp;&bull; 2'b11:保留值。<br>dualDstCtrl仅支持在普通搬运模式(NZ2NZ)或NZ2ND搬运场景下使用,不支持随路功能场景。<br>参数设置方案和特性细节可参考:[L0C到UB双目标模式](./关键特性说明/L0C-Buffer到UB双目标模式.md) |
124| subBlockId | 可选输入 | 启用单目标模式时用于指示目标UB的SUB BLOCK ID。取值为0或1,取值为0时写入SUB BLOCK0,为1时写入SUB BLOCK1,默认为0。 |124| subBlockId | 可选输入 | 启用单目标模式时用于指示目标UB的SUB BLOCK ID。取值为0或1,取值为0时写入SUB BLOCK0,为1时写入SUB BLOCK1,默认为0。 |
125| [isChannelSplit](./关键特性说明/F32-Channel-Split.md) | 可选输入 | 此参数仅在L0C Buffer到Global Memory通路下有效。 |125| [isChannelSplit](./关键特性说明/F32-Channel-Split.md) | 可选输入 | 此参数仅在L0C Buffer到Global Memory通路下有效。 |
@@ -135,7 +135,7 @@ L0C Buffer到UB数据搬运提供矩阵搬出的组合接口Fixpipe,接口内
135| quantPre | 输入 | QuantMode_t是一个枚举类型,用于控制量化模式,默认值为QuantMode_t::NoQuant,即不开启量化功能。QuantMode_t取值如下:<br>&nbsp;&nbsp;&bull; NoQuant,不开启量化功能。<br>&nbsp;&nbsp;&bull; F322F16,float cast成half,cast mode为CAST_RINT模式。<br>&nbsp;&nbsp;&bull; F322BF16,float cast成bfloat16_t,cast mode为CAST_RINT模式。<br>&nbsp;&nbsp;&bull; DEQF16,int32_t量化成half,scalar量化。<br>&nbsp;&nbsp;&bull; VDEQF16,int32_t量化成half,tensor量化。<br>&nbsp;&nbsp;&bull; QF322B8_PRE,float量化成uint8_t/int8_t,scalar量化。<br>&nbsp;&nbsp;&bull; VQF322B8_PRE,float量化成uint8_t/int8_t,tensor量化。<br>&nbsp;&nbsp;&bull; REQ8,int32_t量化成uint8_t/int8_t,scalar量化。<br>&nbsp;&nbsp;&bull; VREQ8,int32_t量化成uint8_t/int8_t,tensor量化 |135| quantPre | 输入 | QuantMode_t是一个枚举类型,用于控制量化模式,默认值为QuantMode_t::NoQuant,即不开启量化功能。QuantMode_t取值如下:<br>&nbsp;&nbsp;&bull; NoQuant,不开启量化功能。<br>&nbsp;&nbsp;&bull; F322F16,float cast成half,cast mode为CAST_RINT模式。<br>&nbsp;&nbsp;&bull; F322BF16,float cast成bfloat16_t,cast mode为CAST_RINT模式。<br>&nbsp;&nbsp;&bull; DEQF16,int32_t量化成half,scalar量化。<br>&nbsp;&nbsp;&bull; VDEQF16,int32_t量化成half,tensor量化。<br>&nbsp;&nbsp;&bull; QF322B8_PRE,float量化成uint8_t/int8_t,scalar量化。<br>&nbsp;&nbsp;&bull; VQF322B8_PRE,float量化成uint8_t/int8_t,tensor量化。<br>&nbsp;&nbsp;&bull; REQ8,int32_t量化成uint8_t/int8_t,scalar量化。<br>&nbsp;&nbsp;&bull; VREQ8,int32_t量化成uint8_t/int8_t,tensor量化 |
136| deqScalar | 输入 | scalar量化参数,表示单个scale值,quantPre量化模式为scalar量化时需要设置该参数。支持的数据类型为uint64_t。 |136| deqScalar | 输入 | scalar量化参数,表示单个scale值,quantPre量化模式为scalar量化时需要设置该参数。支持的数据类型为uint64_t。 |
137| ndNum | 输入 | 源NZ矩阵的数目,也就是传输ND矩阵的数目,取值范围为ndNum∈[1, 65535]。 |137| ndNum | 输入 | 源NZ矩阵的数目,也就是传输ND矩阵的数目,取值范围为ndNum∈[1, 65535]。 |
138-| srcNdStride | 输入 | 不同NZ矩阵起始地址之间的间隔,取值范围为srcNdStride∈[1, 512],单位为数据块(16 \* C0_SIZE)。当ndNum配置为1时,srcNdStride配置为0即可,不生效。 |138+| srcNdStride | 输入 | 不同NZ矩阵起始地址之间的间隔。当ndNum大于1时,取值范围为srcNdStride∈[1, 512];当ndNum配置为1时,srcNdStride可配置为0,此时不生效。单位为数据块(16 \* C0_SIZE)。 |
139| dstNdStride | 输入 | 目的相邻ND矩阵起始地址之间的偏移,取值范围为dstNdStride∈[1, 65535],单位为element。当ndNum配置为1时,dstNdStride配置为0即可,不生效。 |139| dstNdStride | 输入 | 目的相邻ND矩阵起始地址之间的偏移,取值范围为dstNdStride∈[1, 65535],单位为element。当ndNum配置为1时,dstNdStride配置为0即可,不生效。 |
140| reluEn | 输入 | 是否开启ReLU的开关:<br>&nbsp;&nbsp;&bull; false:不开启ReLU功能;<br>&nbsp;&nbsp;&bull; true:开启ReLU功能。 |140| reluEn | 输入 | 是否开启ReLU的开关:<br>&nbsp;&nbsp;&bull; false:不开启ReLU功能;<br>&nbsp;&nbsp;&bull; true:开启ReLU功能。 |
141| unitFlag | 输入 | unitFlag是一种Mmad指令和Fixpipe指令细粒度的并行,开启该功能后,硬件每计算完一个分形,计算结果就会被搬出,该功能不适用于在L0C Buffer累加的场景。取值说明如下:<br>&nbsp;&nbsp;&bull; 0(2'b00):不开启unitFlag;<br>&nbsp;&nbsp;&bull; 2(2'b10):开启unitFlag,硬件执行完指令之后,不会设置寄存器;<br>&nbsp;&nbsp;&bull; 3(2'b11):开启unitFlag,硬件执行完指令之后,会将unitFlag关闭。 |141| unitFlag | 输入 | unitFlag是一种Mmad指令和Fixpipe指令细粒度的并行,开启该功能后,硬件每计算完一个分形,计算结果就会被搬出,该功能不适用于在L0C Buffer累加的场景。取值说明如下:<br>&nbsp;&nbsp;&bull; 0(2'b00):不开启unitFlag;<br>&nbsp;&nbsp;&bull; 2(2'b10):开启unitFlag,硬件执行完指令之后,不会设置寄存器;<br>&nbsp;&nbsp;&bull; 3(2'b11):开启unitFlag,硬件执行完指令之后,会将unitFlag关闭。 |
@@ -179,7 +179,7 @@ L0C Buffer到UB数据搬运提供矩阵搬出的组合接口Fixpipe,接口内
179- unitFlag特性开启需要配合Mmad同时开启。179- unitFlag特性开启需要配合Mmad同时开启。
180<!-- npu="950" id18 -->180<!-- npu="950" id18 -->
181- dualDstCtrl仅支持在普通搬运模式(NZ2NZ)或NZ2ND搬运场景下使用,不支持随路功能场景。181- dualDstCtrl仅支持在普通搬运模式(NZ2NZ)或NZ2ND搬运场景下使用,不支持随路功能场景。
182-- 当启用NZ2DN且srcNzC0Stride不等于1时,不能同时开启unitflag。182+- 当启用NZ2DN且srcNzC0Stride不等于1时,不能同时开启unitFlag。
183- Ascend 950PR/Ascend 950DT特殊值/边界值约束说明:183- Ascend 950PR/Ascend 950DT特殊值/边界值约束说明:
184 184 
185 对于浮点类型Inf/NaN输入输出,可以通过CTRL寄存器(控制寄存器)的CTRL\[48\]比特位进行设置,控制浮点数量化搬出时的饱和模式;185 对于浮点类型Inf/NaN输入输出,可以通过CTRL寄存器(控制寄存器)的CTRL\[48\]比特位进行设置,控制浮点数量化搬出时的饱和模式;
@@ -25,7 +25,7 @@
25<!-- end id1 -->25<!-- end id1 -->
26 26 
27<!-- npu="950" id4 -->27<!-- npu="950" id4 -->
28-- 针对Ascend 950PR/Ascend 950DT,当Fixpipe指令的输入和输出数据类型都为float,NZ输出到GM,并且不开启NZ2ND、NZ2DN与unitflag时,才能够开启Channel Split功能。当前搬出到L1 Buffer和UB不支持该功能。28+- 针对Ascend 950PR/Ascend 950DT,当Fixpipe指令的输入和输出数据类型都为float,NZ输出到GM,并且不开启NZ2ND、NZ2DN与unitFlag时,才能够开启Channel Split功能。当前搬出到L1 Buffer和UB不支持该功能。
29<!-- end id4 -->29<!-- end id4 -->
30 30 
31## 使用示例31## 使用示例
@@ -61,7 +61,7 @@ LocalTensor支持的数据类型为:half。
61DataCopy随路量化搬运后,可以逐个元素加/减一个大小为mSize \* nSize的LocalTensor,具体LocalTensor地址相关参数需要调用`SetFixPipeAddr`来设置。61DataCopy随路量化搬运后,可以逐个元素加/减一个大小为mSize \* nSize的LocalTensor,具体LocalTensor地址相关参数需要调用`SetFixPipeAddr`来设置。
62 62 
63```cpp63```cpp
64-__aicore__ inline void SetEleSrcPara(const LocalTensor <half>& eleWiseData, uint16_t c0ChStride)64+__aicore__ inline void SetEleSrcPara(const LocalTensor<half>& eleWiseData, uint16_t c0ChStride)
65{65{
66 AscendC::SetFixPipeAddr(eleWiseData, c0ChStride);66 AscendC::SetFixPipeAddr(eleWiseData, c0ChStride);
67}67}
@@ -288,4 +288,4 @@ __aicore__ inline void SetEleSrcPara(const LocalTensor <half>& eleWiseData, uint
288 }288 }
289 KERNEL_CUBE_DATACOPY(half, int8_t, int8_t, int32_t, 128, 1, 1, QuantMode_t::DEQF16);289 KERNEL_CUBE_DATACOPY(half, int8_t, int8_t, int32_t, 128, 1, 1, QuantMode_t::DEQF16);
290 ```290 ```
291- 291+
@@ -66,7 +66,7 @@ __aicore__ inline void SetFixPipeClipRelu(uint64_t config)
66 66 
67```cpp67```cpp
68uint64_t clipReluMaxVal = 0x3c00;68uint64_t clipReluMaxVal = 0x3c00;
69-SetFixPipeClipRelu(clipReluMaxVal); // 开启ReLU的情况下,先进行ReLU操作,再进行clip,clipReluMaxVal为通过该接口设置的最大值69+SetFixPipeClipRelu(clipReluMaxVal); // 开启ReLU的情况下,先进行ReLU操作,再进行ClipReLU,clipReluMaxVal为通过该接口设置的最大值
70```70```
71 71 
72- 针对Atlas 200I/500 A2 推理产品,完整示例如下。随路格式转换数据搬运,通路:L0C Buffer-\>GM。72- 针对Atlas 200I/500 A2 推理产品,完整示例如下。随路格式转换数据搬运,通路:L0C Buffer-\>GM。
@@ -222,7 +222,7 @@ SetFixPipeClipRelu(clipReluMaxVal); // 开启ReLU的情况下,先进行ReLU操
222 // AscendC::PipeBarrier<PIPE_FIX>();222 // AscendC::PipeBarrier<PIPE_FIX>();
223 // // mov l0c to gm,量化操作后开启ClipReLU操作223 // // mov l0c to gm,量化操作后开启ClipReLU操作
224 // intriParams.clipReluPre = 1; 224 // intriParams.clipReluPre = 1;
225- // // 设置clip ReLU的值到寄存器225+ // // 设置ClipReLU的值到寄存器
226 // uint64_t clipReluVal = 0x3c00; // value 1, half226 // uint64_t clipReluVal = 0x3c00; // value 1, half
227 // SetFixPipeClipRelu(clipReluVal);227 // SetFixPipeClipRelu(clipReluVal);
228 // //mov l0c to gm,量化操作后,设置element-wise操作,Add228 // //mov l0c to gm,量化操作后,设置element-wise操作,Add
@@ -290,4 +290,4 @@ SetFixPipeClipRelu(clipReluMaxVal); // 开启ReLU的情况下,先进行ReLU操
290 }290 }
291 KERNEL_CUBE_DATACOPY(half, int8_t, int8_t, int32_t, 128, 1, 1, QuantMode_t::DEQF16);291 KERNEL_CUBE_DATACOPY(half, int8_t, int8_t, int32_t, 128, 1, 1, QuantMode_t::DEQF16);
292 ```292 ```
293- 293+
@@ -60,7 +60,7 @@ __aicore__ inline void SetFixPipeConfig(const LocalTensor<T>& preData, bool isUn
60| reluPre | 输入 | 源操作数,ReLU操作时参与计算的tensor,类型为LocalTensor,支持的物理内存为Fixpipe Buffer(TPosition为C2PIPE2GM),为后续的功能扩展做保留,传入一个空LocalTensor即可。 |60| reluPre | 输入 | 源操作数,ReLU操作时参与计算的tensor,类型为LocalTensor,支持的物理内存为Fixpipe Buffer(TPosition为C2PIPE2GM),为后续的功能扩展做保留,传入一个空LocalTensor即可。 |
61| quantPre | 输入 | 源操作数,quant tensor,量化操作时参与计算的tensor,类型为LocalTensor,支持的物理内存为Fixpipe Buffer(TPosition为C2PIPE2GM)。 |61| quantPre | 输入 | 源操作数,quant tensor,量化操作时参与计算的tensor,类型为LocalTensor,支持的物理内存为Fixpipe Buffer(TPosition为C2PIPE2GM)。 |
62| isUnitFlag | 输入 | unitFlag清空标志位,类型为bool。如果设为true,L0C Buffer中所有内存块的单元标志位都会设为0。旨在消除之前操作中unitFlag产生的多余影响。 |62| isUnitFlag | 输入 | unitFlag清空标志位,类型为bool。如果设为true,L0C Buffer中所有内存块的单元标志位都会设为0。旨在消除之前操作中unitFlag产生的多余影响。 |
63-| preData | 输入 | 支持设置一个Tensor,通过开关控制是ReLU Tensor还是Quant Tensor,支持的物理内存为Fixpipe Buffer(TPosition为C2PIPE2GM)。当前仅支持传入quant Tensor。对于单独设置unitFlag清空标志位isUnitFlag的场景,支持的物理地址为L0C Buffer(TPosition设置为CO1)。 |63+| preData | 输入 | 支持设置一个tensor,通过开关控制是ReLU tensor还是Quant tensor,支持的物理内存为Fixpipe Buffer(TPosition为C2PIPE2GM)。当前仅支持传入quant tensor。对于单独设置unitFlag清空标志位isUnitFlag的场景,支持的物理地址为L0C Buffer(TPosition设置为CO1)。 |
64 64 
65## 数据类型65## 数据类型
66 66 
@@ -72,7 +72,7 @@ __aicore__ inline void SetFixPipeConfig(const LocalTensor<T>& preData, bool isUn
72 72 
73## 约束说明<a name="zh-cn_topic_0000002547729135_section633mcpsimp"></a>73## 约束说明<a name="zh-cn_topic_0000002547729135_section633mcpsimp"></a>
74 74 
75-quantPre和reluPre必须是Fixpipe Buffer上的Tensor。75+quantPre和reluPre必须是Fixpipe Buffer上的tensor。
76 76 
77## 调用示例<a name="section642mcpsimp"></a>77## 调用示例<a name="section642mcpsimp"></a>
78 78 
@@ -65,7 +65,7 @@ Atlas 200I/500 A2 推理产品
65| 参数名称 | 输入/输出 | 含义 |65| 参数名称 | 输入/输出 | 含义 |
66| ---------- | ---------- | ---------- |66| ---------- | ---------- | ---------- |
67| ndNum | 输入 | nd矩阵的数量,取值范围∈[1, 65535]。([具体含义图示参见NZ2ND介绍特性章节](../关键特性说明/NZ2ND.md)) |67| ndNum | 输入 | nd矩阵的数量,取值范围∈[1, 65535]。([具体含义图示参见NZ2ND介绍特性章节](../关键特性说明/NZ2ND.md)) |
68-| srcNdStride | 输入 | 以分形大小为单位的源步长,源相邻nz矩阵的偏移(头与头)。当ndNum配置为1时,srcNdStride配置为0即可,不生效。取值范围∈[1, 512],单位为1024B。 |68+| srcNdStride | 输入 | 以分形大小为单位的源步长,源相邻nz矩阵的偏移(头与头)。当ndNum大于1时,取值范围∈[1, 512];当ndNum配置为1时,srcNdStride可配置为0,此时不生效。单位为1024B。 |
69| dstNdStride | 输入 | 目的相邻nd矩阵的偏移(头与头)。取值范围dstNdStride∈[1, 65535],单位为element元素。 |69| dstNdStride | 输入 | 目的相邻nd矩阵的偏移(头与头)。取值范围dstNdStride∈[1, 65535],单位为element元素。 |
70<!-- end id11 -->70<!-- end id11 -->
71 71 
@@ -37,7 +37,6 @@ DataCopy数据搬运([L0C Buffer-\>GM](../L0C到GM数据搬运(DataCopy).m
37## 函数原型<a name="zh-cn_topic_0000002516049318_section620mcpsimp"></a>37## 函数原型<a name="zh-cn_topic_0000002516049318_section620mcpsimp"></a>
38 38 
39```cpp39```cpp
40-template<typename T>
41__aicore__ inline void SetFixpipePreQuantFlag(uint64_t config)40__aicore__ inline void SetFixpipePreQuantFlag(uint64_t config)
42```41```
43 42 
@@ -2,7 +2,7 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Broadcast接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+kernel侧Broadcast接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
@@ -2,7 +2,7 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧TransData接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+kernel侧TransData接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。
8- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。8- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。
@@ -26,8 +26,8 @@ void PadTilingFunc(const ge::Shape srcShape, const ge::Shape oriSrcShape, const
26| --- | --- | --- |26| --- | --- | --- |
27| srcShape | 输入 | 输入Tensor的shape信息,shape为二维。 |27| srcShape | 输入 | 输入Tensor的shape信息,shape为二维。 |
28| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |28| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
29-| maxValue | 输出 | Pad接口能完成计算所需最大临时空间大小。<br><br>Pad接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。 <br>maxValue仅作为参考值,有可能大于Unified Buffer剩余空间的大小,该场景下,开发者需要根据Unified Buffer剩余空间的大小来选取合适的临时空间大小。 |29+| maxValue | 输出 | Pad接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。<br>maxValue仅作为参考值,有可能大于Unified Buffer剩余空间的大小,该场景下,开发者需要根据Unified Buffer剩余空间的大小来选取合适的临时空间大小。 |
30-| minValue | 输出 | Pad接口能完成计算所需最小临时空间大小。<br><br>Pad接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。 |30+| minValue | 输出 | Pad接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。 |
31 31 
32**表2** **PadTilingFunc接口参数说明**32**表2** **PadTilingFunc接口参数说明**
33 33 
@@ -35,7 +35,7 @@ void PadTilingFunc(const ge::Shape srcShape, const ge::Shape oriSrcShape, const
35| --- | --- | --- |35| --- | --- | --- |
36| srcShape | 输入 | 输入Tensor的shape信息,shape为二维。(有效数据+冗余数据) |36| srcShape | 输入 | 输入Tensor的shape信息,shape为二维。(有效数据+冗余数据) |
37| oriSrcShape | 输入 | 输入Tensor的原始shape信息,shape为二维。(有效数据) |37| oriSrcShape | 输入 | 输入Tensor的原始shape信息,shape为二维。(有效数据) |
38-| stackBufferSize | 输入 | 可供Pad接口计算的空间大小。 |38+| stackBufferSize | 输入 | 可供Pad接口计算的临时空间大小,单位为Byte。 |
39| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |39| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
40| tiling | 输出 | 输出Pad接口所需的tiling信息。 |40| tiling | 输出 | 输出Pad接口所需的tiling信息。 |
41 41 
@@ -62,7 +62,7 @@ void PadTilingFunc(const ge::Shape srcShape, const ge::Shape oriSrcShape, const
62 END_TILING_DATA_DEF;62 END_TILING_DATA_DEF;
63 ```63 ```
64 64 
65-2. Tiling实现函数中,首先调用**GetPadMaxMinTmpSize**接口获取Pad接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小;然后根据输入shape、剩余的可供计算的空间大小等信息获取Pad kernel侧接口所需tiling参数。65+2. Tiling实现函数中,首先调用**GetPadMaxMinTmpSize**接口获取Pad接口能完成计算所需最大和最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小;然后根据输入shape、剩余的可供计算的空间大小等信息获取Pad kernel侧接口所需tiling参数。
66 66 
67 ```67 ```
68 namespace optiling {68 namespace optiling {
@@ -85,7 +85,7 @@ void PadTilingFunc(const ge::Shape srcShape, const ge::Shape oriSrcShape, const
85 uint32_t maxValue = 0;85 uint32_t maxValue = 0;
86 uint32_t minValue = 0;86 uint32_t minValue = 0;
87 AscendC::GetPadMaxMinTmpSize(srcShape, sizeof(half), maxValue, minValue);87 AscendC::GetPadMaxMinTmpSize(srcShape, sizeof(half), maxValue, minValue);
88- // 本样例中仅作为样例说明,获取最小值并传入,来保证功能正确,开发者可以根据需要传入合适的空间大小88+ // 本样例仅用于说明,获取最小值并传入,来保证功能正确,开发者可以根据需要传入合适的空间大小
89 const uint32_t localWorkSpaceSize = minValue;89 const uint32_t localWorkSpaceSize = minValue;
90 AscendC::PadTilingFunc(srcShape, oriSrcShape, localWorkSpaceSize , sizeof(half), tiling.padTilingData);90 AscendC::PadTilingFunc(srcShape, oriSrcShape, localWorkSpaceSize , sizeof(half), tiling.padTilingData);
91 // 其他逻辑91 // 其他逻辑
@@ -89,7 +89,7 @@
89 END_TILING_DATA_DEF;89 END_TILING_DATA_DEF;
90 ```90 ```
91 91 
92-2. Tiling实现函数中,根据输入shape、可供计算的空间大小\(stackBufferSize\)等信息获取Transpose kernel侧接口所需tiling参数。92+2. Tiling实现函数中,首先调用**GetTransposeMaxMinTmpSize**接口获取Transpose接口能完成计算所需最大和最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小;然后根据输入shape、剩余的可供计算的空间大小等信息获取Transpose kernel侧接口所需Tiling参数。
93 93 
94 ```94 ```
95 namespace optiling {95 namespace optiling {
@@ -110,11 +110,13 @@
110 uint32_t maxValue = 0;110 uint32_t maxValue = 0;
111 uint32_t minValue = 0;111 uint32_t minValue = 0;
112 AscendC::GetTransposeMaxMinTmpSize(srcShape, sizeof(half), transposeTypeIn, maxValue, minValue);112 AscendC::GetTransposeMaxMinTmpSize(srcShape, sizeof(half), transposeTypeIn, maxValue, minValue);
113- // 本样例中仅作为样例说明,获取最小值并传入,来保证功能正确,开发者可以根据需要传入合适的空间大小113+ // 本样例为保证功能正确,传入最小临时空间大小,开发者可以根据需要传入合适的空间大小
114 const uint32_t stackBufferSize = minValue;114 const uint32_t stackBufferSize = minValue;
115- // 获取Transpose Tiling参数115+ // 获取Transpose接口所需的Tiling参数
116- AscendC::GetTransposeTilingInfo(srcShape, stackBufferSize, sizeof(half), transposeTypeIn, tiling.confusionTransposeTilingData);116+ AscendC::GetTransposeTilingInfo(
117- ... // 其他逻辑117+ srcShape, stackBufferSize, sizeof(half), transposeTypeIn, tiling.confusionTransposeTilingData);
118+ ...
119+ // 其他逻辑
118 tiling.SaveToBuffer(context->GetRawTilingData()->GetData(), context->GetRawTilingData()->GetCapacity());120 tiling.SaveToBuffer(context->GetRawTilingData()->GetData(), context->GetRawTilingData()->GetCapacity());
119 context->GetRawTilingData()->SetDataSize(tiling.GetDataSize());121 context->GetRawTilingData()->SetDataSize(tiling.GetDataSize());
120 context->SetTilingKey(1);122 context->SetTilingKey(1);
@@ -27,15 +27,15 @@ void UnPadTilingFunc(const ge::Shape srcShape, const uint32_t stackBufferSize, c
27| ascendcPlatform | 输入 | 传入硬件平台的信息,PlatformAscendC定义请参见[构造及析构函数](../../../Utils-API/平台信息获取/PlatformAscendC/构造及析构函数.md)。 |27| ascendcPlatform | 输入 | 传入硬件平台的信息,PlatformAscendC定义请参见[构造及析构函数](../../../Utils-API/平台信息获取/PlatformAscendC/构造及析构函数.md)。 |
28| srcShape | 输入 | 输入Tensor的shape信息,shape为二维。 |28| srcShape | 输入 | 输入Tensor的shape信息,shape为二维。 |
29| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |29| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
30-| maxValue | 输出 | UnPad接口能完成计算所需最大临时空间大小。<br><br>UnPad接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。 <br>maxValue仅作为参考值,有可能大于Unified Buffer剩余空间的大小,该场景下,开发者需要根据Unified Buffer剩余空间的大小来选取合适的临时空间大小。 |30+| maxValue | 输出 | UnPad接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer剩余空间的大小,该场景下,开发者需要根据Unified Buffer剩余空间的大小来选取合适的临时空间大小。 |
31-| minValue | 输出 | UnPad接口能完成计算所需最小临时空间大小。<br><br>Pad接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |31+| minValue | 输出 | UnPad接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
32 32 
33**表2** **UnPadTilingFunc接口参数说明**33**表2** **UnPadTilingFunc接口参数说明**
34 34 
35| 参数名 | 输入/输出 | 含义 |35| 参数名 | 输入/输出 | 含义 |
36| --- | --- | --- |36| --- | --- | --- |
37| srcShape | 输入 | 输入Tensor的shape信息,shape为二维。 |37| srcShape | 输入 | 输入Tensor的shape信息,shape为二维。 |
38-| stackBufferSize | 输入 | 可供UnPad接口计算的空间大小。 |38+| stackBufferSize | 输入 | 可供UnPad接口计算的临时空间大小,单位为Byte。 |
39| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |39| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
40| tiling | 输出 | 输出UnPad接口所需的tiling信息。 |40| tiling | 输出 | 输出UnPad接口所需的tiling信息。 |
41 41 
@@ -49,7 +49,7 @@ void UnPadTilingFunc(const ge::Shape srcShape, const uint32_t stackBufferSize, c
49 49 
50## 调用示例50## 调用示例
51 51 
52-如下样例介绍了使用UnPad高阶API时host侧获取Tiling参数的流程以及该参数如何在kernel侧使用。样例中原始shape的大小为\[320, 64\],需要unpad的目标shape大小为\[320, 63\],输入的数据类型为half。52+如下样例介绍了使用UnPad高阶API时host侧获取Tiling参数的流程以及该参数如何在kernel侧使用。样例中原始shape的大小为\[320, 64\],unpad后的目标shape大小为\[320, 63\],输入的数据类型为half。
53 53 
541. 将UnPadTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。541. 将UnPadTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。
55 55 
@@ -62,7 +62,7 @@ void UnPadTilingFunc(const ge::Shape srcShape, const uint32_t stackBufferSize, c
62 END_TILING_DATA_DEF;62 END_TILING_DATA_DEF;
63 ```63 ```
64 64 
65-2. Tiling实现函数中,首先调用**GetUnPadMaxMinTmpSize**接口获取UnPad接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小;然后根据输入shape、剩余的可供计算的空间大小等信息获取UnPad kernel侧接口所需tiling参数。65+2. Tiling实现函数中,首先调用**GetUnPadMaxMinTmpSize**接口获取UnPad接口能完成计算所需最大和最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小;然后根据输入shape、剩余的可供计算的空间大小等信息获取UnPad kernel侧接口所需tiling参数。
66 66 
67 ```67 ```
68 namespace optiling {68 namespace optiling {
@@ -84,7 +84,7 @@ void UnPadTilingFunc(const ge::Shape srcShape, const uint32_t stackBufferSize, c
84 auto platformInfo = context->GetPlatformInfo();84 auto platformInfo = context->GetPlatformInfo();
85 auto ascendcPlatform = platform_ascendc::PlatformAscendC(platformInfo);85 auto ascendcPlatform = platform_ascendc::PlatformAscendC(platformInfo);
86 AscendC::GetUnPadMaxMinTmpSize(ascendcPlatform, srcShape, sizeof(half), maxValue, minValue);86 AscendC::GetUnPadMaxMinTmpSize(ascendcPlatform, srcShape, sizeof(half), maxValue, minValue);
87- // 本样例中仅作为样例说明,获取最小值并传入,来保证功能正确,开发者可以根据需要传入合适的空间大小87+ // 本样例仅用于说明,获取最小值并传入,来保证功能正确,开发者可以根据需要传入合适的空间大小
88 const uint32_t localWorkSpaceSize = minValue;88 const uint32_t localWorkSpaceSize = minValue;
89 AscendC::UnPadTilingFunc(srcShape, localWorkSpaceSize , sizeof(half), tiling.unpadTilingData);89 AscendC::UnPadTilingFunc(srcShape, localWorkSpaceSize , sizeof(half), tiling.unpadTilingData);
90 ...90 ...
@@ -78,7 +78,7 @@ struct UnPadParams {
78```78```
79// dstLocal:输出Tensor79// dstLocal:输出Tensor
80// srcLocal:输入Tensor80// srcLocal:输入Tensor
81-// unPadParams:控制填充的参数81+// unPadParams:控制去除填充的参数
82AscendC::UnPadParams unPadParams{0, 1}; // 左边去掉0列,右边去掉1列,当前暂不支持左边unpad82AscendC::UnPadParams unPadParams{0, 1}; // 左边去掉0列,右边去掉1列,当前暂不支持左边unpad
83AscendC::UnPad(dstLocal, srcLocal, unPadParams, tilingData.unpadTilingData);83AscendC::UnPad(dstLocal, srcLocal, unPadParams, tilingData.unpadTilingData);
84```84```
@@ -62,12 +62,12 @@ __aicore__ inline bool CheckRange(std::pair<uint32_t, uint32_t>& range, const ui
62 62 
63template <typename T, typename U, typename S>63template <typename T, typename U, typename S>
64__aicore__ inline bool CheckOverflow(const LocalTensor<T>& dst, const LocalTensor<U>& src0,64__aicore__ inline bool CheckOverflow(const LocalTensor<T>& dst, const LocalTensor<U>& src0,
65- const LocalTensor<S>& src1, const uint32_t m, const uint32_t k, const uint32_t n, GemmTiling& tilling)65+ const LocalTensor<S>& src1, const uint32_t m, const uint32_t k, const uint32_t n, GemmTiling& tiling)
66{66{
67 // check l0c67 // check l0c
68- uint32_t roundM = DivCeil(m, tilling.blockSize) * tilling.blockSize;68+ uint32_t roundM = DivCeil(m, tiling.blockSize) * tiling.blockSize;
69- uint32_t roundN = DivCeil(n, tilling.blockSize) * tilling.blockSize;69+ uint32_t roundN = DivCeil(n, tiling.blockSize) * tiling.blockSize;
70- uint32_t roundK = DivCeil(k, tilling.c0Size) * tilling.c0Size;70+ uint32_t roundK = DivCeil(k, tiling.c0Size) * tiling.c0Size;
71 71 
72 uint32_t needElementLoc = roundM * roundN * sizeof(uint32_t);72 uint32_t needElementLoc = roundM * roundN * sizeof(uint32_t);
73 if (needElementLoc > TOTAL_L0C_SIZE) {73 if (needElementLoc > TOTAL_L0C_SIZE) {
@@ -88,10 +88,10 @@ __aicore__ inline bool CheckOverflow(const LocalTensor<T>& dst, const LocalTenso
88 88 
89template <typename T, typename U, typename S>89template <typename T, typename U, typename S>
90__aicore__ inline bool CheckParams(const LocalTensor<T>& dst, const LocalTensor<U>& src0,90__aicore__ inline bool CheckParams(const LocalTensor<T>& dst, const LocalTensor<U>& src0,
91- const LocalTensor<S>& src1, const uint32_t m, const uint32_t k, const uint32_t n, GemmTiling& tilling)91+ const LocalTensor<S>& src1, const uint32_t m, const uint32_t k, const uint32_t n, GemmTiling& tiling)
92{92{
93 // check c0Size93 // check c0Size
94- if (tilling.c0Size != 16 && tilling.c0Size != 32) {94+ if (tiling.c0Size != 16 && tiling.c0Size != 32) {
95 return false;95 return false;
96 }96 }
97 // check scope97 // check scope
@@ -126,7 +126,7 @@ __aicore__ inline bool CheckParams(const LocalTensor<T>& dst, const LocalTensor<
126 }126 }
127 127 
128 // check overflow128 // check overflow
129- if (!CheckOverflow(dst, src0, src1, m, k, n, tilling)) {129+ if (!CheckOverflow(dst, src0, src1, m, k, n, tiling)) {
130 return false;130 return false;
131 }131 }
132 132 
@@ -134,38 +134,38 @@ __aicore__ inline bool CheckParams(const LocalTensor<T>& dst, const LocalTensor<
134}134}
135#endif135#endif
136 136 
137-__aicore__ inline void CalculateGemmTiling(GemmTiling& tilling)137+__aicore__ inline void CalculateGemmTiling(GemmTiling& tiling)
138{138{
139- tilling.mIterNum = 1;139+ tiling.mIterNum = 1;
140- tilling.nIterNum = 1;140+ tiling.nIterNum = 1;
141- tilling.kIterNum = DivCeil(tilling.kBlockNum, tilling.kTileBlock);141+ tiling.kIterNum = DivCeil(tiling.kBlockNum, tiling.kTileBlock);
142 142 
143- tilling.mTileBlock = DivCeil(tilling.mBlockNum, tilling.mIterNum);143+ tiling.mTileBlock = DivCeil(tiling.mBlockNum, tiling.mIterNum);
144- tilling.nTileBlock = DivCeil(tilling.nBlockNum, tilling.nIterNum);144+ tiling.nTileBlock = DivCeil(tiling.nBlockNum, tiling.nIterNum);
145 145 
146- tilling.kTailBlock = tilling.kBlockNum - (tilling.kIterNum - 1) * tilling.kTileBlock;146+ tiling.kTailBlock = tiling.kBlockNum - (tiling.kIterNum - 1) * tiling.kTileBlock;
147- tilling.mTailBlock = tilling.mBlockNum - (tilling.mIterNum - 1) * tilling.mTileBlock; // mTailBlock <= mBlockNum147+ tiling.mTailBlock = tiling.mBlockNum - (tiling.mIterNum - 1) * tiling.mTileBlock; // mTailBlock <= mBlockNum
148- tilling.nTailBlock = tilling.nBlockNum - (tilling.nIterNum - 1) * tilling.nTileBlock;148+ tiling.nTailBlock = tiling.nBlockNum - (tiling.nIterNum - 1) * tiling.nTileBlock;
149 149 
150- tilling.kHasTail = tilling.kTailBlock != tilling.kTileBlock;150+ tiling.kHasTail = tiling.kTailBlock != tiling.kTileBlock;
151- tilling.kHasTailEle = tilling.roundK != tilling.kNum;151+ tiling.kHasTailEle = tiling.roundK != tiling.kNum;
152- tilling.kTailEle = tilling.kNum % (tilling.kTileBlock * tilling.c0Size);152+ tiling.kTailEle = tiling.kNum % (tiling.kTileBlock * tiling.c0Size);
153 153 
154- if (tilling.mNum != tilling.mTileBlock * tilling.blockSize) {154+ if (tiling.mNum != tiling.mTileBlock * tiling.blockSize) {
155- tilling.mHasTail = true;155+ tiling.mHasTail = true;
156 } else {156 } else {
157- tilling.mHasTail = false;157+ tiling.mHasTail = false;
158 }158 }
159- tilling.nHasTail = tilling.nTileBlock != tilling.nTailBlock;159+ tiling.nHasTail = tiling.nTileBlock != tiling.nTailBlock;
160}160}
161 161 
162template <typename T>162template <typename T>
163-__aicore__ inline void LoadL0B(uint32_t kBlocks, uint32_t nBlocks, GemmTiling tilling, uint32_t i, uint32_t j,163+__aicore__ inline void LoadL0B(uint32_t kBlocks, uint32_t nBlocks, GemmTiling tiling, uint32_t i, uint32_t j,
164 const LocalTensor<T>& src1, const LocalTensor<T>& l0b)164 const LocalTensor<T>& src1, const LocalTensor<T>& l0b)
165{165{
166- if (tilling.nIterNum == 1) {166+ if (tiling.nIterNum == 1) {
167- uint32_t wSize = tilling.blockSize * tilling.c0Size;167+ uint32_t wSize = tiling.blockSize * tiling.c0Size;
168- uint32_t wIdx = (i * tilling.kTileBlock * tilling.nBlockNum + j * tilling.nTileBlock) * wSize;168+ uint32_t wIdx = (i * tiling.kTileBlock * tiling.nBlockNum + j * tiling.nTileBlock) * wSize;
169 LoadData2DParams params;169 LoadData2DParams params;
170 params.startIndex = 0;170 params.startIndex = 0;
171 params.repeatTimes = kBlocks * nBlocks;171 params.repeatTimes = kBlocks * nBlocks;
@@ -174,10 +174,10 @@ __aicore__ inline void LoadL0B(uint32_t kBlocks, uint32_t nBlocks, GemmTiling ti
174 } else {174 } else {
175 // load data row by row175 // load data row by row
176 for (size_t index = 0; index < kBlocks; ++index) {176 for (size_t index = 0; index < kBlocks; ++index) {
177- uint32_t wSize = j * tilling.nTileBlock * tilling.blockSize * tilling.c0Size;177+ uint32_t wSize = j * tiling.nTileBlock * tiling.blockSize * tiling.c0Size;
178 uint32_t wIdx =178 uint32_t wIdx =
179- (i * tilling.kTileBlock + index) * tilling.nBlockNum * tilling.blockSize * tilling.c0Size + wSize;179+ (i * tiling.kTileBlock + index) * tiling.nBlockNum * tiling.blockSize * tiling.c0Size + wSize;
180- uint32_t l0bIdx = index * nBlocks * tilling.blockSize * tilling.c0Size;180+ uint32_t l0bIdx = index * nBlocks * tiling.blockSize * tiling.c0Size;
181 LoadData2DParams params;181 LoadData2DParams params;
182 params.startIndex = 0;182 params.startIndex = 0;
183 params.repeatTimes = nBlocks;183 params.repeatTimes = nBlocks;
@@ -188,12 +188,12 @@ __aicore__ inline void LoadL0B(uint32_t kBlocks, uint32_t nBlocks, GemmTiling ti
188}188}
189 189 
190template <typename T>190template <typename T>
191-__aicore__ inline void LoadL0A(uint32_t kBlocks, uint32_t mBlocks, GemmTiling tilling, uint32_t i, uint32_t t,191+__aicore__ inline void LoadL0A(uint32_t kBlocks, uint32_t mBlocks, GemmTiling tiling, uint32_t i, uint32_t t,
192 const LocalTensor<T>& src0, const LocalTensor<T>& l0a)192 const LocalTensor<T>& src0, const LocalTensor<T>& l0a)
193{193{
194 if (kBlocks == 1) {194 if (kBlocks == 1) {
195- uint32_t l1aSize = i * tilling.kTileBlock * tilling.mBlockNum * tilling.blockSize * tilling.c0Size;195+ uint32_t l1aSize = i * tiling.kTileBlock * tiling.mBlockNum * tiling.blockSize * tiling.c0Size;
196- uint32_t l1aOffset = t * tilling.mTileBlock * tilling.blockSize * tilling.c0Size + l1aSize;196+ uint32_t l1aOffset = t * tiling.mTileBlock * tiling.blockSize * tiling.c0Size + l1aSize;
197 LoadData2DParams params;197 LoadData2DParams params;
198 params.startIndex = 0;198 params.startIndex = 0;
199 params.repeatTimes = mBlocks;199 params.repeatTimes = mBlocks;
@@ -202,13 +202,13 @@ __aicore__ inline void LoadL0A(uint32_t kBlocks, uint32_t mBlocks, GemmTiling ti
202 } else {202 } else {
203 // load data row by row203 // load data row by row
204 for (size_t index = 0; index < mBlocks; index++) {204 for (size_t index = 0; index < mBlocks; index++) {
205- uint32_t l0aOffset = index * kBlocks * tilling.blockSize * tilling.c0Size;205+ uint32_t l0aOffset = index * kBlocks * tiling.blockSize * tiling.c0Size;
206- uint32_t l1aOffset = (t * tilling.mTileBlock + index) * tilling.blockSize * tilling.c0Size +206+ uint32_t l1aOffset = (t * tiling.mTileBlock + index) * tiling.blockSize * tiling.c0Size +
207- i * tilling.kTileBlock * tilling.mBlockNum * tilling.blockSize * tilling.c0Size;207+ i * tiling.kTileBlock * tiling.mBlockNum * tiling.blockSize * tiling.c0Size;
208 LoadData2DParams params;208 LoadData2DParams params;
209 params.startIndex = 0;209 params.startIndex = 0;
210 params.repeatTimes = kBlocks;210 params.repeatTimes = kBlocks;
211- params.srcStride = tilling.mBlockNum;211+ params.srcStride = tiling.mBlockNum;
212 LoadDataImpl(l0a[l0aOffset], src0[l1aOffset], params);212 LoadDataImpl(l0a[l0aOffset], src0[l1aOffset], params);
213 }213 }
214 }214 }
@@ -216,45 +216,45 @@ __aicore__ inline void LoadL0A(uint32_t kBlocks, uint32_t mBlocks, GemmTiling ti
216 216 
217template <typename T, typename U, typename S>217template <typename T, typename U, typename S>
218__aicore__ inline void MmadFunc(const LocalTensor<U>& l0a, const LocalTensor<S>& l0b,218__aicore__ inline void MmadFunc(const LocalTensor<U>& l0a, const LocalTensor<S>& l0b,
219- const LocalTensor<T>& l0c, int32_t initValue, GemmTiling tilling, size_t i)219+ const LocalTensor<T>& l0c, int32_t initValue, GemmTiling tiling, size_t i)
220{220{
221 MmadParams mmadParams;221 MmadParams mmadParams;
222- mmadParams.m = tilling.mTileBlock * tilling.blockSize;222+ mmadParams.m = tiling.mTileBlock * tiling.blockSize;
223- mmadParams.n = tilling.nTileBlock * tilling.blockSize;223+ mmadParams.n = tiling.nTileBlock * tiling.blockSize;
224 mmadParams.isBias = 1;224 mmadParams.isBias = 1;
225 225 
226- if (tilling.kIterNum == 1) {226+ if (tiling.kIterNum == 1) {
227- mmadParams.k = tilling.kNum;227+ mmadParams.k = tiling.kNum;
228 mmadParams.isBias = initValue;228 mmadParams.isBias = initValue;
229- } else if (initValue == 1 && tilling.kHasTailEle) {229+ } else if (initValue == 1 && tiling.kHasTailEle) {
230- if (i == tilling.kIterNum - 1) {230+ if (i == tiling.kIterNum - 1) {
231- mmadParams.k = tilling.kTailEle;231+ mmadParams.k = tiling.kTailEle;
232 } else {232 } else {
233- mmadParams.k = tilling.kTileBlock * tilling.c0Size;233+ mmadParams.k = tiling.kTileBlock * tiling.c0Size;
234 }234 }
235- } else if (initValue != 1 && tilling.kHasTailEle) {235+ } else if (initValue != 1 && tiling.kHasTailEle) {
236 if (i == 0) {236 if (i == 0) {
237- mmadParams.k = tilling.kTileBlock * tilling.c0Size;237+ mmadParams.k = tiling.kTileBlock * tiling.c0Size;
238 mmadParams.isBias = 0;238 mmadParams.isBias = 0;
239- } else if (i == tilling.kIterNum - 1) {239+ } else if (i == tiling.kIterNum - 1) {
240- mmadParams.k = tilling.kTailEle;240+ mmadParams.k = tiling.kTailEle;
241 } else {241 } else {
242- mmadParams.k = tilling.kTileBlock * tilling.c0Size;242+ mmadParams.k = tiling.kTileBlock * tiling.c0Size;
243 }243 }
244- } else if (initValue == 1 && !tilling.kHasTailEle) {244+ } else if (initValue == 1 && !tiling.kHasTailEle) {
245- if (i == tilling.kIterNum - 1) {245+ if (i == tiling.kIterNum - 1) {
246- mmadParams.k = tilling.kTailBlock * tilling.c0Size;246+ mmadParams.k = tiling.kTailBlock * tiling.c0Size;
247 } else {247 } else {
248- mmadParams.k = tilling.kTileBlock * tilling.c0Size;248+ mmadParams.k = tiling.kTileBlock * tiling.c0Size;
249 }249 }
250 } else {250 } else {
251 if (i == 0) {251 if (i == 0) {
252- mmadParams.k = tilling.kTileBlock * tilling.c0Size;252+ mmadParams.k = tiling.kTileBlock * tiling.c0Size;
253 mmadParams.isBias = 0;253 mmadParams.isBias = 0;
254- } else if (i == tilling.kIterNum - 1) {254+ } else if (i == tiling.kIterNum - 1) {
255- mmadParams.k = tilling.kTailBlock * tilling.c0Size;255+ mmadParams.k = tiling.kTailBlock * tiling.c0Size;
256 } else {256 } else {
257- mmadParams.k = tilling.kTileBlock * tilling.c0Size;257+ mmadParams.k = tiling.kTileBlock * tiling.c0Size;
258 }258 }
259 }259 }
260 MmadImpl(l0c, l0a, l0b, mmadParams);260 MmadImpl(l0c, l0a, l0b, mmadParams);
@@ -307,30 +307,30 @@ __aicore__ inline void GetSingleThreadBuffer(LocalTensor<T>& l0a, LocalTensor<U>
307 307 
308template <typename T, typename U, typename S>308template <typename T, typename U, typename S>
309__aicore__ inline void GemmExecNmNopingpong(const LocalTensor<T>& l0c, const LocalTensor<U>& src0,309__aicore__ inline void GemmExecNmNopingpong(const LocalTensor<T>& l0c, const LocalTensor<U>& src0,
310- const LocalTensor<S>& src1, GemmTiling tilling, const int32_t initValue)310+ const LocalTensor<S>& src1, GemmTiling tiling, const int32_t initValue)
311{311{
312 LocalTensor<U> l0a;312 LocalTensor<U> l0a;
313 LocalTensor<S> l0b;313 LocalTensor<S> l0b;
314 GetSingleThreadBuffer(l0a, l0b);314 GetSingleThreadBuffer(l0a, l0b);
315 event_t eventIdMToMte1 = static_cast<event_t>(GetTPipePtr()->FetchEventID(HardEvent::M_MTE1));315 event_t eventIdMToMte1 = static_cast<event_t>(GetTPipePtr()->FetchEventID(HardEvent::M_MTE1));
316 SetFlag<HardEvent::M_MTE1>(eventIdMToMte1);316 SetFlag<HardEvent::M_MTE1>(eventIdMToMte1);
317- for (size_t indexK = 0; indexK < tilling.kIterNum; indexK++) {317+ for (size_t indexK = 0; indexK < tiling.kIterNum; indexK++) {
318- uint32_t kBlocks = tilling.kTileBlock;318+ uint32_t kBlocks = tiling.kTileBlock;
319- if (indexK == tilling.kIterNum - 1) {319+ if (indexK == tiling.kIterNum - 1) {
320- kBlocks = tilling.kTailBlock;320+ kBlocks = tiling.kTailBlock;
321 }321 }
322 WaitFlag<HardEvent::M_MTE1>(eventIdMToMte1);322 WaitFlag<HardEvent::M_MTE1>(eventIdMToMte1);
323- for (size_t indexN = 0; indexN < tilling.nIterNum; indexN++) {323+ for (size_t indexN = 0; indexN < tiling.nIterNum; indexN++) {
324 // load data from l1 to l0b324 // load data from l1 to l0b
325- LoadL0B(kBlocks, tilling.nTileBlock, tilling, indexK, indexN, src1, l0b);325+ LoadL0B(kBlocks, tiling.nTileBlock, tiling, indexK, indexN, src1, l0b);
326- for (size_t indexM = 0; indexM < tilling.mIterNum; indexM++) {326+ for (size_t indexM = 0; indexM < tiling.mIterNum; indexM++) {
327 // load data from l1 to l0a327 // load data from l1 to l0a
328- LoadL0A(kBlocks, tilling.mTileBlock, tilling, indexK, indexM, src0, l0a);328+ LoadL0A(kBlocks, tiling.mTileBlock, tiling, indexK, indexM, src0, l0a);
329 event_t eventIdMte1ToM = static_cast<event_t>(GetTPipePtr()->FetchEventID(HardEvent::MTE1_M));329 event_t eventIdMte1ToM = static_cast<event_t>(GetTPipePtr()->FetchEventID(HardEvent::MTE1_M));
330 SetFlag<HardEvent::MTE1_M>(eventIdMte1ToM);330 SetFlag<HardEvent::MTE1_M>(eventIdMte1ToM);
331 WaitFlag<HardEvent::MTE1_M>(eventIdMte1ToM);331 WaitFlag<HardEvent::MTE1_M>(eventIdMte1ToM);
332 PipeBarrier<PIPE_M>();332 PipeBarrier<PIPE_M>();
333- MmadFunc(l0a, l0b, l0c, initValue, tilling, indexK);333+ MmadFunc(l0a, l0b, l0c, initValue, tiling, indexK);
334 }334 }
335 }335 }
336 SetFlag<HardEvent::M_MTE1>(eventIdMToMte1);336 SetFlag<HardEvent::M_MTE1>(eventIdMToMte1);
@@ -340,7 +340,7 @@ __aicore__ inline void GemmExecNmNopingpong(const LocalTensor<T>& l0c, const Loc
340 340 
341template <typename T, typename U, typename S>341template <typename T, typename U, typename S>
342__aicore__ inline void GemmExecNmPingPong(const LocalTensor<T>& l0c, const LocalTensor<U>& src0,342__aicore__ inline void GemmExecNmPingPong(const LocalTensor<T>& l0c, const LocalTensor<U>& src0,
343- const LocalTensor<S>& src1, GemmTiling tilling, const int32_t initValue)343+ const LocalTensor<S>& src1, GemmTiling tiling, const int32_t initValue)
344{344{
345 uint32_t ping = 1;345 uint32_t ping = 1;
346 LocalTensor<U> l0aPing;346 LocalTensor<U> l0aPing;
@@ -354,40 +354,40 @@ __aicore__ inline void GemmExecNmPingPong(const LocalTensor<T>& l0c, const Local
354 SetFlag<HardEvent::M_MTE1>(eventId0);354 SetFlag<HardEvent::M_MTE1>(eventId0);
355 SetFlag<HardEvent::M_MTE1>(eventId1);355 SetFlag<HardEvent::M_MTE1>(eventId1);
356 356 
357- for (size_t i = 0; i < tilling.kIterNum; i++) {357+ for (size_t i = 0; i < tiling.kIterNum; i++) {
358- uint32_t kBlocks = tilling.kTileBlock;358+ uint32_t kBlocks = tiling.kTileBlock;
359- if (i == tilling.kIterNum - 1) {359+ if (i == tiling.kIterNum - 1) {
360- kBlocks = tilling.kTailBlock;360+ kBlocks = tiling.kTailBlock;
361 }361 }
362 if (ping == 1) {362 if (ping == 1) {
363 WaitFlag<HardEvent::M_MTE1>(eventId0);363 WaitFlag<HardEvent::M_MTE1>(eventId0);
364- for (size_t indexN = 0; indexN < tilling.nIterNum; indexN++) {364+ for (size_t indexN = 0; indexN < tiling.nIterNum; indexN++) {
365 // load data from l1 to l0b365 // load data from l1 to l0b
366- LoadL0B(kBlocks, tilling.nTileBlock, tilling, i, indexN, src1, l0bPing);366+ LoadL0B(kBlocks, tiling.nTileBlock, tiling, i, indexN, src1, l0bPing);
367- for (size_t indexM = 0; indexM < tilling.mIterNum; indexM++) {367+ for (size_t indexM = 0; indexM < tiling.mIterNum; indexM++) {
368 // load data from l1 to l0a368 // load data from l1 to l0a
369- LoadL0A(kBlocks, tilling.mTileBlock, tilling, i, indexM, src0, l0aPing);369+ LoadL0A(kBlocks, tiling.mTileBlock, tiling, i, indexM, src0, l0aPing);
370 event_t eventIdMte1ToM = static_cast<event_t>(GetTPipePtr()->FetchEventID(HardEvent::MTE1_M));370 event_t eventIdMte1ToM = static_cast<event_t>(GetTPipePtr()->FetchEventID(HardEvent::MTE1_M));
371 SetFlag<HardEvent::MTE1_M>(eventIdMte1ToM);371 SetFlag<HardEvent::MTE1_M>(eventIdMte1ToM);
372 WaitFlag<HardEvent::MTE1_M>(eventIdMte1ToM);372 WaitFlag<HardEvent::MTE1_M>(eventIdMte1ToM);
373 PipeBarrier<PIPE_M>();373 PipeBarrier<PIPE_M>();
374- MmadFunc(l0aPing, l0bPing, l0c, initValue, tilling, i);374+ MmadFunc(l0aPing, l0bPing, l0c, initValue, tiling, i);
375 }375 }
376 }376 }
377 SetFlag<HardEvent::M_MTE1>(eventId0);377 SetFlag<HardEvent::M_MTE1>(eventId0);
378 } else {378 } else {
379 WaitFlag<HardEvent::M_MTE1>(eventId1);379 WaitFlag<HardEvent::M_MTE1>(eventId1);
380- for (size_t indexN = 0; indexN < tilling.nIterNum; indexN++) {380+ for (size_t indexN = 0; indexN < tiling.nIterNum; indexN++) {
381 // load data from l1 to l0b381 // load data from l1 to l0b
382- LoadL0B(kBlocks, tilling.nTileBlock, tilling, i, indexN, src1, l0bPong);382+ LoadL0B(kBlocks, tiling.nTileBlock, tiling, i, indexN, src1, l0bPong);
383- for (size_t indexM = 0; indexM < tilling.mIterNum; indexM++) {383+ for (size_t indexM = 0; indexM < tiling.mIterNum; indexM++) {
384 // load data from l1 to l0a384 // load data from l1 to l0a
385- LoadL0A(kBlocks, tilling.mTileBlock, tilling, i, indexM, src0, l0aPong);385+ LoadL0A(kBlocks, tiling.mTileBlock, tiling, i, indexM, src0, l0aPong);
386 event_t eventIdMte1ToM = static_cast<event_t>(GetTPipePtr()->FetchEventID(HardEvent::MTE1_M));386 event_t eventIdMte1ToM = static_cast<event_t>(GetTPipePtr()->FetchEventID(HardEvent::MTE1_M));
387 SetFlag<HardEvent::MTE1_M>(eventIdMte1ToM);387 SetFlag<HardEvent::MTE1_M>(eventIdMte1ToM);
388 WaitFlag<HardEvent::MTE1_M>(eventIdMte1ToM);388 WaitFlag<HardEvent::MTE1_M>(eventIdMte1ToM);
389 PipeBarrier<PIPE_M>();389 PipeBarrier<PIPE_M>();
390- MmadFunc(l0aPong, l0bPong, l0c, initValue, tilling, i);390+ MmadFunc(l0aPong, l0bPong, l0c, initValue, tiling, i);
391 }391 }
392 }392 }
393 SetFlag<HardEvent::M_MTE1>(eventId1);393 SetFlag<HardEvent::M_MTE1>(eventId1);
@@ -408,43 +408,43 @@ __aicore__ inline void GemmExecNmPingPong(const LocalTensor<T>& l0c, const Local
408 408 
409template <typename T, typename U, typename S>409template <typename T, typename U, typename S>
410__aicore__ inline void GemmExecNm(const LocalTensor<T>& l0c, const LocalTensor<U>& src0,410__aicore__ inline void GemmExecNm(const LocalTensor<T>& l0c, const LocalTensor<U>& src0,
411- const LocalTensor<S>& src1, GemmTiling tilling, const int32_t initValue)411+ const LocalTensor<S>& src1, GemmTiling tiling, const int32_t initValue)
412{412{
413- uint32_t needL0Asize = tilling.roundM * tilling.dtypeSize * tilling.c0Size * tilling.kTileBlock * 2;413+ uint32_t needL0Asize = tiling.roundM * tiling.dtypeSize * tiling.c0Size * tiling.kTileBlock * 2;
414- uint32_t needL0Bsize = tilling.roundN * tilling.dtypeSize * tilling.c0Size * tilling.kTileBlock * 2;414+ uint32_t needL0Bsize = tiling.roundN * tiling.dtypeSize * tiling.c0Size * tiling.kTileBlock * 2;
415 if (needL0Asize > TOTAL_L0A_SIZE || needL0Bsize > TOTAL_L0B_SIZE) {415 if (needL0Asize > TOTAL_L0A_SIZE || needL0Bsize > TOTAL_L0B_SIZE) {
416- GemmExecNmNopingpong(l0c, src0, src1, tilling, initValue);416+ GemmExecNmNopingpong(l0c, src0, src1, tiling, initValue);
417 return;417 return;
418 }418 }
419- GemmExecNmPingPong(l0c, src0, src1, tilling, initValue);419+ GemmExecNmPingPong(l0c, src0, src1, tiling, initValue);
420}420}
421 421 
422template <typename T, typename U, typename S>422template <typename T, typename U, typename S>
423__aicore__ inline void GemmExecMnNopingpong(const LocalTensor<T>& l0c, const LocalTensor<U>& src0,423__aicore__ inline void GemmExecMnNopingpong(const LocalTensor<T>& l0c, const LocalTensor<U>& src0,
424- const LocalTensor<S>& src1, GemmTiling tilling, const int32_t initValue)424+ const LocalTensor<S>& src1, GemmTiling tiling, const int32_t initValue)
425{425{
426 LocalTensor<S> l0b;426 LocalTensor<S> l0b;
427 LocalTensor<U> l0a;427 LocalTensor<U> l0a;
428 GetSingleThreadBuffer(l0a, l0b);428 GetSingleThreadBuffer(l0a, l0b);
429 event_t eventIdMToMte1 = static_cast<event_t>(GetTPipePtr()->FetchEventID(HardEvent::M_MTE1));429 event_t eventIdMToMte1 = static_cast<event_t>(GetTPipePtr()->FetchEventID(HardEvent::M_MTE1));
430 SetFlag<HardEvent::M_MTE1>(eventIdMToMte1);430 SetFlag<HardEvent::M_MTE1>(eventIdMToMte1);
431- for (size_t indexK = 0; indexK < tilling.kIterNum; indexK++) {431+ for (size_t indexK = 0; indexK < tiling.kIterNum; indexK++) {
432- uint32_t kBlocks = tilling.kTileBlock;432+ uint32_t kBlocks = tiling.kTileBlock;
433- if (indexK == tilling.kIterNum - 1) {433+ if (indexK == tiling.kIterNum - 1) {
434- kBlocks = tilling.kTailBlock;434+ kBlocks = tiling.kTailBlock;
435 }435 }
436 WaitFlag<HardEvent::M_MTE1>(eventIdMToMte1);436 WaitFlag<HardEvent::M_MTE1>(eventIdMToMte1);
437- for (size_t indexM = 0; indexM < tilling.mIterNum; indexM++) {437+ for (size_t indexM = 0; indexM < tiling.mIterNum; indexM++) {
438 // load data from l1 to l0a438 // load data from l1 to l0a
439- LoadL0A(kBlocks, tilling.mTileBlock, tilling, indexK, indexM, src0, l0a);439+ LoadL0A(kBlocks, tiling.mTileBlock, tiling, indexK, indexM, src0, l0a);
440- for (size_t indexN = 0; indexN < tilling.nIterNum; indexN++) {440+ for (size_t indexN = 0; indexN < tiling.nIterNum; indexN++) {
441 // load data from l1 to l0b441 // load data from l1 to l0b
442- LoadL0B(kBlocks, tilling.nTileBlock, tilling, indexK, indexN, src1, l0b);442+ LoadL0B(kBlocks, tiling.nTileBlock, tiling, indexK, indexN, src1, l0b);
443 event_t eventIdMte1ToM = static_cast<event_t>(GetTPipePtr()->FetchEventID(HardEvent::MTE1_M));443 event_t eventIdMte1ToM = static_cast<event_t>(GetTPipePtr()->FetchEventID(HardEvent::MTE1_M));
444 SetFlag<HardEvent::MTE1_M>(eventIdMte1ToM);444 SetFlag<HardEvent::MTE1_M>(eventIdMte1ToM);
445 WaitFlag<HardEvent::MTE1_M>(eventIdMte1ToM);445 WaitFlag<HardEvent::MTE1_M>(eventIdMte1ToM);
446 PipeBarrier<PIPE_M>();446 PipeBarrier<PIPE_M>();
447- MmadFunc(l0a, l0b, l0c, initValue, tilling, indexK);447+ MmadFunc(l0a, l0b, l0c, initValue, tiling, indexK);
448 }448 }
449 }449 }
450 SetFlag<HardEvent::M_MTE1>(eventIdMToMte1);450 SetFlag<HardEvent::M_MTE1>(eventIdMToMte1);
@@ -454,7 +454,7 @@ __aicore__ inline void GemmExecMnNopingpong(const LocalTensor<T>& l0c, const Loc
454 454 
455template <typename T, typename U, typename S>455template <typename T, typename U, typename S>
456__aicore__ inline void GemmExecMnPingPong(const LocalTensor<T>& l0c, const LocalTensor<U>& src0,456__aicore__ inline void GemmExecMnPingPong(const LocalTensor<T>& l0c, const LocalTensor<U>& src0,
457- const LocalTensor<S>& src1, GemmTiling tilling, const int32_t initValue)457+ const LocalTensor<S>& src1, GemmTiling tiling, const int32_t initValue)
458{458{
459 uint32_t ping = 1;459 uint32_t ping = 1;
460 LocalTensor<U> l0aPing;460 LocalTensor<U> l0aPing;
@@ -468,41 +468,41 @@ __aicore__ inline void GemmExecMnPingPong(const LocalTensor<T>& l0c, const Local
468 SetFlag<HardEvent::M_MTE1>(eventId0);468 SetFlag<HardEvent::M_MTE1>(eventId0);
469 SetFlag<HardEvent::M_MTE1>(eventId1);469 SetFlag<HardEvent::M_MTE1>(eventId1);
470 470 
471- for (size_t i = 0; i < tilling.kIterNum; i++) {471+ for (size_t i = 0; i < tiling.kIterNum; i++) {
472- uint32_t kBlocks = tilling.kTileBlock;472+ uint32_t kBlocks = tiling.kTileBlock;
473- if (i == tilling.kIterNum - 1) {473+ if (i == tiling.kIterNum - 1) {
474- kBlocks = tilling.kTailBlock;474+ kBlocks = tiling.kTailBlock;
475 }475 }
476 if (ping == 1) {476 if (ping == 1) {
477 WaitFlag<HardEvent::M_MTE1>(eventId0);477 WaitFlag<HardEvent::M_MTE1>(eventId0);
478- for (size_t indexM = 0; indexM < tilling.mIterNum; indexM++) {478+ for (size_t indexM = 0; indexM < tiling.mIterNum; indexM++) {
479 // load data from l1 to l0a479 // load data from l1 to l0a
480- LoadL0A(kBlocks, tilling.mTileBlock, tilling, i, indexM, src0, l0aPing);480+ LoadL0A(kBlocks, tiling.mTileBlock, tiling, i, indexM, src0, l0aPing);
481- for (size_t indexN = 0; indexN < tilling.nIterNum; indexN++) {481+ for (size_t indexN = 0; indexN < tiling.nIterNum; indexN++) {
482 // load data from l1 to l0b482 // load data from l1 to l0b
483- LoadL0B(kBlocks, tilling.nTileBlock, tilling, i, indexN, src1, l0bPing);483+ LoadL0B(kBlocks, tiling.nTileBlock, tiling, i, indexN, src1, l0bPing);
484 484 
485 event_t eventIdMte1ToM = static_cast<event_t>(GetTPipePtr()->FetchEventID(HardEvent::MTE1_M));485 event_t eventIdMte1ToM = static_cast<event_t>(GetTPipePtr()->FetchEventID(HardEvent::MTE1_M));
486 SetFlag<HardEvent::MTE1_M>(eventIdMte1ToM);486 SetFlag<HardEvent::MTE1_M>(eventIdMte1ToM);
487 WaitFlag<HardEvent::MTE1_M>(eventIdMte1ToM);487 WaitFlag<HardEvent::MTE1_M>(eventIdMte1ToM);
488 PipeBarrier<PIPE_M>();488 PipeBarrier<PIPE_M>();
489- MmadFunc(l0aPing, l0bPing, l0c, initValue, tilling, i);489+ MmadFunc(l0aPing, l0bPing, l0c, initValue, tiling, i);
490 }490 }
491 }491 }
492 SetFlag<HardEvent::M_MTE1>(eventId0);492 SetFlag<HardEvent::M_MTE1>(eventId0);
493 } else {493 } else {
494 WaitFlag<HardEvent::M_MTE1>(eventId1);494 WaitFlag<HardEvent::M_MTE1>(eventId1);
495- for (size_t indexM = 0; indexM < tilling.mIterNum; indexM++) {495+ for (size_t indexM = 0; indexM < tiling.mIterNum; indexM++) {
496 // load data from l1 to l0a496 // load data from l1 to l0a
497- LoadL0A(kBlocks, tilling.mTileBlock, tilling, i, indexM, src0, l0aPong);497+ LoadL0A(kBlocks, tiling.mTileBlock, tiling, i, indexM, src0, l0aPong);
498- for (size_t indexN = 0; indexN < tilling.nIterNum; indexN++) {498+ for (size_t indexN = 0; indexN < tiling.nIterNum; indexN++) {
499 // load data from l1 to l0b499 // load data from l1 to l0b
500- LoadL0B(kBlocks, tilling.nTileBlock, tilling, i, indexN, src1, l0bPong);500+ LoadL0B(kBlocks, tiling.nTileBlock, tiling, i, indexN, src1, l0bPong);
501 event_t eventIdMte1ToM = static_cast<event_t>(GetTPipePtr()->FetchEventID(HardEvent::MTE1_M));501 event_t eventIdMte1ToM = static_cast<event_t>(GetTPipePtr()->FetchEventID(HardEvent::MTE1_M));
502 SetFlag<HardEvent::MTE1_M>(eventIdMte1ToM);502 SetFlag<HardEvent::MTE1_M>(eventIdMte1ToM);
503 WaitFlag<HardEvent::MTE1_M>(eventIdMte1ToM);503 WaitFlag<HardEvent::MTE1_M>(eventIdMte1ToM);
504 PipeBarrier<PIPE_M>();504 PipeBarrier<PIPE_M>();
505- MmadFunc(l0aPong, l0bPong, l0c, initValue, tilling, i);505+ MmadFunc(l0aPong, l0bPong, l0c, initValue, tiling, i);
506 }506 }
507 }507 }
508 SetFlag<HardEvent::M_MTE1>(eventId1);508 SetFlag<HardEvent::M_MTE1>(eventId1);
@@ -518,15 +518,15 @@ __aicore__ inline void GemmExecMnPingPong(const LocalTensor<T>& l0c, const Local
518 518 
519template <typename T, typename U, typename S>519template <typename T, typename U, typename S>
520__aicore__ inline void GemmExecMn(const LocalTensor<T>& l0c, const LocalTensor<U>& src0,520__aicore__ inline void GemmExecMn(const LocalTensor<T>& l0c, const LocalTensor<U>& src0,
521- const LocalTensor<S>& src1, GemmTiling tilling, const int32_t initValue)521+ const LocalTensor<S>& src1, GemmTiling tiling, const int32_t initValue)
522{522{
523- uint32_t needL0Bsize = tilling.roundN * tilling.dtypeSize * tilling.c0Size * tilling.kTileBlock * 2;523+ uint32_t needL0Bsize = tiling.roundN * tiling.dtypeSize * tiling.c0Size * tiling.kTileBlock * 2;
524- uint32_t needL0Asize = tilling.roundM * tilling.dtypeSize * tilling.c0Size * tilling.kTileBlock * 2;524+ uint32_t needL0Asize = tiling.roundM * tiling.dtypeSize * tiling.c0Size * tiling.kTileBlock * 2;
525 if (needL0Asize > TOTAL_L0A_SIZE || needL0Bsize > TOTAL_L0B_SIZE) {525 if (needL0Asize > TOTAL_L0A_SIZE || needL0Bsize > TOTAL_L0B_SIZE) {
526- GemmExecMnNopingpong(l0c, src0, src1, tilling, initValue);526+ GemmExecMnNopingpong(l0c, src0, src1, tiling, initValue);
527 return;527 return;
528 }528 }
529- GemmExecMnPingPong(l0c, src0, src1, tilling, initValue);529+ GemmExecMnPingPong(l0c, src0, src1, tiling, initValue);
530}530}
531} // namespace AscendC531} // namespace AscendC
532#endif // ASCENDC_MODULE_OPERATOR_GEMM_BASE_IMPL_H532#endif // ASCENDC_MODULE_OPERATOR_GEMM_BASE_IMPL_H
@@ -40,33 +40,33 @@ __aicore__ inline GemmTiling GetGemmTiling(uint32_t m, uint32_t k, uint32_t n)
40 c0 = 16;40 c0 = 16;
41 dSize = 2;41 dSize = 2;
42 }42 }
43- GemmTiling tilling;43+ GemmTiling tiling;
44- tilling.c0Size = c0;44+ tiling.c0Size = c0;
45- tilling.dtypeSize = dSize;45+ tiling.dtypeSize = dSize;
46- tilling.mNum = m;46+ tiling.mNum = m;
47- tilling.nNum = n;47+ tiling.nNum = n;
48- tilling.kNum = k;48+ tiling.kNum = k;
49- tilling.roundM = DivCeil(m, tilling.blockSize) * tilling.blockSize; // blockSize = 16 * 1649+ tiling.roundM = DivCeil(m, tiling.blockSize) * tiling.blockSize; // blockSize = 16 * 16
50- tilling.roundN = DivCeil(n, tilling.blockSize) * tilling.blockSize;50+ tiling.roundN = DivCeil(n, tiling.blockSize) * tiling.blockSize;
51- tilling.roundK = DivCeil(k, tilling.c0Size) * tilling.c0Size; // c0Size = 16 || c0Size = 3251+ tiling.roundK = DivCeil(k, tiling.c0Size) * tiling.c0Size; // c0Size = 16 || c0Size = 32
52- uint32_t k0a = TOTAL_L0A_SIZE / 2 / (tilling.roundM * dSize);52+ uint32_t k0a = TOTAL_L0A_SIZE / 2 / (tiling.roundM * dSize);
53- uint32_t k0b = TOTAL_L0B_SIZE / 2 / (tilling.roundN * dSize);53+ uint32_t k0b = TOTAL_L0B_SIZE / 2 / (tiling.roundN * dSize);
54 uint32_t k0 = k0a > k0b ? k0b : k0a;54 uint32_t k0 = k0a > k0b ? k0b : k0a;
55 k0 = k0 > k ? k : k0;55 k0 = k0 > k ? k : k0;
56 56 
57- tilling.kTileBlock = k0 / tilling.c0Size;57+ tiling.kTileBlock = k0 / tiling.c0Size;
58- if (tilling.kTileBlock == 0) {58+ if (tiling.kTileBlock == 0) {
59- tilling.kTileBlock = 1;59+ tiling.kTileBlock = 1;
60 }60 }
61- tilling.loopMode = LoopMode::MODE_NM;61+ tiling.loopMode = LoopMode::MODE_NM;
62 62 
63- tilling.mBlockNum = DivCeil(m, tilling.blockSize);63+ tiling.mBlockNum = DivCeil(m, tiling.blockSize);
64- tilling.nBlockNum = DivCeil(n, tilling.blockSize);64+ tiling.nBlockNum = DivCeil(n, tiling.blockSize);
65- tilling.kBlockNum = DivCeil(k, tilling.c0Size);65+ tiling.kBlockNum = DivCeil(k, tiling.c0Size);
66 66 
67- CalculateGemmTiling(tilling);67+ CalculateGemmTiling(tiling);
68 68 
69- return tilling;69+ return tiling;
70}70}
71 71 
72/*72/*
@@ -78,20 +78,20 @@ __aicore__ inline GemmTiling GetGemmTiling(uint32_t m, uint32_t k, uint32_t n)
78 * @param [in] m Number of rows of src078 * @param [in] m Number of rows of src0
79 * @param [in] n Number of rows of src179 * @param [in] n Number of rows of src1
80 * @param [in] k Number of columns of src180 * @param [in] k Number of columns of src1
81- * @param [in] tilling.blockSize size of block81+ * @param [in] tiling.blockSize size of block
82- * @param [in] tilling.mNum args of m82+ * @param [in] tiling.mNum args of m
83- * @param [in] tilling.nNum args of n83+ * @param [in] tiling.nNum args of n
84- * @param [in] tilling.kNum args of k84+ * @param [in] tiling.kNum args of k
85- * @param [in] tilling.roundM/N/K Rounding parameter85+ * @param [in] tiling.roundM/N/K Rounding parameter
86- * @param [in] tilling.c0Size The byte length of a block86+ * @param [in] tiling.c0Size The byte length of a block
87- * @param [in] tilling.dtypeSize Byte length of the incoming data type87+ * @param [in] tiling.dtypeSize Byte length of the incoming data type
88- * @param [in] tilling.m/n/kBlockNum Number of blocks of m/n/k axis88+ * @param [in] tiling.m/n/kBlockNum Number of blocks of m/n/k axis
89- * @param [in] tilling.m/n/kIterNum Number of traversal dimensions89+ * @param [in] tiling.m/n/kIterNum Number of traversal dimensions
90- * @param [in] tilling.m/k/nTileBlock Number of M/N/K axis cutting blocks90+ * @param [in] tiling.m/k/nTileBlock Number of M/N/K axis cutting blocks
91- * @param [in] tilling.m/n/kHasTailNumber of tail blocks of M/K/N axis91+ * @param [in] tiling.m/n/kHasTailNumber of tail blocks of M/K/N axis
92- * @param [in] tilling.kHasTileEle Judge whether the tail block exists92+ * @param [in] tiling.kHasTileEle Judge whether the tail block exists
93- * @param [in] tilling.KtailEle K-axis tail block element93+ * @param [in] tiling.KtailEle K-axis tail block element
94- * @param [in] tilling.kThreadNum K-axis passes94+ * @param [in] tiling.kThreadNum K-axis passes
95 * @param [in] partialsum judge whether the calculation result is moved out95 * @param [in] partialsum judge whether the calculation result is moved out
96 * @param [in] initValue Initialization parameters96 * @param [in] initValue Initialization parameters
97 */97 */
@@ -99,11 +99,11 @@ template <typename T, typename U, typename S>
99[[deprecated("NOTICE: Gemm has been deprecated and will be removed in the next version. "99[[deprecated("NOTICE: Gemm has been deprecated and will be removed in the next version. "
100 "Please do not use it!")]]100 "Please do not use it!")]]
101__aicore__ inline __inout_pipe__(V) void Gemm(const LocalTensor<T>& dst, const LocalTensor<U>& src0,101__aicore__ inline __inout_pipe__(V) void Gemm(const LocalTensor<T>& dst, const LocalTensor<U>& src0,
102- const LocalTensor<S>& src1, const uint32_t m, const uint32_t k, const uint32_t n, GemmTiling tilling,102+ const LocalTensor<S>& src1, const uint32_t m, const uint32_t k, const uint32_t n, GemmTiling tiling,
103 bool partialsum, int32_t initValue)103 bool partialsum, int32_t initValue)
104{104{
105#if ASCENDC_CPU_DEBUG105#if ASCENDC_CPU_DEBUG
106- bool flag = CheckParams(dst, src0, src1, m, k, n, tilling);106+ bool flag = CheckParams(dst, src0, src1, m, k, n, tiling);
107 if (!flag) {107 if (!flag) {
108 return;108 return;
109 }109 }
@@ -132,10 +132,10 @@ __aicore__ inline __inout_pipe__(V) void Gemm(const LocalTensor<T>& dst, const L
132#endif132#endif
133 }133 }
134 134 
135- if (tilling.loopMode == LoopMode::MODE_NM) {135+ if (tiling.loopMode == LoopMode::MODE_NM) {
136- GemmExecNm(l0c, src0, src1, tilling, initValue);136+ GemmExecNm(l0c, src0, src1, tiling, initValue);
137- } else if (tilling.loopMode == LoopMode::MODE_MN) {137+ } else if (tiling.loopMode == LoopMode::MODE_MN) {
138- GemmExecMn(l0c, src0, src1, tilling, initValue);138+ GemmExecMn(l0c, src0, src1, tiling, initValue);
139 } else {139 } else {
140 // other mode are not supported140 // other mode are not supported
141 }141 }
@@ -143,7 +143,7 @@ __aicore__ inline __inout_pipe__(V) void Gemm(const LocalTensor<T>& dst, const L
143#if (__NPU_ARCH__ == 1001) || (__NPU_ARCH__ == 2002)143#if (__NPU_ARCH__ == 1001) || (__NPU_ARCH__ == 2002)
144 if (dstScope == Hardware::UB) {144 if (dstScope == Hardware::UB) {
145 pipe_barrier(PIPE_ALL);145 pipe_barrier(PIPE_ALL);
146- dataCopyParams.blockLen = tilling.roundM * tilling.roundN * sizeof(PrimT<T>) / 1024;146+ dataCopyParams.blockLen = tiling.roundM * tiling.roundN * sizeof(PrimT<T>) / 1024;
147 DataCopy(dst, l0c, dataCopyParams, enhancedParams);147 DataCopy(dst, l0c, dataCopyParams, enhancedParams);
148 }148 }
149#endif149#endif
@@ -42,26 +42,26 @@ template <typename T> __aicore__ inline GemmTiling GetGemmTiling(uint32_t m, uin
42 * @param [in] m Number of rows of src042 * @param [in] m Number of rows of src0
43 * @param [in] n Number of rows of src143 * @param [in] n Number of rows of src1
44 * @param [in] k Number of columns of src144 * @param [in] k Number of columns of src1
45- * @param [in] tilling.blockSize size of block45+ * @param [in] tiling.blockSize size of block
46- * @param [in] tilling.mNum args of m46+ * @param [in] tiling.mNum args of m
47- * @param [in] tilling.nNum args of n47+ * @param [in] tiling.nNum args of n
48- * @param [in] tilling.kNum args of k48+ * @param [in] tiling.kNum args of k
49- * @param [in] tilling.roundM/N/K Rounding parameter49+ * @param [in] tiling.roundM/N/K Rounding parameter
50- * @param [in] tilling.c0Size The byte length of a block50+ * @param [in] tiling.c0Size The byte length of a block
51- * @param [in] tilling.dtypeSize Byte length of the incoming data type51+ * @param [in] tiling.dtypeSize Byte length of the incoming data type
52- * @param [in] tilling.m/n/kBlockNum Number of blocks of m/n/k axis52+ * @param [in] tiling.m/n/kBlockNum Number of blocks of m/n/k axis
53- * @param [in] tilling.m/n/kIterNum Number of traversal dimensions53+ * @param [in] tiling.m/n/kIterNum Number of traversal dimensions
54- * @param [in] tilling.m/k/nTileBlock Number of M/N/K axis cutting blocks54+ * @param [in] tiling.m/k/nTileBlock Number of M/N/K axis cutting blocks
55- * @param [in] tilling.m/n/kHasTailNumber of tail blocks of M/K/N axis55+ * @param [in] tiling.m/n/kHasTailNumber of tail blocks of M/K/N axis
56- * @param [in] tilling.kHasTileEle Judge whether the tail block exists56+ * @param [in] tiling.kHasTileEle Judge whether the tail block exists
57- * @param [in] tilling.KtailEle K-axis tail block element57+ * @param [in] tiling.KtailEle K-axis tail block element
58- * @param [in] tilling.kThreadNum K-axis passes58+ * @param [in] tiling.kThreadNum K-axis passes
59 * @param [in] partialsum judge whether the calculation result is moved out59 * @param [in] partialsum judge whether the calculation result is moved out
60 * @param [in] initValue Initialization parameters60 * @param [in] initValue Initialization parameters
61 */61 */
62template <typename T, typename U, typename S>62template <typename T, typename U, typename S>
63__aicore__ inline __inout_pipe__(V) void Gemm(const LocalTensor<T>& dst, const LocalTensor<U>& src0,63__aicore__ inline __inout_pipe__(V) void Gemm(const LocalTensor<T>& dst, const LocalTensor<U>& src0,
64- const LocalTensor<S>& src1, const uint32_t m, const uint32_t k, const uint32_t n, GemmTiling tilling,64+ const LocalTensor<S>& src1, const uint32_t m, const uint32_t k, const uint32_t n, GemmTiling tiling,
65 bool partialsum = true, int32_t initValue = 0);65 bool partialsum = true, int32_t initValue = 0);
66} // namespace AscendC66} // namespace AscendC
67 67 
@@ -59,9 +59,9 @@ extern "C" __global__ __aicore__ void main_gemm_test(__gm__ half* __restrict__ i
59 copy_gm_to_cbuf((__cbuf__ half*)input0.GetPhyAddr(), input0Gm, 0, 1, roundm * roundk * 2 / 32, 0, 0, PAD_NONE);59 copy_gm_to_cbuf((__cbuf__ half*)input0.GetPhyAddr(), input0Gm, 0, 1, roundm * roundk * 2 / 32, 0, 0, PAD_NONE);
60 copy_gm_to_cbuf((__cbuf__ half*)input1.GetPhyAddr(), input1Gm, 0, 1, roundk * roundn * 2 / 32, 0, 0, PAD_NONE);60 copy_gm_to_cbuf((__cbuf__ half*)input1.GetPhyAddr(), input1Gm, 0, 1, roundk * roundn * 2 / 32, 0, 0, PAD_NONE);
61 pipe_barrier(PIPE_ALL);61 pipe_barrier(PIPE_ALL);
62- GemmTiling tilling = GetGemmTiling<half>(m, k, n);62+ GemmTiling tiling = GetGemmTiling<half>(m, k, n);
63- tilling.loopMode = mode;63+ tiling.loopMode = mode;
64- Gemm(output, input0, input1, m, k, n, tilling, false, initValue);64+ Gemm(output, input0, input1, m, k, n, tiling, false, initValue);
65 65 
66 pipe_barrier(PIPE_ALL);66 pipe_barrier(PIPE_ALL);
67 copy_matrix_cc_to_ubuf((__ubuf__ float*)ublocal.GetPhyAddr(), (__cc__ float*)output.GetPhyAddr(), 0, 1,67 copy_matrix_cc_to_ubuf((__ubuf__ float*)ublocal.GetPhyAddr(), (__cc__ float*)output.GetPhyAddr(), 0, 1,
@@ -14,16 +14,19 @@
14#include "kernel_operator_gemm_intf.h"14#include "kernel_operator_gemm_intf.h"
15#endif15#endif
16 16 
17-// __aicore__ inline __inout_pipe__(V) void Gemm(const LocalTensor<T>& dst, const LocalTensor<U>& src0, const LocalTensor<S>& src1, const uint32_t m, const uint32_t k, const uint32_t n, GemmTiling tilling, bool partialsum = true, int32_t initValue = 0);17+// __aicore__ inline __inout_pipe__(V) void Gemm(const LocalTensor<T>& dst, const LocalTensor<U>& src0, const
18-extern "C" __global__ __aicore__ void KernelTestGemm1() {18+// LocalTensor<S>& src1, const uint32_t m, const uint32_t k, const uint32_t n, GemmTiling tiling, bool partialsum =
19+// true, int32_t initValue = 0);
20+extern "C" __global__ __aicore__ void KernelTestGemm1()
21+{
19 AscendC::LocalTensor<float> dst;22 AscendC::LocalTensor<float> dst;
20 AscendC::LocalTensor<half> src0;23 AscendC::LocalTensor<half> src0;
21 AscendC::LocalTensor<half> src1;24 AscendC::LocalTensor<half> src1;
22 uint32_t m = 0;25 uint32_t m = 0;
23 uint32_t k = 0;26 uint32_t k = 0;
24 uint32_t n = 0;27 uint32_t n = 0;
25- AscendC::GemmTiling tilling;28+ AscendC::GemmTiling tiling;
26- bool partialsum = true ;29+ bool partialsum = true;
27 int32_t initValue = 0;30 int32_t initValue = 0;
28- AscendC::Gemm(dst, src0, src1, m, k, n, tilling, true, 0);31+ AscendC::Gemm(dst, src0, src1, m, k, n, tiling, true, 0);
29}32}