已合并
add --cce-ftz description for docs #5454
yhkz9211创建于 9 天前
add --cce-ftz description for docs #5454
已合并
共 55 个文件变更+556-149
| @@ -117,6 +117,12 @@ GeGLU是采用GELU作为激活函数的GLU变体。具体计算公式如下: | |||
| 117 | - 当前仅支持ND格式的输入,不支持其他格式。 | 117 | - 当前仅支持ND格式的输入,不支持其他格式。 |
| 118 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 | 118 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 |
| 119 | 119 | ||
| 120 | +<!-- npu="950" id9 --> | ||
| 121 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 122 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 123 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 124 | +<!-- end id9 --> | ||
| 125 | + | ||
| 120 | ## 调用示例 | 126 | ## 调用示例 |
| 121 | 127 | ||
| 122 | ``` | 128 | ``` |
| @@ -90,6 +90,12 @@ | |||
| 90 | - 当前仅支持ND格式的输入,不支持其他格式。 | 90 | - 当前仅支持ND格式的输入,不支持其他格式。 |
| 91 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 | 91 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 |
| 92 | 92 | ||
| 93 | +<!-- npu="950" id10 --> | ||
| 94 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 95 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 96 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 97 | +<!-- end id10 --> | ||
| 98 | + | ||
| 93 | ## 调用示例 | 99 | ## 调用示例 |
| 94 | 100 | ||
| 95 | ``` | 101 | ``` |
| @@ -86,6 +86,12 @@ | |||
| 86 | - 当前仅支持ND格式的输入,不支持其他格式。 | 86 | - 当前仅支持ND格式的输入,不支持其他格式。 |
| 87 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 | 87 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 |
| 88 | 88 | ||
| 89 | +<!-- npu="950" id9 --> | ||
| 90 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 91 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 92 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 93 | +<!-- end id9 --> | ||
| 94 | + | ||
| 89 | ## 调用示例 | 95 | ## 调用示例 |
| 90 | 96 | ||
| 91 | ``` | 97 | ``` |
| @@ -83,6 +83,12 @@ | |||
| 83 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 | 83 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 |
| 84 | - 仅支持输入shape为ND格式。 | 84 | - 仅支持输入shape为ND格式。 |
| 85 | 85 | ||
| 86 | +<!-- npu="950" id10 --> | ||
| 87 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 88 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 89 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 90 | +<!-- end id10 --> | ||
| 91 | + | ||
| 86 | ## 调用示例 | 92 | ## 调用示例 |
| 87 | 93 | ||
| 88 | ``` | 94 | ``` |
| @@ -118,6 +118,12 @@ struct SoftMaxShapeInfo { | |||
| 118 | - 当参数softmaxShapeInfo中srcM != oriSrcM或者srcK != oriSrcK时,开发者需要对GM上的原始输入\(oriSrcM, oriSrcK\)在M或K方向补齐数据到\(srcM, srcK\),补齐的数据会参与部分运算,在输入输出复用的场景下,API的计算结果会覆盖srcTensor中补齐的原始数据,在输入输出不复用的场景下,API的计算结果会覆盖dstTensor中对应srcTensor补齐位置的数据。 | 118 | - 当参数softmaxShapeInfo中srcM != oriSrcM或者srcK != oriSrcK时,开发者需要对GM上的原始输入\(oriSrcM, oriSrcK\)在M或K方向补齐数据到\(srcM, srcK\),补齐的数据会参与部分运算,在输入输出复用的场景下,API的计算结果会覆盖srcTensor中补齐的原始数据,在输入输出不复用的场景下,API的计算结果会覆盖dstTensor中对应srcTensor补齐位置的数据。 |
| 119 | <!-- end id7 --> | 119 | <!-- end id7 --> |
| 120 | 120 | ||
| 121 | +<!-- npu="950" id8 --> | ||
| 122 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 123 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 124 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 125 | +<!-- end id8 --> | ||
| 126 | + | ||
| 121 | ## 调用示例 | 127 | ## 调用示例 |
| 122 | 128 | ||
| 123 | ``` | 129 | ``` |
| @@ -106,6 +106,12 @@ | |||
| 106 | - **不支持源操作数与目的操作数地址重叠。** | 106 | - **不支持源操作数与目的操作数地址重叠。** |
| 107 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 | 107 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 |
| 108 | 108 | ||
| 109 | +<!-- npu="950" id9 --> | ||
| 110 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 111 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 112 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 113 | +<!-- end id9 --> | ||
| 114 | + | ||
| 109 | ## 调用示例 | 115 | ## 调用示例 |
| 110 | 116 | ||
| 111 | ``` | 117 | ``` |
| @@ -71,6 +71,12 @@ __aicore__ inline void Silu(const LocalTensor<T>& dstLocal, const LocalTensor<T> | |||
| 71 | - **不支持源操作数与目的操作数地址重叠。** | 71 | - **不支持源操作数与目的操作数地址重叠。** |
| 72 | - 当前仅支持ND格式的输入,不支持其他格式。 | 72 | - 当前仅支持ND格式的输入,不支持其他格式。 |
| 73 | 73 | ||
| 74 | +<!-- npu="950" id9 --> | ||
| 75 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 76 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 77 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 78 | +<!-- end id9 --> | ||
| 79 | + | ||
| 74 | ## 调用示例 | 80 | ## 调用示例 |
| 75 | 81 | ||
| 76 | ``` | 82 | ``` |
| @@ -156,6 +156,12 @@ struct SoftMaxShapeInfo { | |||
| 156 | 156 | ||
| 157 | <!-- @ref: asc-devkit/res/docs/zh/api/SIMD-API/adv_api/activation_functions/SoftMax_interface/SimpleSoftMax_res.md#id2 --> | 157 | <!-- @ref: asc-devkit/res/docs/zh/api/SIMD-API/adv_api/activation_functions/SoftMax_interface/SimpleSoftMax_res.md#id2 --> |
| 158 | 158 | ||
| 159 | +<!-- npu="950" id15 --> | ||
| 160 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 161 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 162 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 163 | +<!-- end id15 --> | ||
| 164 | + | ||
| 159 | ## 调用示例 | 165 | ## 调用示例 |
| 160 | 166 | ||
| 161 | ``` | 167 | ``` |
| @@ -197,6 +197,12 @@ struct SoftMaxShapeInfo { | |||
| 197 | 197 | ||
| 198 | <!-- @ref: asc-devkit/res/docs/zh/api/SIMD-API/adv_api/activation_functions/SoftMax_interface/SoftMax_res.md#id2 --> | 198 | <!-- @ref: asc-devkit/res/docs/zh/api/SIMD-API/adv_api/activation_functions/SoftMax_interface/SoftMax_res.md#id2 --> |
| 199 | 199 | ||
| 200 | +<!-- npu="950" id19 --> | ||
| 201 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 202 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 203 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 204 | +<!-- end id19 --> | ||
| 205 | + | ||
| 200 | ## 调用示例 | 206 | ## 调用示例 |
| 201 | 207 | ||
| 202 | ``` | 208 | ``` |
| @@ -143,6 +143,12 @@ struct SoftMaxShapeInfo { | |||
| 143 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 | 143 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 |
| 144 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 | 144 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 |
| 145 | 145 | ||
| 146 | +<!-- npu="950" id9 --> | ||
| 147 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 148 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 149 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 150 | +<!-- end id9 --> | ||
| 151 | + | ||
| 146 | ## 调用示例 | 152 | ## 调用示例 |
| 147 | 153 | ||
| 148 | 本样例输入src的Shape大小为\[80,144\],输出Shape大小dst=\[80,144\],输入inExpSumTensor=\[80,16\],输入inMaxTensor=\[80,16\],输出expMaxTensor=\[80,16\],数据类型均为half,update为false。 | 154 | 本样例输入src的Shape大小为\[80,144\],输出Shape大小dst=\[80,144\],输入inExpSumTensor=\[80,16\],输入inMaxTensor=\[80,16\],输出expMaxTensor=\[80,16\],数据类型均为half,update为false。 |
| @@ -245,6 +245,12 @@ struct SoftMaxShapeInfo { | |||
| 245 | 245 | ||
| 246 | <!-- @ref: asc-devkit/res/docs/zh/api/SIMD-API/adv_api/activation_functions/SoftMax_interface/SoftmaxFlashV2_res.md#id2 --> | 246 | <!-- @ref: asc-devkit/res/docs/zh/api/SIMD-API/adv_api/activation_functions/SoftMax_interface/SoftmaxFlashV2_res.md#id2 --> |
| 247 | 247 | ||
| 248 | +<!-- npu="950" id24 --> | ||
| 249 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 250 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 251 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 252 | +<!-- end id24 --> | ||
| 253 | + | ||
| 248 | ## 调用示例 | 254 | ## 调用示例 |
| 249 | 255 | ||
| 250 | - srcK对齐 | 256 | - srcK对齐 |
| @@ -161,6 +161,12 @@ struct SoftMaxParams { | |||
| 161 | - meanTensor、expSumTensor、maxTensor、expMaxTensor、inMeanTensor、inExpSumTensor、inMaxTensor的Tensor空间,last轴长度必须是32字节。 | 161 | - meanTensor、expSumTensor、maxTensor、expMaxTensor、inMeanTensor、inExpSumTensor、inMaxTensor的Tensor空间,last轴长度必须是32字节。 |
| 162 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 | 162 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 |
| 163 | 163 | ||
| 164 | +<!-- npu="950" id7 --> | ||
| 165 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 166 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 167 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 168 | +<!-- end id7 --> | ||
| 169 | + | ||
| 164 | ## 调用示例 | 170 | ## 调用示例 |
| 165 | 171 | ||
| 166 | 本样例中输入srcTensor和输出dstTensor的shape大小为\[8, 1024\],输入inMeanTensor、inExpSumTensor、inMaxTensor的shape大小为\[8, 8\],数据类型为float;输出expMaxTensor的shape大小为\[8, 16\],数据类型为half;输入和输出的数据排布格式为ND,srcTensor和dstTensor空间不复用,模板参数isUpdate为true。 | 172 | 本样例中输入srcTensor和输出dstTensor的shape大小为\[8, 1024\],输入inMeanTensor、inExpSumTensor、inMaxTensor的shape大小为\[8, 8\],数据类型为float;输出expMaxTensor的shape大小为\[8, 16\],数据类型为half;输入和输出的数据排布格式为ND,srcTensor和dstTensor空间不复用,模板参数isUpdate为true。 |
| @@ -108,6 +108,12 @@ SwiGLU是采用Swish作为激活函数的GLU变体。具体计算公式如下: | |||
| 108 | - 当前仅支持ND格式的输入,不支持其他格式。 | 108 | - 当前仅支持ND格式的输入,不支持其他格式。 |
| 109 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 | 109 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 |
| 110 | 110 | ||
| 111 | +<!-- npu="950" id9 --> | ||
| 112 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 113 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 114 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 115 | +<!-- end id9 --> | ||
| 116 | + | ||
| 111 | ## 调用示例 | 117 | ## 调用示例 |
| 112 | 118 | ||
| 113 | ``` | 119 | ``` |
| @@ -66,6 +66,12 @@ __aicore__ inline void Swish(const LocalTensor<T>& dstLocal, const LocalTensor<T | |||
| 66 | - **不支持源操作数与目的操作数地址重叠。** | 66 | - **不支持源操作数与目的操作数地址重叠。** |
| 67 | - 当前仅支持ND格式的输入,不支持其他格式。 | 67 | - 当前仅支持ND格式的输入,不支持其他格式。 |
| 68 | 68 | ||
| 69 | +<!-- npu="950" id8 --> | ||
| 70 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 71 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 72 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 73 | +<!-- end id8 --> | ||
| 74 | + | ||
| 69 | ## 调用示例 | 75 | ## 调用示例 |
| 70 | 76 | ||
| 71 | ``` | 77 | ``` |
| @@ -105,6 +105,12 @@ | |||
| 105 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 | 105 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 |
| 106 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 | 106 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 |
| 107 | 107 | ||
| 108 | +<!-- npu="950" id9 --> | ||
| 109 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 110 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 111 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 112 | +<!-- end id9 --> | ||
| 113 | + | ||
| 108 | ## 调用示例 | 114 | ## 调用示例 |
| 109 | 115 | ||
| 110 | ``` | 116 | ``` |
| @@ -105,6 +105,12 @@ | |||
| 105 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 | 105 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 |
| 106 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 | 106 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 |
| 107 | 107 | ||
| 108 | +<!-- npu="950" id9 --> | ||
| 109 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 110 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 111 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 112 | +<!-- end id9 --> | ||
| 113 | + | ||
| 108 | ## 调用示例 | 114 | ## 调用示例 |
| 109 | 115 | ||
| 110 | ``` | 116 | ``` |
| @@ -116,6 +116,12 @@ struct AtanConfig { | |||
| 116 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 | 116 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 |
| 117 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 | 117 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 |
| 118 | 118 | ||
| 119 | +<!-- npu="950" id10 --> | ||
| 120 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 121 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 122 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 123 | +<!-- end id10 --> | ||
| 124 | + | ||
| 119 | ## 调用示例 | 125 | ## 调用示例 |
| 120 | 126 | ||
| 121 | ``` | 127 | ``` |
| @@ -105,6 +105,12 @@ | |||
| 105 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 | 105 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 |
| 106 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 | 106 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 |
| 107 | 107 | ||
| 108 | +<!-- npu="950" id9 --> | ||
| 109 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 110 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 111 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 112 | +<!-- end id9 --> | ||
| 113 | + | ||
| 108 | ## 调用示例 | 114 | ## 调用示例 |
| 109 | 115 | ||
| 110 | ``` | 116 | ``` |
| @@ -82,6 +82,12 @@ | |||
| 82 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 | 82 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 |
| 83 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 | 83 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 |
| 84 | 84 | ||
| 85 | +<!-- npu="950" id7 --> | ||
| 86 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 87 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
吴 | |||
| 88 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 89 | +<!-- end id7 --> | ||
| 90 | + | ||
| 85 | ## 调用示例 | 91 | ## 调用示例 |
| 86 | 92 | ||
| 87 | 完整的调用样例请参考[更多样例](../more_examples.md)。 | 93 | 完整的调用样例请参考[更多样例](../more_examples.md)。 |
| @@ -116,6 +116,12 @@ struct ErfConfig { | |||
| 116 | 116 | ||
| 117 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 | 117 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 |
| 118 | 118 | ||
| 119 | +<!-- npu="950" id10 --> | ||
| 120 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 121 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 122 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 123 | +<!-- end id10 --> | ||
| 124 | + | ||
| 119 | ## 调用示例 | 125 | ## 调用示例 |
| 120 | 126 | ||
| 121 | 完整的调用样例请参考[Erf样例](../../../../../../../examples/01_simd_cpp_api/04_advanced_api/10_math/erf)。 | 127 | 完整的调用样例请参考[Erf样例](../../../../../../../examples/01_simd_cpp_api/04_advanced_api/10_math/erf)。 |
| @@ -115,6 +115,12 @@ S\(z\) = \(\(\(\(z + S1\) \* z + S2\) \* z + S3\) \* z + S4\) \* z + S5是关于 | |||
| 115 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 | 115 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 |
| 116 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 | 116 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 |
| 117 | 117 | ||
| 118 | +<!-- npu="950" id9 --> | ||
| 119 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 120 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 121 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 122 | +<!-- end id9 --> | ||
| 123 | + | ||
| 118 | ## 调用示例 | 124 | ## 调用示例 |
| 119 | 125 | ||
| 120 | ``` | 126 | ``` |
| @@ -95,6 +95,12 @@ | |||
| 95 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 | 95 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 |
| 96 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 | 96 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 |
| 97 | 97 | ||
| 98 | +<!-- npu="950" id7 --> | ||
| 99 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 100 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 101 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 102 | +<!-- end id7 --> | ||
| 103 | + | ||
| 98 | ## 调用示例 | 104 | ## 调用示例 |
| 99 | 105 | ||
| 100 | ``` | 106 | ``` |
| @@ -125,6 +125,12 @@ struct FmodConfig { | |||
| 125 | <!-- end id10 --> | 125 | <!-- end id10 --> |
| 126 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 | 126 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 |
| 127 | 127 | ||
| 128 | +<!-- npu="950" id11 --> | ||
| 129 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 130 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 131 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 132 | +<!-- end id11 --> | ||
| 133 | + | ||
| 128 | ## 调用示例 | 134 | ## 调用示例 |
| 129 | 135 | ||
| 130 | 完整的调用样例请参考[fmod算子样例](../../../../../../../examples/01_simd_cpp_api/04_advanced_api/10_math/fmod)。 | 136 | 完整的调用样例请参考[fmod算子样例](../../../../../../../examples/01_simd_cpp_api/04_advanced_api/10_math/fmod)。 |
| @@ -84,6 +84,12 @@ | |||
| 84 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 | 84 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 |
| 85 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 | 85 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 |
| 86 | 86 | ||
| 87 | +<!-- npu="950" id8 --> | ||
| 88 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 89 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 90 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 91 | +<!-- end id8 --> | ||
| 92 | + | ||
| 87 | ## 调用示例 | 93 | ## 调用示例 |
| 88 | 94 | ||
| 89 | ``` | 95 | ``` |
| @@ -143,6 +143,12 @@ | |||
| 143 | - **不支持源操作数与目的操作数地址重叠。** | 143 | - **不支持源操作数与目的操作数地址重叠。** |
| 144 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 | 144 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 |
| 145 | 145 | ||
| 146 | +<!-- npu="950" id9 --> | ||
| 147 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 148 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 149 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 150 | +<!-- end id9 --> | ||
| 151 | + | ||
| 146 | ## 调用示例 | 152 | ## 调用示例 |
| 147 | 153 | ||
| 148 | 完整的调用样例可参考[Log样例](../../../../../../../examples/01_simd_cpp_api/04_advanced_api/10_math/log)。 | 154 | 完整的调用样例可参考[Log样例](../../../../../../../examples/01_simd_cpp_api/04_advanced_api/10_math/log)。 |
| @@ -192,6 +192,12 @@ struct PowerConfig { | |||
| 192 | Atlas 推理系列产品AI Core,支持的数据类型为:half、float、int32\_t。 | 192 | Atlas 推理系列产品AI Core,支持的数据类型为:half、float、int32\_t。 |
| 193 | <!-- end id12 --> | 193 | <!-- end id12 --> |
| 194 | 194 | ||
| 195 | +<!-- npu="950" id13 --> | ||
| 196 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 197 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 198 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 199 | +<!-- end id13 --> | ||
| 200 | + | ||
| 195 | ## 调用示例 | 201 | ## 调用示例 |
| 196 | 202 | ||
| 197 | 完整的调用样例请参考[Power样例](../../../../../../../examples/01_simd_cpp_api/04_advanced_api/10_math/power)。 | 203 | 完整的调用样例请参考[Power样例](../../../../../../../examples/01_simd_cpp_api/04_advanced_api/10_math/power)。 |
| @@ -105,6 +105,12 @@ | |||
| 105 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 | 105 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 |
| 106 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 | 106 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 |
| 107 | 107 | ||
| 108 | +<!-- npu="950" id9 --> | ||
| 109 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 110 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 111 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 112 | +<!-- end id9 --> | ||
| 113 | + | ||
| 108 | ## 调用示例 | 114 | ## 调用示例 |
| 109 | 115 | ||
| 110 | ``` | 116 | ``` |
| @@ -111,6 +111,12 @@ Tan\(x\)的泰勒展开式为: | |||
| 111 | 111 | ||
| 112 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 | 112 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 |
| 113 | 113 | ||
| 114 | +<!-- npu="950" id9 --> | ||
| 115 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 116 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 117 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 118 | +<!-- end id9 --> | ||
| 119 | + | ||
| 114 | ## 调用示例 | 120 | ## 调用示例 |
| 115 | 121 | ||
| 116 | ``` | 122 | ``` |
| @@ -116,6 +116,12 @@ struct TanhConfig { | |||
| 116 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 | 116 | - 不支持sharedTmpBuffer与源操作数和目的操作数地址重叠。 |
| 117 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 | 117 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../../general_description_and_constraints.md#section796754519912)。 |
| 118 | 118 | ||
| 119 | +<!-- npu="950" id10 --> | ||
| 120 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 121 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 122 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 123 | +<!-- end id10 --> | ||
| 124 | + | ||
| 119 | ## 调用示例 | 125 | ## 调用示例 |
| 120 | 126 | ||
| 121 | ``` | 127 | ``` |
| @@ -89,6 +89,12 @@ BatchNorm是对于每一层的输入做规范化处理,使得每一层的分 | |||
| 89 | - 当前仅支持ND格式的输入,不支持其他格式。 | 89 | - 当前仅支持ND格式的输入,不支持其他格式。 |
| 90 | - 输入数据的S\*H必须满足32B对齐的要求。 | 90 | - 输入数据的S\*H必须满足32B对齐的要求。 |
| 91 | 91 | ||
| 92 | +<!-- npu="950" id7 --> | ||
| 93 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 94 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 95 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 96 | +<!-- end id7 --> | ||
| 97 | + | ||
| 92 | ## 调用示例 | 98 | ## 调用示例 |
| 93 | 99 | ||
| 94 | ``` | 100 | ``` |
| @@ -89,6 +89,12 @@ SubLayer\(X\)通常是指在DeepNorm模型中的一个子层(sub-layer), | |||
| 89 | - 仅支持输入shape为ND格式。 | 89 | - 仅支持输入shape为ND格式。 |
| 90 | - 输入数据不满足对齐要求时,开发者需要进行补齐,补齐的数据应设置为0,防止出现异常值从而影响网络计算。 | 90 | - 输入数据不满足对齐要求时,开发者需要进行补齐,补齐的数据应设置为0,防止出现异常值从而影响网络计算。 |
| 91 | 91 | ||
| 92 | +<!-- npu="950" id7 --> | ||
| 93 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 94 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 95 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 96 | +<!-- end id7 --> | ||
| 97 | + | ||
| 92 | ## 调用示例 | 98 | ## 调用示例 |
| 93 | 99 | ||
| 94 | ``` | 100 | ``` |
| @@ -91,6 +91,12 @@ | |||
| 91 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../general_description_and_constraints.md#section796754519912)。 | 91 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../general_description_and_constraints.md#section796754519912)。 |
| 92 | - 当前仅支持ND格式的输入,不支持其他格式。 | 92 | - 当前仅支持ND格式的输入,不支持其他格式。 |
| 93 | 93 | ||
| 94 | +<!-- npu="950" id7 --> | ||
| 95 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 96 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 97 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 98 | +<!-- end id7 --> | ||
| 99 | + | ||
| 94 | ## 调用示例 | 100 | ## 调用示例 |
| 95 | 101 | ||
| 96 | ``` | 102 | ``` |
| @@ -228,6 +228,11 @@ | |||
| 228 | <!-- end id12 --> | 228 | <!-- end id12 --> |
| 229 | 229 | ||
| 230 | 230 | ||
| 231 | +<!-- npu="950" id13 --> | ||
| 232 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 233 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 234 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 235 | +<!-- end id13 --> | ||
| 231 | 236 | ||
| 232 | ## 调用示例 | 237 | ## 调用示例 |
| 233 | 238 | ||
| @@ -119,6 +119,12 @@ struct LayerNormGradShapeInfo { | |||
| 119 | - 输入数据不满足对齐要求时,开发者需要进行补齐,补齐的数据应设置为0,防止出现异常值从而影响网络计算。 | 119 | - 输入数据不满足对齐要求时,开发者需要进行补齐,补齐的数据应设置为0,防止出现异常值从而影响网络计算。 |
| 120 | - 不支持对尾轴H轴的切分。 | 120 | - 不支持对尾轴H轴的切分。 |
| 121 | 121 | ||
| 122 | +<!-- npu="950" id7 --> | ||
| 123 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 124 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 125 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 126 | +<!-- end id7 --> | ||
| 127 | + | ||
| 122 | ## 调用示例 | 128 | ## 调用示例 |
| 123 | 129 | ||
| 124 | 本样例中,输入inputX和inputDy的shape为\[2, 32, 16\],inputVariance和inputMean的shape为\[2, 32\],inputGamma的shape为\[16\]。输出outputPdX和resForGamma的shape为\[2, 32, 16\]。数据排布均为ND格式,数据类型均为float,不复用源操作数的内存空间。 | 130 | 本样例中,输入inputX和inputDy的shape为\[2, 32, 16\],inputVariance和inputMean的shape为\[2, 32\],inputGamma的shape为\[16\]。输出outputPdX和resForGamma的shape为\[2, 32, 16\]。数据排布均为ND格式,数据类型均为float,不复用源操作数的内存空间。 |
| @@ -131,6 +131,12 @@ struct NormalizePara { | |||
| 131 | Atlas 推理系列产品AI Core,支持的数据类型为: half、float。 | 131 | Atlas 推理系列产品AI Core,支持的数据类型为: half、float。 |
| 132 | <!-- end id11 --> | 132 | <!-- end id11 --> |
| 133 | 133 | ||
| 134 | +<!-- npu="950" id12 --> | ||
| 135 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 136 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 137 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 138 | +<!-- end id12 --> | ||
| 139 | + | ||
| 134 | ## 调用示例 | 140 | ## 调用示例 |
| 135 | 141 | ||
| 136 | ``` | 142 | ``` |
| @@ -92,6 +92,12 @@ | |||
| 92 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../general_description_and_constraints.md#section796754519912)。 | 92 | - 操作数地址对齐要求请参见[通用地址对齐约束](../../general_description_and_constraints.md#section796754519912)。 |
| 93 | - 当srcLocal的原始shape中H轴非32字节对齐时,开发者需要对原始输入在H轴方向补齐数据到32字节对齐,API的计算结果会覆盖dstLocal中对应srcLocal补齐位置的数据。 | 93 | - 当srcLocal的原始shape中H轴非32字节对齐时,开发者需要对原始输入在H轴方向补齐数据到32字节对齐,API的计算结果会覆盖dstLocal中对应srcLocal补齐位置的数据。 |
| 94 | 94 | ||
| 95 | +<!-- npu="950" id9 --> | ||
| 96 | +- 针对Ascend 950PR/Ascend 950DT,接口内部计算对Subnormal的处理方式受编译选项`--cce-ftz`控制(默认值为`true`): | ||
| 97 | + - 配置为`false`时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 98 | + - 配置为`true`时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 99 | +<!-- end id9 --> | ||
| 100 | + | ||
| 95 | ## 调用示例 | 101 | ## 调用示例 |
| 96 | 102 | ||
| 97 | ``` | 103 | ``` |
| @@ -150,6 +150,11 @@ $dst_i = |src_i|$ | |||
| 150 | - tensor高维切分计算占用8KB UB。 | 150 | - tensor高维切分计算占用8KB UB。 |
| 151 | - tensor前n个数据连续计算不涉及8KB UB的占用。 | 151 | - tensor前n个数据连续计算不涉及8KB UB的占用。 |
| 152 | <!-- end id21 --> | 152 | <!-- end id21 --> |
| 153 | +<!-- npu="950" id29 --> | ||
| 154 | +- 针对Ascend 950PR/Ascend 950DT,仅complex32和complex64类型的接口内部计算涉及Subnormal,处理方式受编译选项--cce-ftz控制(默认值为true): | ||
| 155 | + - --cce-ftz=false时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 156 | + - --cce-ftz=true时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 157 | +<!-- end id29 --> | ||
| 153 | 158 | ||
| 154 | ## 调用示例<a name="section176061616102911"></a> | 159 | ## 调用示例<a name="section176061616102911"></a> |
| 155 | 160 | ||
| @@ -134,7 +134,7 @@ $dst_i = src0_i / src1_i$ | |||
| 134 | |---|---| | 134 | |---|---| |
| 135 | | T | 操作数数据类型。 | | 135 | | T | 操作数数据类型。 | |
| 136 | | isSetMask | 是否在接口内部设置mask。<br>• true,表示在接口内部设置mask。<br>• false,表示在接口外部设置mask,开发者需要使用[SetVectorMask](../mask_operations/SetVectorMask.md)接口设置mask值。这种模式下,接口入参中的mask值设置为占位符`MASK_PLACEHOLDER`,用于占位,无实际含义。 | | 136 | | isSetMask | 是否在接口内部设置mask。<br>• true,表示在接口内部设置mask。<br>• false,表示在接口外部设置mask,开发者需要使用[SetVectorMask](../mask_operations/SetVectorMask.md)接口设置mask值。这种模式下,接口入参中的mask值设置为占位符`MASK_PLACEHOLDER`,用于占位,无实际含义。 | |
| 137 | -| <!-- npu="950" id19 -->config | 该参数仅支持Ascend 950PR/Ascend 950DT。<br>用于配置精度计算模式,DivConfig类型,定义如下:<br>enum class DivAlgo {<br> INTRINSIC = 0,<br> DIFF_COMPENSATION,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_0ULP_FTZ_TRUE,<br> PRECISION_0ULP_FTZ_FALSE,<br> PRECISION_1ULP_FTZ_FALSE<br>};<br>struct DivConfig {<br> DivAlgo algo = DivAlgo::INTRINSIC;<br>};<br>通过DivConfig结构体的参数algo来配置精度计算模式。algo取值如下:<br>• DivAlgo::INTRINSIC、DivAlgo::PRECISION_1ULP_FTZ_TRUE,使用单指令计算得出结果,最大精度误差为1ulp。<br>• DivAlgo::DIFF_COMPENSATION、DivAlgo::PRECISION_0ULP_FTZ_TRUE,使用差值补偿算法得出结果,最大精度误差为0ulp。目前,该算法支持float数据类型。<br>• DivAlgo::PRECISION_0ULP_FTZ_FALSE,支持Subnormal数据计算,使用差值补偿算法得出结果,最大精度误差为0ulp。目前,该算法支持float数据类型。<br>• DivAlgo::PRECISION_1ULP_FTZ_FALSE,支持Subnormal数据计算,使用单指令计算得出结果,最大精度误差为1ulp。<br>该参数的默认值DEFAULT_DIV_CONFIG的取值如下:<br>constexpr DivConfig DEFAULT_DIV_CONFIG = { DivAlgo::INTRINSIC };<br>调用本原型时若不显式传入config参数,则默认使用DEFAULT_DIV_CONFIG,此时行为与不传入config参数的原型等价。<!-- end id19 --> | | 137 | +| <!-- npu="950" id19 -->config | 该参数仅支持Ascend 950PR/Ascend 950DT。<br>用于配置精度计算模式,DivConfig类型,定义如下:<br>enum class DivAlgo {<br> INTRINSIC = 0,<br> DIFF_COMPENSATION,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_0ULP_FTZ_TRUE,<br> PRECISION_0ULP_FTZ_FALSE,<br> PRECISION_1ULP_FTZ_FALSE<br>};<br>struct DivConfig {<br> DivAlgo algo = DivAlgo::INTRINSIC;<br>};<br>通过DivConfig结构体的参数algo来选择Div算法并配置Subnormal模式,详细说明请参考[关键特性说明](#div-key-features)。<br>algo的取值如下:<br>• DivAlgo::INTRINSIC:默认算法,最大精度误差为1ulp。对于half、float类型,Subnormal处理受编译选项--cce-ftz控制(默认值为true)。<br>• DivAlgo::PRECISION_1ULP_FTZ_TRUE:使用单指令计算,最大精度误差为1ulp。<br>• DivAlgo::DIFF_COMPENSATION:使用差值补偿算法,最大精度误差为0ulp。对于float数据类型,Subnormal处理受编译选项--cce-ftz控制(默认值为true)。<br>• DivAlgo::PRECISION_0ULP_FTZ_TRUE:使用差值补偿算法,最大精度误差为0ulp,采用FTZ模式。目前,该算法支持float数据类型。<br>• DivAlgo::PRECISION_0ULP_FTZ_FALSE:使用差值补偿算法,支持Subnormal数据计算,最大精度误差为0ulp。目前,该算法支持float数据类型。<br>• DivAlgo::PRECISION_1ULP_FTZ_FALSE:支持Subnormal数据计算,最大精度误差为1ulp。<br><br>该参数的默认值DEFAULT_DIV_CONFIG的取值如下:<br>constexpr DivConfig DEFAULT_DIV_CONFIG = { DivAlgo::INTRINSIC };<br>调用本原型时若不显式传入config参数,则默认使用DEFAULT_DIV_CONFIG,此时行为与不传入config参数的原型等价。<!-- end id19 --> | |
| 138 | 138 | ||
| 139 | **表2** 参数说明 | 139 | **表2** 参数说明 |
| 140 | 140 | ||
| @@ -205,6 +205,35 @@ $dst_i = src0_i / src1_i$ | |||
| 205 | - tensor前n个数据连续计算不涉及8KB UB的占用。 | 205 | - tensor前n个数据连续计算不涉及8KB UB的占用。 |
| 206 | <!-- end id32 --> | 206 | <!-- end id32 --> |
| 207 | 207 | ||
| 208 | +<!-- npu="950" id35 --> | ||
| 209 | +## 关键特性<a id="div-key-features"></a> | ||
| 210 | + | ||
| 211 | +针对Ascend 950PR/Ascend 950DT,有如下关键特性: | ||
| 212 | + | ||
| 213 | +### 最大精度误差 | ||
| 214 | + | ||
| 215 | +- DivAlgo::INTRINSIC、DivAlgo::PRECISION_1ULP_FTZ_TRUE和DivAlgo::PRECISION_1ULP_FTZ_FALSE的最大精度误差为1ulp。 | ||
| 216 | +- DivAlgo::DIFF_COMPENSATION、DivAlgo::PRECISION_0ULP_FTZ_TRUE和DivAlgo::PRECISION_0ULP_FTZ_FALSE的最大精度误差为0ulp。 | ||
| 217 | + | ||
| 218 | +### 配置Subnormal模式 | ||
| 219 | + | ||
| 220 | +FTZ(Flush-To-Zero):一种浮点运算模式,当结果为[Subnormal](../../data_structures/builtin_data_types.md#p7381131713310)时,将其直接清零(近似为0),而非保留其精确的微小数值。 | ||
| 221 | + | ||
| 222 | +#### 默认算法 | ||
| 223 | + | ||
| 224 | +DivAlgo::INTRINSIC为默认算法。--cce-ftz=false时保留Subnormal;--cce-ftz=true(默认值)时采用FTZ模式。 | ||
| 225 | + | ||
| 226 | +#### 显式指定的算法 | ||
| 227 | + | ||
| 228 | +- DivAlgo::DIFF_COMPENSATION支持float类型,Subnormal处理受--cce-ftz控制。 | ||
| 229 | +- 名称中包含FTZ_FALSE的算法始终保留Subnormal。 | ||
| 230 | +- 名称中包含FTZ_TRUE的算法始终采用FTZ模式。 | ||
| 231 | + | ||
| 232 | +#### 使用建议 | ||
| 233 | + | ||
| 234 | +在--cce-ftz=true(默认值)时,一般场景建议使用性能更优的DivAlgo::INTRINSIC或显式选择DivAlgo::PRECISION_1ULP_FTZ_TRUE、DivAlgo::PRECISION_0ULP_FTZ_TRUE;需要精确输出Subnormal时,使用DivAlgo::PRECISION_0ULP_FTZ_FALSE或DivAlgo::PRECISION_1ULP_FTZ_FALSE。 | ||
| 235 | +<!-- end id35 --> | ||
| 236 | + | ||
| 208 | ## 调用示例<a name="section642mcpsimp"></a> | 237 | ## 调用示例<a name="section642mcpsimp"></a> |
| 209 | 238 | ||
| 210 | - tensor高维切分计算样例-mask连续模式 | 239 | - tensor高维切分计算样例-mask连续模式 |
| @@ -239,7 +268,7 @@ $dst_i = src0_i / src1_i$ | |||
| 239 | // Div 0ulp. | 268 | // Div 0ulp. |
| 240 | static constexpr DivConfig config = { DivAlgo::DIFF_COMPENSATION }; | 269 | static constexpr DivConfig config = { DivAlgo::DIFF_COMPENSATION }; |
| 241 | Div<T, config>(dstLocalX, srcLocalX, srcLocalY, 512); | 270 | Div<T, config>(dstLocalX, srcLocalX, srcLocalY, 512); |
| 242 | - // Div Subnormal. | 271 | + // Div 0ulp精度及Subnormal模式。 |
| 243 | static constexpr DivConfig config2 = { DivAlgo::PRECISION_0ULP_FTZ_FALSE }; | 272 | static constexpr DivConfig config2 = { DivAlgo::PRECISION_0ULP_FTZ_FALSE }; |
| 244 | Div<T, config2>(dstLocalX, srcLocalX, srcLocalY, 512); | 273 | Div<T, config2>(dstLocalX, srcLocalX, srcLocalY, 512); |
| 245 | ``` | 274 | ``` |
| @@ -110,6 +110,9 @@ $dst_i = scalar \div src_i$ | |||
| 110 | - tensor高维切分计算占用8KB UB。 | 110 | - tensor高维切分计算占用8KB UB。 |
| 111 | - tensor前n个数据连续计算不涉及8KB UB的占用。 | 111 | - tensor前n个数据连续计算不涉及8KB UB的占用。 |
| 112 | - 针对Ascend 950PR/Ascend 950DT,tensor前n个数据计算API中的isSetMask参数不生效,保持默认值即可。 | 112 | - 针对Ascend 950PR/Ascend 950DT,tensor前n个数据计算API中的isSetMask参数不生效,保持默认值即可。 |
| 113 | +- 针对Ascend 950PR/Ascend 950DT,仅half和float类型的计算受Subnormal影响,其处理方式受编译选项--cce-ftz控制(默认值为true): | ||
| 114 | + - --cce-ftz=false时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 115 | + - --cce-ftz=true时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 113 | <!-- end id9 --> | 116 | <!-- end id9 --> |
| 114 | 117 | ||
| 115 | ## 调用示例<a name="section642mcpsimp"></a> | 118 | ## 调用示例<a name="section642mcpsimp"></a> |
| @@ -128,7 +128,7 @@ $dst_i = e^{src_i}$ | |||
| 128 | |---|---| | 128 | |---|---| |
| 129 | | T | 操作数数据类型。 | | 129 | | T | 操作数数据类型。 | |
| 130 | | isSetMask | 是否在接口内部设置mask。<br>• true,表示在接口内部设置mask。<br>• false,表示在接口外部设置mask,开发者需要使用[SetVectorMask](../mask_operations/SetVectorMask.md)接口设置mask值。这种模式下,接口入参中的mask值设置为占位符`MASK_PLACEHOLDER`,用于占位,无实际含义。 | | 130 | | isSetMask | 是否在接口内部设置mask。<br>• true,表示在接口内部设置mask。<br>• false,表示在接口外部设置mask,开发者需要使用[SetVectorMask](../mask_operations/SetVectorMask.md)接口设置mask值。这种模式下,接口入参中的mask值设置为占位符`MASK_PLACEHOLDER`,用于占位,无实际含义。 | |
| 131 | -| <!-- npu="950" id19 -->config | 该参数仅支持Ascend 950PR/Ascend 950DT。<br>用于配置Subnormal计算模式,ExpConfig类型,定义如下:<br>enum class ExpAlgo {<br> INTRINSIC = 0,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct ExpConfig {<br> ExpAlgo algo = ExpAlgo::INTRINSIC;<br>};<br>通过ExpConfig结构体的参数algo来配置Subnormal计算模式。algo取值如下:<br>• ExpAlgo::INTRINSIC、ExpAlgo::PRECISION_1ULP_FTZ_TRUE,使用单指令计算得出结果,所有Subnormal被近似为0。<br>• ExpAlgo::PRECISION_1ULP_FTZ_FALSE,支持Subnormal数据计算。<br>该参数的默认值DEFAULT_EXP_CONFIG的取值如下:<br>constexpr ExpConfig DEFAULT_EXP_CONFIG = { ExpAlgo::INTRINSIC };<br>调用本原型时若不显式传入config参数,则默认使用DEFAULT_EXP_CONFIG,此时行为与不传入config参数的原型等价。<!-- end id19 --> | | 131 | +| <!-- npu="950" id19 -->config | 该参数仅支持Ascend 950PR/Ascend 950DT。<br>用于配置精度计算模式,ExpConfig类型,定义如下:<br>enum class ExpAlgo {<br> INTRINSIC = 0,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct ExpConfig {<br> ExpAlgo algo = ExpAlgo::INTRINSIC;<br>};<br>通过ExpConfig结构体的参数algo来选择Exp算法并配置Subnormal模式,详细说明请参考[关键特性说明](#exp-key-features)。<br>algo的取值如下:<br>• ExpAlgo::INTRINSIC:默认算法,最大精度误差为1ulp。对于half、float类型,Subnormal处理受编译选项--cce-ftz控制(默认值为true)。<br>• ExpAlgo::PRECISION_1ULP_FTZ_TRUE:使用单指令计算,最大精度误差为1ulp。<br>• ExpAlgo::PRECISION_1ULP_FTZ_FALSE:通过软件仿真实现,支持Subnormal数据计算,最大精度误差为1ulp。<br><br>该参数的默认值DEFAULT_EXP_CONFIG的取值如下:<br>constexpr ExpConfig DEFAULT_EXP_CONFIG = { ExpAlgo::INTRINSIC };<br>调用本原型时若不显式传入config参数,则默认使用DEFAULT_EXP_CONFIG,此时行为与不传入config参数的原型等价。<!-- end id19 --> | |
| 132 | 132 | ||
| 133 | **表2** 参数说明 | 133 | **表2** 参数说明 |
| 134 | 134 | ||
| @@ -176,22 +176,30 @@ T支持的数据类型为:half、float。 | |||
| 176 | <!-- end id21 --> | 176 | <!-- end id21 --> |
| 177 | 177 | ||
| 178 | <!-- npu="950" id24 --> | 178 | <!-- npu="950" id24 --> |
| 179 | -## 关键特性<a name="section18972943153217"></a> | 179 | +## 关键特性<a id="exp-key-features"></a> |
| 180 | 180 | ||
| 181 | 针对Ascend 950PR/Ascend 950DT,有如下关键特性: | 181 | 针对Ascend 950PR/Ascend 950DT,有如下关键特性: |
| 182 | 182 | ||
| 183 | -**最大精度误差**: | 183 | +### 最大精度误差 |
| 184 | 184 | ||
| 185 | -- ExpAlgo::INTRINSIC、ExpAlgo::PRECISION\_1ULP\_FTZ\_TRUE,最大精度误差为1ulp。 | 185 | +ExpAlgo::INTRINSIC、ExpAlgo::PRECISION_1ULP_FTZ_TRUE和ExpAlgo::PRECISION_1ULP_FTZ_FALSE的最大精度误差均为1ulp。 |
| 186 | -- ExpAlgo::PRECISION\_1ULP\_FTZ\_FALSE,软仿实现,最大精度误差为1ulp。 | ||
| 187 | 186 | ||
| 188 | -**配置Subnormal模式**: | 187 | +### 配置Subnormal模式 |
| 189 | 188 | ||
| 190 | -FTZ(Flush To Zero):一种浮点运算模式,当结果为[Subnormal](../../data_structures/builtin_data_types.md#p7381131713310)时,将其直接清零(近似为0),而非保留其精确的微小数值。 | 189 | +FTZ(Flush-To-Zero):一种浮点运算模式,当结果为[Subnormal](../../data_structures/builtin_data_types.md#p7381131713310)时,将其直接清零(近似为0),而非保留其精确的微小数值。 |
| 191 | 190 | ||
| 192 | -只有将algo设置为ExpAlgo::PRECISION\_1ULP\_FTZ\_false时,Exp接口才会保留并正确输出Subnormal结果;其他模式下Subnormal均被FTZ。 | 191 | +#### 默认算法 |
| 193 | 192 | ||
| 194 | -由于Subnormal的计算行为是通过软件仿真算法实现,一般场景推荐使用性能更好的ExpAlgo::INTRINSIC、ExpAlgo::PRECISION\_1ULP\_FTZ\_TRUE;需要精确Subnormal输出的场景(如特定数据精度要求的算法、避免除零错误)使用ExpAlgo::PRECISION\_1ULP\_FTZ\_FALSE。 | 193 | +ExpAlgo::INTRINSIC为默认算法。--cce-ftz=false时保留Subnormal;--cce-ftz=true(默认值)时采用FTZ模式。 |
| 194 | + | ||
| 195 | +#### 显式指定的算法 | ||
| 196 | + | ||
| 197 | +- ExpAlgo::PRECISION_1ULP_FTZ_TRUE使用单指令计算,始终采用FTZ模式。 | ||
| 198 | +- ExpAlgo::PRECISION_1ULP_FTZ_FALSE通过软件仿真实现,支持Subnormal数据计算。 | ||
| 199 | + | ||
| 200 | +#### 使用建议 | ||
| 201 | + | ||
| 202 | +由于保留Subnormal的计算行为通过软件仿真实现,在--cce-ftz=true(默认值)时,一般场景建议使用默认的ExpAlgo::INTRINSIC或显式选择ExpAlgo::PRECISION_1ULP_FTZ_TRUE,以获得更好的性能;需要精确输出Subnormal时,使用ExpAlgo::PRECISION_1ULP_FTZ_FALSE。 | ||
| 195 | <!-- end id24 --> | 203 | <!-- end id24 --> |
| 196 | 204 | ||
| 197 | ## 调用示例<a name="section176061616102911"></a> | 205 | ## 调用示例<a name="section176061616102911"></a> |
| @@ -128,7 +128,7 @@ $dst_i = \ln(src_i)$ | |||
| 128 | |---|---| | 128 | |---|---| |
| 129 | | T | 操作数数据类型。 | | 129 | | T | 操作数数据类型。 | |
| 130 | | isSetMask | 是否在接口内部设置mask。<br>• true,表示在接口内部设置mask。<br>• false,表示在接口外部设置mask,开发者需要使用[SetVectorMask](../mask_operations/SetVectorMask.md)接口设置mask值。这种模式下,接口入参中的mask值设置为占位符`MASK_PLACEHOLDER`,用于占位,无实际含义。 | | 130 | | isSetMask | 是否在接口内部设置mask。<br>• true,表示在接口内部设置mask。<br>• false,表示在接口外部设置mask,开发者需要使用[SetVectorMask](../mask_operations/SetVectorMask.md)接口设置mask值。这种模式下,接口入参中的mask值设置为占位符`MASK_PLACEHOLDER`,用于占位,无实际含义。 | |
| 131 | -| <!-- npu="950" id19 -->config | 该参数仅支持Ascend 950PR/Ascend 950DT。<br>用于配置Subnormal计算模式,LnConfig类型,定义如下:<br>enum class LnAlgo {<br> INTRINSIC = 0,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct LnConfig {<br> LnAlgo algo = LnAlgo::INTRINSIC;<br>};<br>通过LnConfig结构体的参数algo来配置Subnormal计算模式。algo取值如下:<br>• LnAlgo::INTRINSIC、LnAlgo::PRECISION_1ULP_FTZ_TRUE,使用单指令计算得出结果,所有Subnormal被近似为0。<br>• LnAlgo::PRECISION_1ULP_FTZ_FALSE,支持Subnormal数据计算。<br>该参数的默认值DEFAULT_LN_CONFIG的取值如下:<br>constexpr LnConfig DEFAULT_LN_CONFIG = { LnAlgo::INTRINSIC };<br>调用本原型时若不显式传入config参数,则默认使用DEFAULT_LN_CONFIG,此时行为与不传入config参数的原型等价。<!-- end id19 --> | | 131 | +| <!-- npu="950" id19 -->config | 该参数仅支持Ascend 950PR/Ascend 950DT。<br>用于配置精度计算模式,LnConfig类型,定义如下:<br>enum class LnAlgo {<br> INTRINSIC = 0,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct LnConfig {<br> LnAlgo algo = LnAlgo::INTRINSIC;<br>};<br>通过LnConfig结构体的参数algo来选择Ln算法并配置Subnormal模式,详细说明请参考[关键特性说明](#ln-key-features)。<br>algo的取值如下:<br>• LnAlgo::INTRINSIC:默认算法,最大精度误差为1ulp。对于half、float类型,Subnormal处理受编译选项--cce-ftz控制(默认值为true)。<br>• LnAlgo::PRECISION_1ULP_FTZ_TRUE:使用单指令计算,最大精度误差为1ulp。<br>• LnAlgo::PRECISION_1ULP_FTZ_FALSE:通过软件仿真实现,支持Subnormal数据计算,最大精度误差为1ulp。<br><br>该参数的默认值DEFAULT_LN_CONFIG的取值如下:<br>constexpr LnConfig DEFAULT_LN_CONFIG = { LnAlgo::INTRINSIC };<br>调用本原型时若不显式传入config参数,则默认使用DEFAULT_LN_CONFIG,此时行为与不传入config参数的原型等价。<!-- end id19 --> | |
| 132 | 132 | ||
| 133 | **表2** 参数说明 | 133 | **表2** 参数说明 |
| 134 | 134 | ||
| @@ -178,22 +178,30 @@ T支持的数据类型为:half、float。 | |||
| 178 | <!-- end id21 --> | 178 | <!-- end id21 --> |
| 179 | 179 | ||
| 180 | <!-- npu="950" id24 --> | 180 | <!-- npu="950" id24 --> |
| 181 | -## 关键特性<a name="section18972943153217"></a> | 181 | +## 关键特性<a id="ln-key-features"></a> |
| 182 | 182 | ||
| 183 | 针对Ascend 950PR/Ascend 950DT,有如下关键特性: | 183 | 针对Ascend 950PR/Ascend 950DT,有如下关键特性: |
| 184 | 184 | ||
| 185 | -**最大精度误差**: | 185 | +### 最大精度误差 |
| 186 | 186 | ||
| 187 | -- LnAlgo::INTRINSIC、LnAlgo::PRECISION\_1ULP\_FTZ\_TRUE,最大精度误差为1ulp。 | 187 | +LnAlgo::INTRINSIC、LnAlgo::PRECISION_1ULP_FTZ_TRUE和LnAlgo::PRECISION_1ULP_FTZ_FALSE的最大精度误差均为1ulp。 |
| 188 | -- LnAlgo::PRECISION\_1ULP\_FTZ\_FALSE,软仿实现,最大精度误差为1ulp。 | ||
| 189 | 188 | ||
| 190 | -**配置Subnormal模式**: | 189 | +### 配置Subnormal模式 |
| 191 | 190 | ||
| 192 | -FTZ(Flush To Zero):一种浮点运算模式,当结果为[Subnormal](../../data_structures/builtin_data_types.md#p7381131713310)时,将其直接清零(近似为0),而非保留其精确的微小数值。 | 191 | +FTZ(Flush-To-Zero):一种浮点运算模式,当结果为[Subnormal](../../data_structures/builtin_data_types.md#p7381131713310)时,将其直接清零(近似为0),而非保留其精确的微小数值。 |
| 193 | 192 | ||
| 194 | -只有将algo设置为LnAlgo::PRECISION\_1ULP\_FTZ\_false时,Ln接口才会保留并正确输出Subnormal结果;其他模式下Subnormal均被FTZ。 | 193 | +#### 默认算法 |
| 195 | 194 | ||
| 196 | -由于Subnormal的计算行为是通过软件仿真算法实现,一般场景推荐使用性能更好的LnAlgo::INTRINSIC、LnAlgo::PRECISION\_1ULP\_FTZ\_TRUE;需要精确Subnormal输出的场景(如特定数据精度要求的算法、避免除零错误)使用LnAlgo::PRECISION\_1ULP\_FTZ\_FALSE。 | 195 | +LnAlgo::INTRINSIC为默认算法。--cce-ftz=false时保留Subnormal;--cce-ftz=true(默认值)时采用FTZ模式。 |
| 196 | + | ||
| 197 | +#### 显式指定的算法 | ||
| 198 | + | ||
| 199 | +- LnAlgo::PRECISION_1ULP_FTZ_TRUE使用单指令计算,始终采用FTZ模式。 | ||
| 200 | +- LnAlgo::PRECISION_1ULP_FTZ_FALSE通过软件仿真实现,支持Subnormal数据计算。 | ||
| 201 | + | ||
| 202 | +#### 使用建议 | ||
| 203 | + | ||
| 204 | +由于保留Subnormal的计算行为通过软件仿真实现,在--cce-ftz=true(默认值)时,一般场景建议使用默认的LnAlgo::INTRINSIC或显式选择LnAlgo::PRECISION_1ULP_FTZ_TRUE,以获得更好的性能;需要精确输出Subnormal时,使用LnAlgo::PRECISION_1ULP_FTZ_FALSE。 | ||
| 197 | <!-- end id24 --> | 205 | <!-- end id24 --> |
| 198 | 206 | ||
| 199 | ## 调用示例<a name="section176061616102911"></a> | 207 | ## 调用示例<a name="section176061616102911"></a> |
| @@ -128,7 +128,7 @@ $dst_i = \frac{1}{src_i}$ | |||
| 128 | |---|---| | 128 | |---|---| |
| 129 | | T | 操作数数据类型。 | | 129 | | T | 操作数数据类型。 | |
| 130 | | isSetMask | 是否在接口内部设置mask。<br>• true,表示在接口内部设置mask。<br>• false,表示在接口外部设置mask,开发者需要使用[SetVectorMask](../mask_operations/SetVectorMask.md)接口设置mask值。这种模式下,接口入参中的mask值设置为占位符`MASK_PLACEHOLDER`,用于占位,无实际含义。 | | 130 | | isSetMask | 是否在接口内部设置mask。<br>• true,表示在接口内部设置mask。<br>• false,表示在接口外部设置mask,开发者需要使用[SetVectorMask](../mask_operations/SetVectorMask.md)接口设置mask值。这种模式下,接口入参中的mask值设置为占位符`MASK_PLACEHOLDER`,用于占位,无实际含义。 | |
| 131 | -| <!-- npu="950" id19 -->config | 该参数仅支持Ascend 950PR/Ascend 950DT。<br>用于配置Subnormal计算模式,ReciprocalConfig类型,定义如下:<br>enum class ReciprocalAlgo {<br> INTRINSIC = 0,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct ReciprocalConfig {<br> ReciprocalAlgo algo = ReciprocalAlgo::INTRINSIC;<br>};<br>通过ReciprocalConfig结构体的参数algo来配置Subnormal计算模式。algo取值如下:<br>• ReciprocalAlgo::INTRINSIC、ReciprocalAlgo::PRECISION_1ULP_FTZ_TRUE,使用单指令计算得出结果,所有Subnormal被近似为0。<br>• ReciprocalAlgo::PRECISION_1ULP_FTZ_FALSE,支持Subnormal数据计算。<br>该参数的默认值DEFAULT_RECIPROCAL_CONFIG的取值如下:<br>constexpr ReciprocalConfig DEFAULT_RECIPROCAL_CONFIG = { ReciprocalAlgo::INTRINSIC };<br>调用本原型时若不显式传入config参数,则默认使用DEFAULT_RECIPROCAL_CONFIG,此时行为与不传入config参数的原型等价。<!-- end id19 --> | | 131 | +| <!-- npu="950" id19 -->config | 该参数仅支持Ascend 950PR/Ascend 950DT。<br>用于配置精度计算模式,ReciprocalConfig类型,定义如下:<br>enum class ReciprocalAlgo {<br> INTRINSIC = 0,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct ReciprocalConfig {<br> ReciprocalAlgo algo = ReciprocalAlgo::INTRINSIC;<br>};<br>通过ReciprocalConfig结构体的参数algo来选择Reciprocal算法并配置Subnormal模式,详细说明请参考[关键特性说明](#reciprocal-key-features)。<br>algo的取值如下:<br>• ReciprocalAlgo::INTRINSIC:默认算法,最大精度误差为1ulp。对于half、float类型,Subnormal处理受编译选项--cce-ftz控制(默认值为true)。<br>• ReciprocalAlgo::PRECISION_1ULP_FTZ_TRUE:使用单指令计算,最大精度误差为1ulp。<br>• ReciprocalAlgo::PRECISION_1ULP_FTZ_FALSE:通过软件仿真实现,支持Subnormal数据计算,最大精度误差为1ulp。<br><br>该参数的默认值DEFAULT_RECIPROCAL_CONFIG的取值如下:<br>constexpr ReciprocalConfig DEFAULT_RECIPROCAL_CONFIG = { ReciprocalAlgo::INTRINSIC };<br>调用本原型时若不显式传入config参数,则默认使用DEFAULT_RECIPROCAL_CONFIG,此时行为与不传入config参数的原型等价。<!-- end id19 --> | |
| 132 | 132 | ||
| 133 | **表2** 参数说明 | 133 | **表2** 参数说明 |
| 134 | 134 | ||
| @@ -201,6 +201,33 @@ $dst_i = \frac{1}{src_i}$ | |||
| 201 | - 如果src中的数值为0,可能会产生未知结果。 | 201 | - 如果src中的数值为0,可能会产生未知结果。 |
| 202 | - 使用Reciprocal时,half的算子结果对比误差不满足双千分之一的要求,float的算子结果对比误差不满足双万分之一的要求,如果需要高精度,建议使用[Div](Div.md)替代实现。 | 202 | - 使用Reciprocal时,half的算子结果对比误差不满足双千分之一的要求,float的算子结果对比误差不满足双万分之一的要求,如果需要高精度,建议使用[Div](Div.md)替代实现。 |
| 203 | 203 | ||
| 204 | +<!-- npu="950" id35 --> | ||
| 205 | +## 关键特性<a id="reciprocal-key-features"></a> | ||
| 206 | + | ||
| 207 | +针对Ascend 950PR/Ascend 950DT,有如下关键特性: | ||
| 208 | + | ||
| 209 | +### 最大精度误差 | ||
| 210 | + | ||
| 211 | +ReciprocalAlgo::INTRINSIC、ReciprocalAlgo::PRECISION_1ULP_FTZ_TRUE和ReciprocalAlgo::PRECISION_1ULP_FTZ_FALSE的最大精度误差均为1ulp。 | ||
| 212 | + | ||
| 213 | +### 配置Subnormal模式 | ||
| 214 | + | ||
| 215 | +FTZ(Flush-To-Zero):一种浮点运算模式,当结果为[Subnormal](../../data_structures/builtin_data_types.md#p7381131713310)时,将其直接清零(近似为0),而非保留其精确的微小数值。 | ||
| 216 | + | ||
| 217 | +#### 默认算法 | ||
| 218 | + | ||
| 219 | +ReciprocalAlgo::INTRINSIC为默认算法。--cce-ftz=false时保留Subnormal;--cce-ftz=true(默认值)时采用FTZ模式。 | ||
| 220 | + | ||
| 221 | +#### 显式指定的算法 | ||
| 222 | + | ||
| 223 | +- ReciprocalAlgo::PRECISION_1ULP_FTZ_TRUE使用单指令计算,始终采用FTZ模式。 | ||
| 224 | +- ReciprocalAlgo::PRECISION_1ULP_FTZ_FALSE通过软件仿真实现,支持Subnormal数据计算。 | ||
| 225 | + | ||
| 226 | +#### 使用建议 | ||
| 227 | + | ||
| 228 | +由于保留Subnormal的计算行为通过软件仿真实现,在--cce-ftz=true(默认值)时,一般场景建议使用默认的ReciprocalAlgo::INTRINSIC或显式选择ReciprocalAlgo::PRECISION_1ULP_FTZ_TRUE,以获得更好的性能;需要精确输出Subnormal时,使用ReciprocalAlgo::PRECISION_1ULP_FTZ_FALSE。 | ||
| 229 | +<!-- end id35 --> | ||
| 230 | + | ||
| 204 | ## 调用示例<a name="section176061616102911"></a> | 231 | ## 调用示例<a name="section176061616102911"></a> |
| 205 | 232 | ||
| 206 | - tensor高维切分计算样例-mask连续模式 | 233 | - tensor高维切分计算样例-mask连续模式 |
| @@ -128,7 +128,7 @@ $dst_i = \frac{1}{\sqrt{src_i}}$ | |||
| 128 | |---|---| | 128 | |---|---| |
| 129 | | T | 操作数数据类型。 | | 129 | | T | 操作数数据类型。 | |
| 130 | | isSetMask | 是否在接口内部设置mask。<br>• true,表示在接口内部设置mask。<br>• false,表示在接口外部设置mask,开发者需要使用[SetVectorMask](../mask_operations/SetVectorMask.md)接口设置mask值。这种模式下,接口入参中的mask值设置为占位符`MASK_PLACEHOLDER`,用于占位,无实际含义。 | | 130 | | isSetMask | 是否在接口内部设置mask。<br>• true,表示在接口内部设置mask。<br>• false,表示在接口外部设置mask,开发者需要使用[SetVectorMask](../mask_operations/SetVectorMask.md)接口设置mask值。这种模式下,接口入参中的mask值设置为占位符`MASK_PLACEHOLDER`,用于占位,无实际含义。 | |
| 131 | -| <!-- npu="950" id19 -->config | 该参数仅支持Ascend 950PR/Ascend 950DT。<br>用于配置精度计算模式,RsqrtConfig类型,定义如下:<br>enum class RsqrtAlgo {<br> INTRINSIC = 0,<br> FAST_INVERSE,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_0ULP_FTZ_FALSE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct RsqrtConfig {<br> RsqrtAlgo algo = RsqrtAlgo::INTRINSIC;<br>};<br>通过RsqrtConfig结构体的参数algo来配置精度计算模式。algo取值如下:<br>• RsqrtAlgo::INTRINSIC、RsqrtAlgo::PRECISION_1ULP_FTZ_TRUE,使用单指令计算得出结果,最大精度误差为1ulp。<br>• RsqrtAlgo::FAST_INVERSE、RsqrtAlgo::PRECISION_0ULP_FTZ_FALSE,使用快速求逆算法得出结果。适用于输入值在[0, 85070596800837026223494223584045301760]范围内的计算。在该范围内,算法保证输出的最大精度误差为0ulp;当输入值大于85070596800837026223494223584045301760时,输出为inf。目前,该算法支持float数据类型,并在该模式下支持Subnormal数据计算。<br>• RsqrtAlgo::PRECISION_1ULP_FTZ_FALSE,仅支持half类型的Subnormal数据计算,此时最大精度误差为1ulp。<br>该参数的默认值DEFAULT_RSQRT_CONFIG的取值如下:<br>constexpr RsqrtConfig DEFAULT_RSQRT_CONFIG = { RsqrtAlgo::INTRINSIC };<br>调用本原型时若不显式传入config参数,则默认使用DEFAULT_RSQRT_CONFIG,此时行为与不传入config参数的原型等价。<!-- end id19 --> | | 131 | +| <!-- npu="950" id19 -->config | 该参数仅支持Ascend 950PR/Ascend 950DT。<br>用于配置精度计算模式,RsqrtConfig类型,定义如下:<br>enum class RsqrtAlgo {<br> INTRINSIC = 0,<br> FAST_INVERSE,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_0ULP_FTZ_FALSE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct RsqrtConfig {<br> RsqrtAlgo algo = RsqrtAlgo::INTRINSIC;<br>};<br>通过RsqrtConfig结构体的参数algo来选择Rsqrt算法并配置Subnormal模式,详细说明请参考[关键特性说明](#rsqrt-key-features)。<br>algo的取值如下:<br>• RsqrtAlgo::INTRINSIC:默认算法,最大精度误差为1ulp。对于half、float类型,Subnormal处理受编译选项--cce-ftz控制(默认值为true)。<br>• RsqrtAlgo::FAST_INVERSE和RsqrtAlgo::PRECISION_0ULP_FTZ_FALSE:使用快速求逆算法得出结果。目前,该算法仅支持float数据类型,并在该模式下支持Subnormal数据计算。<br>• RsqrtAlgo::PRECISION_1ULP_FTZ_TRUE:使用单指令计算,最大精度误差为1ulp。<br>• RsqrtAlgo::PRECISION_1ULP_FTZ_FALSE:最大精度误差为1ulp,支持half类型的Subnormal数据计算。<br><br>该参数的默认值DEFAULT_RSQRT_CONFIG的取值如下:<br>constexpr RsqrtConfig DEFAULT_RSQRT_CONFIG = { RsqrtAlgo::INTRINSIC };<br>调用本原型时若不显式传入config参数,则默认使用DEFAULT_RSQRT_CONFIG,此时行为与不传入config参数的原型等价。<!-- end id19 --> | |
| 132 | 132 | ||
| 133 | **表2** 参数说明 | 133 | **表2** 参数说明 |
| 134 | 134 | ||
| @@ -178,6 +178,36 @@ T支持的数据类型为:half、float。 | |||
| 178 | - 如果src中的数值为非正数,可能会产生未知结果。 | 178 | - 如果src中的数值为非正数,可能会产生未知结果。 |
| 179 | - 使用Rsqrt时,half的算子结果对比误差不满足双千分之一的要求,float的算子结果对比误差不满足双万分之一的要求,如果需要高精度,建议使用[Div](Div.md)和[Sqrt](Sqrt.md)替代实现。 | 179 | - 使用Rsqrt时,half的算子结果对比误差不满足双千分之一的要求,float的算子结果对比误差不满足双万分之一的要求,如果需要高精度,建议使用[Div](Div.md)和[Sqrt](Sqrt.md)替代实现。 |
| 180 | 180 | ||
| 181 | +<!-- npu="950" id35 --> | ||
| 182 | +## 关键特性<a id="rsqrt-key-features"></a> | ||
| 183 | + | ||
| 184 | +针对Ascend 950PR/Ascend 950DT,有如下关键特性: | ||
| 185 | + | ||
| 186 | +### 最大精度误差 | ||
| 187 | + | ||
| 188 | +- RsqrtAlgo::INTRINSIC和RsqrtAlgo::PRECISION_1ULP_FTZ_TRUE的最大精度误差为1ulp。 | ||
| 189 | +- RsqrtAlgo::FAST_INVERSE和RsqrtAlgo::PRECISION_0ULP_FTZ_FALSE的最大精度误差为0ulp。 | ||
| 190 | +- RsqrtAlgo::PRECISION_1ULP_FTZ_FALSE的最大精度误差为1ulp。 | ||
| 191 | + | ||
| 192 | +### 配置Subnormal模式 | ||
| 193 | + | ||
| 194 | +FTZ(Flush-To-Zero):一种浮点运算模式,当结果为[Subnormal](../../data_structures/builtin_data_types.md#p7381131713310)时,将其直接清零(近似为0),而非保留其精确的微小数值。 | ||
| 195 | + | ||
| 196 | +#### 默认算法 | ||
| 197 | + | ||
| 198 | +RsqrtAlgo::INTRINSIC为默认算法。--cce-ftz=false时保留Subnormal;--cce-ftz=true(默认值)时采用FTZ模式。 | ||
| 199 | + | ||
| 200 | +#### 显式指定的算法 | ||
| 201 | + | ||
| 202 | +- RsqrtAlgo::PRECISION_1ULP_FTZ_TRUE使用单指令计算,始终采用FTZ模式。 | ||
| 203 | +- RsqrtAlgo::FAST_INVERSE和RsqrtAlgo::PRECISION_0ULP_FTZ_FALSE使用快速求逆算法,仅支持float类型,并支持Subnormal数据计算。 | ||
| 204 | +- RsqrtAlgo::PRECISION_1ULP_FTZ_FALSE支持half类型的Subnormal数据计算。 | ||
| 205 | + | ||
| 206 | +#### 使用建议 | ||
| 207 | + | ||
| 208 | +在--cce-ftz=true(默认值)时,一般场景建议使用默认的RsqrtAlgo::INTRINSIC或显式选择RsqrtAlgo::PRECISION_1ULP_FTZ_TRUE,以获得更好的性能;需要精确输出Subnormal时,使用RsqrtAlgo::FAST_INVERSE、RsqrtAlgo::PRECISION_0ULP_FTZ_FALSE或RsqrtAlgo::PRECISION_1ULP_FTZ_FALSE。 | ||
| 209 | +<!-- end id35 --> | ||
| 210 | + | ||
| 181 | ## 调用示例<a name="section642mcpsimp"></a> | 211 | ## 调用示例<a name="section642mcpsimp"></a> |
| 182 | 212 | ||
| 183 | - tensor高维切分计算样例-mask连续模式 | 213 | - tensor高维切分计算样例-mask连续模式 |
| @@ -128,7 +128,7 @@ $dst_i = \sqrt{src_i}$ | |||
| 128 | |---|---| | 128 | |---|---| |
| 129 | | T | 操作数数据类型。 | | 129 | | T | 操作数数据类型。 | |
| 130 | | isSetMask | 是否在接口内部设置mask。<br>• true,表示在接口内部设置mask。<br>• false,表示在接口外部设置mask,开发者需要使用[SetVectorMask](../mask_operations/SetVectorMask.md)接口设置mask值。这种模式下,接口入参中的mask值设置为占位符`MASK_PLACEHOLDER`,用于占位,无实际含义。 | | 130 | | isSetMask | 是否在接口内部设置mask。<br>• true,表示在接口内部设置mask。<br>• false,表示在接口外部设置mask,开发者需要使用[SetVectorMask](../mask_operations/SetVectorMask.md)接口设置mask值。这种模式下,接口入参中的mask值设置为占位符`MASK_PLACEHOLDER`,用于占位,无实际含义。 | |
| 131 | -| <!-- npu="950" id22 -->config | 该参数仅支持Ascend 950PR/Ascend 950DT。<br>用于配置精度计算模式,SqrtConfig类型,定义如下:<br>enum class SqrtAlgo {<br> INTRINSIC = 0,<br> FAST_INVERSE,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_0ULP_FTZ_FALSE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct SqrtConfig {<br> SqrtAlgo algo = SqrtAlgo::INTRINSIC;<br>};<br>通过SqrtConfig结构体的参数algo来配置精度计算模式。algo取值如下:<br>• SqrtAlgo::INTRINSIC、SqrtAlgo::PRECISION_1ULP_FTZ_TRUE,使用单指令计算得出结果,最大精度误差为1ulp。<br>• SqrtAlgo::FAST_INVERSE、SqrtAlgo::PRECISION_0ULP_FTZ_FALSE,使用快速求逆算法得出结果。适用于输入值在[0, 85070596800837026223494223584045301760]范围内的计算。在该范围内,算法保证输出的最大精度误差为0ulp;当输入值大于85070596800837026223494223584045301760时,输出为0。目前,该算法仅支持float数据类型,并在该模式下支持Subnormal数据计算。<br>• SqrtAlgo::PRECISION_1ULP_FTZ_FALSE,仅支持half类型的Subnormal数据计算,此时最大精度误差为1ulp。<br>该参数的默认值DEFAULT_SQRT_CONFIG的取值如下:<br>constexpr SqrtConfig DEFAULT_SQRT_CONFIG = { SqrtAlgo::INTRINSIC };<br>调用本原型时若不显式传入config参数,则默认使用DEFAULT_SQRT_CONFIG,此时行为与不传入config参数的原型等价。<!-- end id22 --> | | 131 | +| <!-- npu="950" id22 -->config | 该参数仅支持Ascend 950PR/Ascend 950DT。<br>用于配置精度计算模式,SqrtConfig类型,定义如下:<br>enum class SqrtAlgo {<br> INTRINSIC = 0,<br> FAST_INVERSE,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_0ULP_FTZ_FALSE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct SqrtConfig {<br> SqrtAlgo algo = SqrtAlgo::INTRINSIC;<br>};<br>通过SqrtConfig结构体的参数algo来选择Sqrt算法并配置Subnormal模式,详细说明请参考[关键特性说明](#sqrt-key-features)。<br>algo的取值如下:<br>• SqrtAlgo::INTRINSIC:默认算法,最大精度误差为1ulp。对于half、float类型,Subnormal处理受编译选项--cce-ftz控制(默认值为true)。<br>• SqrtAlgo::FAST_INVERSE和SqrtAlgo::PRECISION_0ULP_FTZ_FALSE:使用快速求逆算法得出结果。目前,该算法仅支持float数据类型,并在该模式下支持Subnormal数据计算。<br>• SqrtAlgo::PRECISION_1ULP_FTZ_TRUE:使用单指令计算,最大精度误差为1ulp。<br>• SqrtAlgo::PRECISION_1ULP_FTZ_FALSE:最大精度误差为1ulp,支持half类型的Subnormal数据计算。<br><br>该参数的默认值DEFAULT_SQRT_CONFIG的取值如下:<br>constexpr SqrtConfig DEFAULT_SQRT_CONFIG = { SqrtAlgo::INTRINSIC };<br>调用本原型时若不显式传入config参数,则默认使用DEFAULT_SQRT_CONFIG,此时行为与不传入config参数的原型等价。<!-- end id22 --> | |
| 132 | 132 | ||
| 133 | **表2** 参数说明 | 133 | **表2** 参数说明 |
| 134 | 134 | ||
| @@ -178,25 +178,35 @@ T支持的数据类型为:half、float。 | |||
| 178 | 178 | ||
| 179 | - 如果src中的数值为非正数,可能会产生未知结果。 | 179 | - 如果src中的数值为非正数,可能会产生未知结果。 |
| 180 | 180 | ||
| 181 | -<!-- npu="950" id24 --> | 181 | +<!-- npu="950" id35 --> |
| 182 | -## 关键特性<a name="section18972943153217"></a> | 182 | +## 关键特性<a id="sqrt-key-features"></a> |
| 183 | 183 | ||
| 184 | 针对Ascend 950PR/Ascend 950DT,有如下关键特性: | 184 | 针对Ascend 950PR/Ascend 950DT,有如下关键特性: |
| 185 | 185 | ||
| 186 | -**最大精度误差**: | 186 | +### 最大精度误差 |
| 187 | 187 | ||
| 188 | -- SqrtAlgo::INTRINSIC、SqrtAlgo::PRECISION\_1ULP\_FTZ\_TRUE,最大精度误差为1ulp。 | 188 | +- SqrtAlgo::INTRINSIC和SqrtAlgo::PRECISION_1ULP_FTZ_TRUE的最大精度误差为1ulp。 |
| 189 | -- SqrtAlgo::PRECISION\_1ULP\_FTZ\_FALSE,软仿实现,最大精度误差为1ulp。 | 189 | +- SqrtAlgo::FAST_INVERSE和SqrtAlgo::PRECISION_0ULP_FTZ_FALSE的最大精度误差为0ulp。 |
| 190 | -- SqrtAlgo::FAST\_INVERSE、SqrtAlgo::PRECISION\_0ULP\_FTZ\_FALSE,软仿实现,最大精度误差为0ulp。 | 190 | +- SqrtAlgo::PRECISION_1ULP_FTZ_FALSE的最大精度误差为1ulp。 |
| 191 | 191 | ||
| 192 | -**配置Subnormal模式**: | 192 | +### 配置Subnormal模式 |
| 193 | 193 | ||
| 194 | -FTZ(Flush To Zero):一种浮点运算模式,当结果为[Subnormal](../../data_structures/builtin_data_types.md#p7381131713310)时,将其直接清零(近似为0),而非保留其精确的微小数值。 | 194 | +FTZ(Flush-To-Zero):一种浮点运算模式,当结果为[Subnormal](../../data_structures/builtin_data_types.md#p7381131713310)时,将其直接清零(近似为0),而非保留其精确的微小数值。 |
| 195 | 195 | ||
| 196 | -只有将algo设置为SqrtAlgo::FAST\_INVERSE、SqrtAlgo::PRECISION\_0ULP\_FTZ\_FALSE、SqrtAlgo::PRECISION\_1ULP\_FTZ\_false时,Sqrt接口才会保留并正确输出Subnormal结果;其他模式下Subnormal均被FTZ。 | 196 | +#### 默认算法 |
| 197 | 197 | ||
| 198 | -由于Subnormal的计算行为是通过软件仿真算法实现,一般场景推荐使用性能更好的SqrtAlgo::INTRINSIC、SqrtAlgo::PRECISION\_1ULP\_FTZ\_TRUE;需要精确Subnormal输出的场景(如特定数据精度要求的算法、避免除零错误)使用SqrtAlgo::FAST\_INVERSE、SqrtAlgo::PRECISION\_0ULP\_FTZ\_FALSE、SqrtAlgo::PRECISION\_1ULP\_FTZ\_FALSE。 | 198 | +SqrtAlgo::INTRINSIC为默认算法。--cce-ftz=false时保留Subnormal;--cce-ftz=true(默认值)时采用FTZ模式。 |
| 199 | -<!-- end id24 --> | 199 | + |
| 200 | +#### 显式指定的算法 | ||
| 201 | + | ||
| 202 | +- SqrtAlgo::PRECISION_1ULP_FTZ_TRUE使用单指令计算,始终采用FTZ模式。 | ||
| 203 | +- SqrtAlgo::FAST_INVERSE和SqrtAlgo::PRECISION_0ULP_FTZ_FALSE使用快速求逆算法,仅支持float类型,并支持Subnormal数据计算。 | ||
| 204 | +- SqrtAlgo::PRECISION_1ULP_FTZ_FALSE支持half类型的Subnormal数据计算。 | ||
| 205 | + | ||
| 206 | +#### 使用建议 | ||
| 207 | + | ||
| 208 | +在--cce-ftz=true(默认值)时,一般场景建议使用默认的SqrtAlgo::INTRINSIC或显式选择SqrtAlgo::PRECISION_1ULP_FTZ_TRUE,以获得更好的性能;需要精确输出Subnormal时,使用SqrtAlgo::FAST_INVERSE、SqrtAlgo::PRECISION_0ULP_FTZ_FALSE或SqrtAlgo::PRECISION_1ULP_FTZ_FALSE。 | ||
| 209 | +<!-- end id35 --> | ||
| 200 | 210 | ||
| 201 | ## 调用示例<a name="section176061616102911"></a> | 211 | ## 调用示例<a name="section176061616102911"></a> |
| 202 | 212 | ||
| @@ -105,6 +105,11 @@ | |||
| 105 | 105 | ||
| 106 | - 当目的操作数和源操作数数据类型不一致时,目的操作数和源操作数不可重叠。 | 106 | - 当目的操作数和源操作数数据类型不一致时,目的操作数和源操作数不可重叠。 |
| 107 | - 整型数据的计算结果如果超出数据类型的表示范围会采取非饱和截断,比如int8_t类型,srcReg为-128,其绝对值128会被截断成-128。 | 107 | - 整型数据的计算结果如果超出数据类型的表示范围会采取非饱和截断,比如int8_t类型,srcReg为-128,其绝对值128会被截断成-128。 |
| 108 | +<!-- npu="950" id8 --> | ||
| 109 | +- 针对Ascend 950PR/Ascend 950DT,仅complex32和complex64类型的接口内部计算涉及Subnormal,处理方式受编译选项--cce-ftz控制(默认值为true): | ||
| 110 | + - --cce-ftz=false时,计算过程中保留Subnormal,并按照其实际数值参与后续计算。 | ||
| 111 | + - --cce-ftz=true时,启用FTZ(Flush-To-Zero)模式,计算过程中产生或参与运算的Subnormal将按0处理,可能导致计算结果与保留Subnormal时存在精度差异。 | ||
| 112 | +<!-- end id8 --> | ||
| 108 | 113 | ||
| 109 | ## 调用示例<a name="section642mcpsimp"></a> | 114 | ## 调用示例<a name="section642mcpsimp"></a> |
| 110 | 115 | ||
| @@ -143,4 +148,3 @@ | |||
| 143 | } | 148 | } |
| 144 | } | 149 | } |
| 145 | ``` | 150 | ``` |
| 146 | - | ||
| @@ -48,10 +48,9 @@ __simd_callee__ inline void Div(U& dstReg, U& srcReg0, U& srcReg1, MaskReg& mask | |||
| 48 | | 参数名 | 描述 | | 48 | | 参数名 | 描述 | |
| 49 | | --- | --- | | 49 | | --- | --- | |
| 50 | | T | 操作数数据类型。支持的数据类型请参考[数据类型](#数据类型)。 | | 50 | | T | 操作数数据类型。支持的数据类型请参考[数据类型](#数据类型)。 | |
| 51 | -| mode | 可配置为[MaskMergeMode](../aux_data_types/MaskMergeMode.md)枚举类型或DivSpecificMode的结构体指针。<br>• 配置MaskMergeMode,选择MERGING模式或ZEROING模式。<br> • ZEROING模式下,mask未筛选的元素在dstReg中置零。<br> • MERGING模式当前不支持。<br>• 配置DivSpecificMode<br><code>enum class DivAlgo {<br> INTRINSIC = 0,<br> DIFF_COMPENSATION,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_0ULP_FTZ_TRUE,<br> PRECISION_0ULP_FTZ_FALSE,<br> PRECISION_1ULP_FTZ_FALSE<br>};<br>struct DivSpecificMode {<br> MaskMergeMode mrgMode = MaskMergeMode::ZEROING,<br> bool precisionMode = false;<br> DivAlgo algo = DivAlgo::INTRINSIC;<br>};</code><br>当precisionMode为true时,使能更高精度的Div计算,使用差值补偿算法得出结果,最大精度误差为0ulp。目前只针对float数据类型生效。<br>• algo:用于配置Subnormal模式,具体参考[关键特性说明](#关键特性说明)。<br> • DivAlgo::INTRINSIC、DivAlgo::PRECISION_1ULP_FTZ_TRUE,使用单指令计算得出结果,最大精度误差为1ulp。<br> • DivAlgo::DIFF_COMPENSATION、DivAlgo::PRECISION_0ULP_FTZ_TRUE,使用差值补偿算法得出结果,最大精度误差为0ulp。目前,该算法支持float、complex64数据类型。<br> • DivAlgo::PRECISION_0ULP_FTZ_FALSE,支持Subnormal数据计算,使用差值补偿算法得出结果,最大精度误差为0ulp。目前,该算法支持float数据类型。<br> • DivAlgo::PRECISION_1ULP_FTZ_FALSE,支持Subnormal数据计算,最大精度误差为1ulp。目前,该算法支持half、float数据类型。 | | 51 | +| mode | 可配置为[MaskMergeMode](../aux_data_types/MaskMergeMode.md)枚举值或指向DivSpecificMode结构体的指针。<br>• 配置MaskMergeMode:选择MERGING模式或ZEROING模式。<br> • ZEROING模式下,mask未筛选的元素在dstReg中置零。<br> • MERGING模式当前不支持。<br>• 配置DivSpecificMode,定义如下:<br><code>enum class DivAlgo {<br> INTRINSIC = 0,<br> DIFF_COMPENSATION,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_0ULP_FTZ_TRUE,<br> PRECISION_0ULP_FTZ_FALSE,<br> PRECISION_1ULP_FTZ_FALSE<br>};<br>struct DivSpecificMode {<br> MaskMergeMode mrgMode = MaskMergeMode::ZEROING;<br> bool precisionMode = false;<br> DivAlgo algo = DivAlgo::INTRINSIC;<br>};</code><br>• precisionMode:用于配置高精度Div计算。设置为true时,使用差值补偿算法,最大精度误差为0ulp,支持float、complex64类型。<br>• algo:用于选择Div算法及配置Subnormal模式,详细说明请参考[关键特性说明](#关键特性说明)。<br> • DivAlgo::INTRINSIC:默认算法,最大精度误差为1ulp。对于half、float类型,Subnormal处理受编译选项--cce-ftz控制(默认值为true)。<br> • DivAlgo::PRECISION_1ULP_FTZ_TRUE:使用单指令计算,最大精度误差为1ulp。<br> • DivAlgo::DIFF_COMPENSATION:使用差值补偿算法,最大精度误差为0ulp。对于float、complex64类型,Subnormal处理受编译选项--cce-ftz控制(默认值为true)。<br> • DivAlgo::PRECISION_0ULP_FTZ_TRUE:使用差值补偿算法,最大精度误差为0ulp。<br> • DivAlgo::PRECISION_0ULP_FTZ_FALSE:使用差值补偿算法,支持Subnormal数据计算,最大精度误差为0ulp。<br> • DivAlgo::PRECISION_1ULP_FTZ_FALSE:支持Subnormal数据计算,最大精度误差为1ulp。 | |
| 52 | | U | 源操作数和目的操作数的RegTensor类型,例如RegTensor<half>,由编译器自动推导,用户不需要填写。 | | 52 | | U | 源操作数和目的操作数的RegTensor类型,例如RegTensor<half>,由编译器自动推导,用户不需要填写。 | |
| 53 | 53 | ||
| 54 | - | ||
| 55 | **表 2** 参数说明 | 54 | **表 2** 参数说明 |
| 56 | 55 | ||
| 57 | | 参数名 | 输入/输出 | 描述 | | 56 | | 参数名 | 输入/输出 | 描述 | |
| @@ -64,10 +63,11 @@ __simd_callee__ inline void Div(U& dstReg, U& srcReg0, U& srcReg1, MaskReg& mask | |||
| 64 | ## 数据类型 | 63 | ## 数据类型 |
| 65 | 64 | ||
| 66 | 目的操作数与源操作数的数据类型需要保持一致。 | 65 | 目的操作数与源操作数的数据类型需要保持一致。 |
| 67 | -- 当模式为DivAlgo::INTRINSIC、DivAlgo::PRECISION_1ULP_FTZ_TRUE,支持的数据类型为:int16_t、uint16_t、half、int32_t、uint32_t、float、complex32、int64_t、uint64_t、complex64。 | 66 | + |
| 68 | -- 当模式为DivAlgo::DIFF_COMPENSATION、DivAlgo::PRECISION_0ULP_FTZ_TRUE,支持的数据类型为:float、complex64。 | 67 | +- 当模式为DivAlgo::INTRINSIC或DivAlgo::PRECISION_1ULP_FTZ_TRUE时,支持的数据类型为:int16_t、uint16_t、half、int32_t、uint32_t、float、complex32、int64_t、uint64_t、complex64。 |
| 69 | -- 当模式为DivAlgo::PRECISION_0ULP_FTZ_FALSE,支持的数据类型为:float。 | 68 | +- 当模式为DivAlgo::DIFF_COMPENSATION或DivAlgo::PRECISION_0ULP_FTZ_TRUE时,支持的数据类型为:float、complex64。 |
| 70 | -- 当模式为DivAlgo::PRECISION_1ULP_FTZ_FALSE,支持的数据类型为:half、float。 | 69 | +- 当模式为DivAlgo::PRECISION_0ULP_FTZ_FALSE时,支持的数据类型为:float。 |
| 70 | +- 当模式为DivAlgo::PRECISION_1ULP_FTZ_FALSE时,支持的数据类型为:half、float。 | ||
| 71 | 71 | ||
| 72 | ## 返回值说明<a name="section640mcpsimp"></a> | 72 | ## 返回值说明<a name="section640mcpsimp"></a> |
| 73 | 73 | ||
| @@ -79,20 +79,30 @@ __simd_callee__ inline void Div(U& dstReg, U& srcReg0, U& srcReg1, MaskReg& mask | |||
| 79 | 79 | ||
| 80 | ## 关键特性说明 | 80 | ## 关键特性说明 |
| 81 | 81 | ||
| 82 | -**最大精度误差:** | 82 | +### 最大精度误差 |
| 83 | 83 | ||
| 84 | -- 当precisionMode为false时,DivAlgo::INTRINSIC、DivAlgo::PRECISION_1ULP_FTZ_TRUE、DivAlgo::PRECISION_1ULP_FTZ_FALSE,最大精度误差为1ulp。 | 84 | +- precisionMode设置为true时,使用差值补偿算法进行高精度计算,最大精度误差为0ulp。 |
| 85 | -- 当precisionMode为true时,DivAlgo::DIFF_COMPENSATION、DivAlgo::PRECISION_0ULP_FTZ_TRUE、DivAlgo::PRECISION_0ULP_FTZ_FALSE,最大精度误差为0ulp。 | 85 | +- precisionMode设置为false时,DivAlgo::INTRINSIC、DivAlgo::PRECISION_1ULP_FTZ_TRUE和DivAlgo::PRECISION_1ULP_FTZ_FALSE的最大精度误差为1ulp;DivAlgo::DIFF_COMPENSATION、DivAlgo::PRECISION_0ULP_FTZ_TRUE和DivAlgo::PRECISION_0ULP_FTZ_FALSE的最大精度误差为0ulp。 |
| 86 | 86 | ||
| 87 | -**配置Subnormal模式:** | 87 | +### 配置Subnormal模式 |
| 88 | -<br> | ||
| 89 | -FTZ(Flush To Zero):一种浮点运算模式,当结果为Subnormal时,将其直接清零(近似为0),而非保留其精确的微小数值。 | ||
| 90 | -<br> | ||
| 91 | -只有将algo设置为DivAlgo::PRECISION_0ULP_FTZ_FALSE或者DivAlgo::PRECISION_1ULP_FTZ_FALSE时,Div接口才会保留并正确输出Subnormal结果;其他模式下Subnormal均被FTZ。 | ||
| 92 | -<br> | ||
| 93 | -一般场景推荐使用性能更好的DivAlgo::INTRINSIC、DivAlgo::PRECISION_1ULP_FTZ_TRUE、DivAlgo::DIFF_COMPENSATION、DivAlgo::PRECISION_0ULP_FTZ_TRUE;需要精确Subnormal输出的场景(如特定数据精度要求的算法、避免除零错误)使用DivAlgo::PRECISION_0ULP_FTZ_FALSE、DivAlgo::PRECISION_1ULP_FTZ_FALSE。 | ||
| 94 | 88 | ||
| 95 | -**表 8** Div Subnormal示例 | 89 | +FTZ(Flush-To-Zero):一种浮点运算模式,当结果为Subnormal时,将其直接清零(近似为0),而非保留其精确的微小数值。 |
| 90 | + | ||
| 91 | +#### 默认算法 | ||
| 92 | + | ||
| 93 | +DivAlgo::INTRINSIC支持整数、浮点和复数类型,具体支持范围请参考[数据类型](#数据类型)。对于half和float类型,--cce-ftz=false时保留Subnormal,等效于DivAlgo::PRECISION_1ULP_FTZ_FALSE;--cce-ftz=true(默认值)时采用FTZ模式,等效于DivAlgo::PRECISION_1ULP_FTZ_TRUE。对于整数类型,计算结果不涉及Subnormal,--cce-ftz对其无影响;对于complex32和complex64类型,实部和虚部分别为half和float,Subnormal处理遵循对应元素类型的--cce-ftz配置。 | ||
| 94 | + | ||
| 95 | +#### 显式指定的算法 | ||
| 96 | + | ||
| 97 | +- DivAlgo::DIFF_COMPENSATION支持float和complex64类型。--cce-ftz=false时保留Subnormal;--cce-ftz=true(默认值)时采用FTZ模式。 | ||
| 98 | +- 名称中包含FTZ_FALSE的算法始终保留Subnormal。 | ||
| 99 | +- 名称中包含FTZ_TRUE的算法始终采用FTZ模式。 | ||
| 100 | + | ||
| 101 | +#### 使用建议 | ||
| 102 | + | ||
| 103 | +一般场景建议使用性能更优的DivAlgo::PRECISION_1ULP_FTZ_TRUE或DivAlgo::PRECISION_0ULP_FTZ_TRUE;对于需要精确输出Subnormal的场景(如算法对数据精度有特殊要求或需避免除零错误),可将算法配置为DivAlgo::PRECISION_0ULP_FTZ_FALSE或DivAlgo::PRECISION_1ULP_FTZ_FALSE。 | ||
| 104 | + | ||
| 105 | +**表 3** Div Subnormal示例 | ||
| 96 | 106 | ||
| 97 | | 被除数输入 | 除数输入 | 输出(配置Subnormal模式) | 输出(不配置Subnormal模式) | | 107 | | 被除数输入 | 除数输入 | 输出(配置Subnormal模式) | 输出(不配置Subnormal模式) | |
| 98 | | --- | --- | --- | --- | | 108 | | --- | --- | --- | --- | |
| @@ -111,8 +121,9 @@ __simd_vf__ inline void DivVF(__ubuf__ T* dstAddr, __ubuf__ T* src0Addr, __ubuf_ | |||
| 111 | AscendC::Reg::MaskReg mask; | 121 | AscendC::Reg::MaskReg mask; |
| 112 | // 高精度模式 | 122 | // 高精度模式 |
| 113 | // static constexpr AscendC::Reg::DivSpecificMode mode = {AscendC::Reg::MaskMergeMode::ZEROING, true}; | 123 | // static constexpr AscendC::Reg::DivSpecificMode mode = {AscendC::Reg::MaskMergeMode::ZEROING, true}; |
| 114 | - // Subnormal模式 | 124 | + // 0ulp精度及Subnormal模式 |
| 115 | - // static constexpr AscendC::Reg::DivSpecificMode mode = {AscendC::Reg::MaskMergeMode::ZEROING, true, DivAlgo::PRECISION_0ULP_FTZ_FALSE}; | 125 | + // static constexpr AscendC::Reg::DivSpecificMode mode = { |
| 126 | + // AscendC::Reg::MaskMergeMode::ZEROING, true, AscendC::DivAlgo::PRECISION_0ULP_FTZ_FALSE}; | ||
| 116 | for (uint16_t i = 0; i < repeatTimes; i++) { | 127 | for (uint16_t i = 0; i < repeatTimes; i++) { |
| 117 | mask = AscendC::Reg::UpdateMask<T>(count); | 128 | mask = AscendC::Reg::UpdateMask<T>(count); |
| 118 | AscendC::Reg::LoadAlign(srcReg0, src0Addr + i * oneRepeatSize); | 129 | AscendC::Reg::LoadAlign(srcReg0, src0Addr + i * oneRepeatSize); |
| @@ -124,4 +135,3 @@ __simd_vf__ inline void DivVF(__ubuf__ T* dstAddr, __ubuf__ T* src0Addr, __ubuf_ | |||
| 124 | } | 135 | } |
| 125 | } | 136 | } |
| 126 | ``` | 137 | ``` |
| 127 | - | ||
| @@ -48,7 +48,7 @@ __simd_callee__ inline void Exp(U& dstReg, U& srcReg, MaskReg& mask) | |||
| 48 | | 参数名 | 描述 | | 48 | | 参数名 | 描述 | |
| 49 | | --- | --- | | 49 | | --- | --- | |
| 50 | | T | 操作数数据类型。支持的数据类型请参考[数据类型](#数据类型)。 | | 50 | | T | 操作数数据类型。支持的数据类型请参考[数据类型](#数据类型)。 | |
| 51 | -| mode | 可配置为[MaskMergeMode](../aux_data_types/MaskMergeMode.md)枚举类型的枚举或ExpSpecificMode的结构体指针。<br>• MaskMergeMode,选择MERGING模式或ZEROING模式。<br> • ZEROING模式下,mask未筛选的元素在dstReg中置零。<br> • MERGING模式当前不支持。<br>• ExpSpecificMode,定义如下:<br><code>enum class ExpAlgo {<br> INTRINSIC = 0,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct ExpSpecificMode{<br> MaskMergeMode mrgMode = MaskMergeMode::ZEROING,<br> ExpAlgo algo = ExpAlgo::INTRINSIC;<br>};</code><br>• mrgMode:选择MERGING模式或ZEROING模式。<br>• algo:用于配置Subnormal模式,具体参考[关键特性说明](#关键特性说明)。<br> • ExpAlgo::INTRINSIC、ExpAlgo::PRECISION_1ULP_FTZ_TRUE,使用单指令计算得出结果,所有Subnormal被近似为0。<br> • ExpAlgo::PRECISION_1ULP_FTZ_FALSE,支持Subnormal数据计算。 | | 51 | +| mode | 可配置为[MaskMergeMode](../aux_data_types/MaskMergeMode.md)枚举值或指向ExpSpecificMode结构体的指针。<br>• 配置MaskMergeMode:选择MERGING模式或ZEROING模式。<br> • ZEROING模式下,mask未筛选的元素在dstReg中置零。<br> • MERGING模式当前不支持。<br>• 配置ExpSpecificMode,定义如下:<br><code>enum class ExpAlgo {<br> INTRINSIC = 0,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct ExpSpecificMode {<br> MaskMergeMode mrgMode = MaskMergeMode::ZEROING;<br> ExpAlgo algo = ExpAlgo::INTRINSIC;<br>};</code><br>• mrgMode:选择MERGING模式或ZEROING模式。<br>• algo:用于选择Exp算法及配置Subnormal模式,详细说明请参考[关键特性说明](#关键特性说明)。<br> • ExpAlgo::INTRINSIC:默认算法,最大精度误差为1ulp。对于half、float类型,Subnormal处理受编译选项--cce-ftz控制(默认值为true)。<br> • ExpAlgo::PRECISION_1ULP_FTZ_TRUE:使用单指令计算,最大精度误差为1ulp。<br> • ExpAlgo::PRECISION_1ULP_FTZ_FALSE:通过软件仿真实现,支持Subnormal数据计算,最大精度误差为1ulp。 | |
| 52 | | U | 源操作数和目的操作数的RegTensor类型,例如RegTensor<half>,由编译器自动推导,用户不需要填写。 | | 52 | | U | 源操作数和目的操作数的RegTensor类型,例如RegTensor<half>,由编译器自动推导,用户不需要填写。 | |
| 53 | 53 | ||
| 54 | **表 2** 参数说明 | 54 | **表 2** 参数说明 |
| @@ -73,18 +73,26 @@ __simd_callee__ inline void Exp(U& dstReg, U& srcReg, MaskReg& mask) | |||
| 73 | 73 | ||
| 74 | ## 关键特性说明 | 74 | ## 关键特性说明 |
| 75 | 75 | ||
| 76 | -**最大精度误差**: | 76 | +### 最大精度误差 |
| 77 | 77 | ||
| 78 | -- ExpAlgo::INTRINSIC、ExpAlgo::PRECISION_1ULP_FTZ_TRUE、ExpAlgo::PRECISION_1ULP_FTZ_FALSE,最大精度误差为1ulp。 | 78 | +ExpAlgo::INTRINSIC、ExpAlgo::PRECISION_1ULP_FTZ_TRUE和ExpAlgo::PRECISION_1ULP_FTZ_FALSE的最大精度误差均为1ulp。 |
| 79 | -- ExpAlgo::PRECISION_1ULP_FTZ_FALSE,最大精度误差为1ulp。 | ||
| 80 | 79 | ||
| 81 | -**配置Subnormal模式**: | 80 | +### 配置Subnormal模式 |
| 82 | -<br> | 81 | + |
| 83 | -FTZ(Flush To Zero):一种浮点运算模式,当结果为Subnormal时,将其直接清零(近似为0),而非保留其精确的微小数值。 | 82 | +FTZ(Flush-To-Zero):一种浮点运算模式,当结果为Subnormal时,将其直接清零(近似为0),而非保留其精确的微小数值。 |
| 84 | -<br> | 83 | + |
| 85 | -只有将algo设置为ExpAlgo::PRECISION_1ULP_FTZ_FALSE时,Exp接口才会保留并正确输出Subnormal结果;其他模式下Subnormal均被FTZ。 | 84 | +#### 默认算法 |
| 86 | -<br> | 85 | + |
| 87 | -一般场景推荐使用性能更好的ExpAlgo::INTRINSIC、ExpAlgo::PRECISION_1ULP_FTZ_TRUE;需要精确 Subnormal输出的场景(如特定数据精度要求的算法、避免除零错误)使用ExpAlgo::PRECISION_1ULP_FTZ_FALSE。 | 86 | +ExpAlgo::INTRINSIC为默认算法。--cce-ftz=false时保留Subnormal;--cce-ftz=true(默认值)时采用FTZ模式。 |
| 87 | + | ||
| 88 | +#### 显式指定的算法 | ||
| 89 | + | ||
| 90 | +- ExpAlgo::PRECISION_1ULP_FTZ_TRUE使用单指令计算,始终采用FTZ模式。 | ||
| 91 | +- ExpAlgo::PRECISION_1ULP_FTZ_FALSE通过软件仿真实现,支持Subnormal数据计算。 | ||
| 92 | + | ||
| 93 | +#### 使用建议 | ||
| 94 | + | ||
| 95 | +由于保留Subnormal的计算行为通过软件仿真实现,在--cce-ftz=true(默认值)时,一般场景建议使用默认的ExpAlgo::INTRINSIC或显式选择ExpAlgo::PRECISION_1ULP_FTZ_TRUE,以获得更好的性能;需要精确输出Subnormal时,使用ExpAlgo::PRECISION_1ULP_FTZ_FALSE。 | ||
| 88 | 96 | ||
| 89 | **表 3** Exp Subnormal示例 | 97 | **表 3** Exp Subnormal示例 |
| 90 | 98 | ||
| @@ -104,13 +112,14 @@ __simd_vf__ inline void ExpVF(__ubuf__ T* dstAddr, __ubuf__ T* srcAddr, uint32_t | |||
| 104 | AscendC::Reg::RegTensor<T> srcReg; | 112 | AscendC::Reg::RegTensor<T> srcReg; |
| 105 | AscendC::Reg::RegTensor<T> dstReg; | 113 | AscendC::Reg::RegTensor<T> dstReg; |
| 106 | AscendC::Reg::MaskReg mask; | 114 | AscendC::Reg::MaskReg mask; |
| 107 | - // Subnormal模式 | 115 | + // 1ulp精度及Subnormal模式 |
| 108 | - // static constexpr AscendC::Reg::ExpSpecificMode mode = {AscendC::Reg::MaskMergeMode::ZEROING, ExpAlgo::PRECISION_1ULP_FTZ_FALSE}; | 116 | + // static constexpr AscendC::Reg::ExpSpecificMode mode = { |
| 117 | + // AscendC::Reg::MaskMergeMode::ZEROING, AscendC::ExpAlgo::PRECISION_1ULP_FTZ_FALSE}; | ||
| 109 | for (uint16_t i = 0; i < repeatTimes; i++) { | 118 | for (uint16_t i = 0; i < repeatTimes; i++) { |
| 110 | mask = AscendC::Reg::UpdateMask<T>(count); | 119 | mask = AscendC::Reg::UpdateMask<T>(count); |
| 111 | AscendC::Reg::LoadAlign(srcReg, srcAddr + i * oneRepeatSize); | 120 | AscendC::Reg::LoadAlign(srcReg, srcAddr + i * oneRepeatSize); |
| 112 | AscendC::Reg::Exp(dstReg, srcReg, mask); | 121 | AscendC::Reg::Exp(dstReg, srcReg, mask); |
| 113 | - // Subnormal模式 | 122 | + // 1ulp精度及Subnormal模式 |
| 114 | // AscendC::Reg::Exp<T, &mode>(dstReg, srcReg, mask); | 123 | // AscendC::Reg::Exp<T, &mode>(dstReg, srcReg, mask); |
| 115 | AscendC::Reg::StoreAlign(dstAddr + i * oneRepeatSize, dstReg, mask); | 124 | AscendC::Reg::StoreAlign(dstAddr + i * oneRepeatSize, dstReg, mask); |
| 116 | } | 125 | } |
| @@ -48,7 +48,7 @@ __simd_callee__ inline void Ln(U& dstReg, U& srcReg, MaskReg& mask) | |||
| 48 | | 参数名 | 描述 | | 48 | | 参数名 | 描述 | |
| 49 | | --- | --- | | 49 | | --- | --- | |
| 50 | | T | 操作数数据类型。支持的数据类型请参考[数据类型](#数据类型)。 | | 50 | | T | 操作数数据类型。支持的数据类型请参考[数据类型](#数据类型)。 | |
| 51 | -| mode | 可配置为[MaskMergeMode](../aux_data_types/MaskMergeMode.md)枚举类型或LnSpecificMode的结构体指针。<br>• 配置MaskMergeMode,选择MERGING模式或ZEROING模式。<br> • ZEROING模式下,mask未筛选的元素在dstReg中置零。<br> • MERGING模式当前不支持。<br>• 配置LnSpecificMode,定义如下:<br><code>enum class LnAlgo {<br> INTRINSIC = 0,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct LnSpecificMode {<br> MaskMergeMode mrgMode = MaskMergeMode::ZEROING,<br> LnAlgo algo = LnAlgo::INTRINSIC;<br>};</code><br>• mrgMode:选择MERGING模式或ZEROING模式。<br>• algo:用于配置Subnormal模式。<br> • LnAlgo::INTRINSIC、LnAlgo::PRECISION_1ULP_FTZ_TRUE,使用单指令计算得出结果,最大精度误差为1ulp。目前,该算法支持half、float数据类型。<br> • LnAlgo::PRECISION_1ULP_FTZ_FALSE,支持Subnormal数据计算,最大精度误差为1ulp。目前,该算法支持half、float数据类型。 | | 51 | +| mode | 可配置为[MaskMergeMode](../aux_data_types/MaskMergeMode.md)枚举值或指向LnSpecificMode结构体的指针。<br>• 配置MaskMergeMode:选择MERGING模式或ZEROING模式。<br> • ZEROING模式下,mask未筛选的元素在dstReg中置零。<br> • MERGING模式当前不支持。<br>• 配置LnSpecificMode,定义如下:<br><code>enum class LnAlgo {<br> INTRINSIC = 0,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct LnSpecificMode {<br> MaskMergeMode mrgMode = MaskMergeMode::ZEROING;<br> LnAlgo algo = LnAlgo::INTRINSIC;<br>};</code><br>• mrgMode:选择MERGING模式或ZEROING模式。<br>• algo:用于选择Ln算法及配置Subnormal模式,详细说明请参考[关键特性说明](#关键特性说明)。<br> • LnAlgo::INTRINSIC:默认算法,最大精度误差为1ulp。对于half、float类型,Subnormal处理受编译选项--cce-ftz控制(默认值为true)。<br> • LnAlgo::PRECISION_1ULP_FTZ_TRUE:使用单指令计算,最大精度误差为1ulp。<br> • LnAlgo::PRECISION_1ULP_FTZ_FALSE:通过软件仿真实现,支持Subnormal数据计算,最大精度误差为1ulp。 | |
| 52 | | U | 源操作数和目的操作数的RegTensor类型,例如RegTensor<half>,由编译器自动推导,用户不需要填写。 | | 52 | | U | 源操作数和目的操作数的RegTensor类型,例如RegTensor<half>,由编译器自动推导,用户不需要填写。 | |
| 53 | 53 | ||
| 54 | **表 2** 参数说明 | 54 | **表 2** 参数说明 |
| @@ -73,18 +73,26 @@ __simd_callee__ inline void Ln(U& dstReg, U& srcReg, MaskReg& mask) | |||
| 73 | 73 | ||
| 74 | ## 关键特性说明 | 74 | ## 关键特性说明 |
| 75 | 75 | ||
| 76 | -**最大精度误差:** | 76 | +### 最大精度误差 |
| 77 | 77 | ||
| 78 | -- LnAlgo::INTRINSIC、LnAlgo::PRECISION_1ULP_FTZ_TRUE,最大精度误差为1ulp。 | 78 | +LnAlgo::INTRINSIC、LnAlgo::PRECISION_1ULP_FTZ_TRUE和LnAlgo::PRECISION_1ULP_FTZ_FALSE的最大精度误差均为1ulp。 |
| 79 | -- LnAlgo::PRECISION_1ULP_FTZ_FALSE,最大精度误差为1ulp。 | ||
| 80 | 79 | ||
| 81 | -**配置Subnormal模式**: | 80 | +### 配置Subnormal模式 |
| 82 | -<br> | 81 | + |
| 83 | -FTZ(Flush To Zero):一种浮点运算模式,当结果为Subnormal时,将其直接清零(近似为0),而非保留其精确的微小数值。 | 82 | +FTZ(Flush-To-Zero):一种浮点运算模式,当结果为Subnormal时,将其直接清零(近似为0),而非保留其精确的微小数值。 |
| 84 | -<br> | 83 | + |
| 85 | -只有将algo设置为LnAlgo::PRECISION_1ULP_FTZ_FALSE时,Ln接口才会保留并正确输出Subnormal结果;其他模式下Subnormal均被FTZ。 | 84 | +#### 默认算法 |
| 86 | -<br> | 85 | + |
| 87 | -一般场景推荐使用性能更好的LnAlgo::INTRINSIC、LnAlgo::PRECISION_1ULP_FTZ_TRUE;需要精确Subnormal输出的场景(如特定数据精度要求的算法、避免除零错误)使用LnAlgo::PRECISION_1ULP_FTZ_FALSE。 | 86 | +LnAlgo::INTRINSIC为默认算法。--cce-ftz=false时保留Subnormal;--cce-ftz=true(默认值)时采用FTZ模式。 |
| 87 | + | ||
| 88 | +#### 显式指定的算法 | ||
| 89 | + | ||
| 90 | +- LnAlgo::PRECISION_1ULP_FTZ_TRUE使用单指令计算,始终采用FTZ模式。 | ||
| 91 | +- LnAlgo::PRECISION_1ULP_FTZ_FALSE通过软件仿真实现,支持Subnormal数据计算。 | ||
| 92 | + | ||
| 93 | +#### 使用建议 | ||
| 94 | + | ||
| 95 | +由于保留Subnormal的计算行为通过软件仿真实现,在--cce-ftz=true(默认值)时,一般场景建议使用默认的LnAlgo::INTRINSIC或显式选择LnAlgo::PRECISION_1ULP_FTZ_TRUE,以获得更好的性能;需要精确输出Subnormal时,使用LnAlgo::PRECISION_1ULP_FTZ_FALSE。 | ||
| 88 | 96 | ||
| 89 | ## 调用示例<a name="section642mcpsimp"></a> | 97 | ## 调用示例<a name="section642mcpsimp"></a> |
| 90 | 98 | ||
| @@ -95,16 +103,16 @@ __simd_vf__ inline void LnVF(__ubuf__ T* dstAddr, __ubuf__ T* srcAddr, uint32_t | |||
| 95 | AscendC::Reg::RegTensor<T> srcReg; | 103 | AscendC::Reg::RegTensor<T> srcReg; |
| 96 | AscendC::Reg::RegTensor<T> dstReg; | 104 | AscendC::Reg::RegTensor<T> dstReg; |
| 97 | AscendC::Reg::MaskReg mask; | 105 | AscendC::Reg::MaskReg mask; |
| 98 | - // Subnormal模式 | 106 | + // 1ulp精度及Subnormal模式 |
| 99 | - // static constexpr AscendC::Reg::LnSpecificMode mode = {MaskMergeMode::ZEROING, LnAlgo::PRECISION_1ULP_FTZ_FALSE}; | 107 | + // static constexpr AscendC::Reg::LnSpecificMode mode = { |
| 108 | + // AscendC::Reg::MaskMergeMode::ZEROING, AscendC::LnAlgo::PRECISION_1ULP_FTZ_FALSE}; | ||
| 100 | for (uint16_t i = 0; i < repeatTimes; i++) { | 109 | for (uint16_t i = 0; i < repeatTimes; i++) { |
| 101 | mask = AscendC::Reg::UpdateMask<T>(count); | 110 | mask = AscendC::Reg::UpdateMask<T>(count); |
| 102 | AscendC::Reg::LoadAlign(srcReg, srcAddr + i * oneRepeatSize); | 111 | AscendC::Reg::LoadAlign(srcReg, srcAddr + i * oneRepeatSize); |
| 103 | AscendC::Reg::Ln(dstReg, srcReg, mask); | 112 | AscendC::Reg::Ln(dstReg, srcReg, mask); |
| 104 | - // Subnormal模式 | 113 | + // 1ulp精度及Subnormal模式 |
| 105 | // AscendC::Reg::Ln<T, &mode>(dstReg, srcReg, mask); | 114 | // AscendC::Reg::Ln<T, &mode>(dstReg, srcReg, mask); |
| 106 | AscendC::Reg::StoreAlign(dstAddr + i * oneRepeatSize, dstReg, mask); | 115 | AscendC::Reg::StoreAlign(dstAddr + i * oneRepeatSize, dstReg, mask); |
| 107 | } | 116 | } |
| 108 | } | 117 | } |
| 109 | ``` | 118 | ``` |
| 110 | - | ||
| @@ -48,7 +48,7 @@ __simd_callee__ inline void Log(U& dstReg, U& srcReg, MaskReg& mask) | |||
| 48 | | 参数名 | 描述 | | 48 | | 参数名 | 描述 | |
| 49 | | --- | --- | | 49 | | --- | --- | |
| 50 | | T | 操作数数据类型。支持的数据类型请参考[数据类型](#数据类型)。 | | 50 | | T | 操作数数据类型。支持的数据类型请参考[数据类型](#数据类型)。 | |
| 51 | -| mode | 可配置为[MaskMergeMode](../aux_data_types/MaskMergeMode.md)枚举类型或LogSpecificMode的结构体指针。<br>• 配置MaskMergeMode,选择MERGING模式或ZEROING模式。<br> • ZEROING模式下,mask未筛选的元素在dstReg中置零。<br> • MERGING模式当前不支持。<br>• 配置LogSpecificMode,定义如下:<br><code>enum class LogAlgo {<br> INTRINSIC = 0,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct LogSpecificMode {<br> MaskMergeMode mrgMode = MaskMergeMode::ZEROING,<br> LogAlgo algo = LogAlgo::INTRINSIC;<br>};</code><br>• mrgMode:选择MERGING模式或ZEROING模式。<br>• algo:用于配置Subnormal模式。<br> • LogAlgo::INTRINSIC、LogAlgo::PRECISION_1ULP_FTZ_TRUE,使用单指令计算得出结果,最大精度误差为1ulp。目前,该算法支持half、float数据类型。<br> • LogAlgo::PRECISION_1ULP_FTZ_FALSE,支持Subnormal数据计算,最大精度误差为1ulp。目前,该算法支持half、float数据类型。 | | 51 | +| mode | 可配置为[MaskMergeMode](../aux_data_types/MaskMergeMode.md)枚举值或指向LogSpecificMode结构体的指针。<br>• 配置MaskMergeMode:选择MERGING模式或ZEROING模式。<br> • ZEROING模式下,mask未筛选的元素在dstReg中置零。<br> • MERGING模式当前不支持。<br>• 配置LogSpecificMode,定义如下:<br><code>enum class LogAlgo {<br> INTRINSIC = 0,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct LogSpecificMode {<br> MaskMergeMode mrgMode = MaskMergeMode::ZEROING;<br> LogAlgo algo = LogAlgo::INTRINSIC;<br>};</code><br>• mrgMode:选择MERGING模式或ZEROING模式。<br>• algo:用于选择Log算法及配置Subnormal模式,详细说明请参考[关键特性说明](#关键特性说明)。<br> • LogAlgo::INTRINSIC:默认算法,最大精度误差为1ulp。对于half、float类型,Subnormal处理受编译选项--cce-ftz控制(默认值为true)。<br> • LogAlgo::PRECISION_1ULP_FTZ_TRUE:使用单指令计算,最大精度误差为1ulp。<br> • LogAlgo::PRECISION_1ULP_FTZ_FALSE:通过软件仿真实现,支持Subnormal数据计算,最大精度误差为1ulp。 | |
| 52 | | U | 源操作数和目的操作数的RegTensor类型,例如RegTensor<half>,由编译器自动推导,用户不需要填写。 | | 52 | | U | 源操作数和目的操作数的RegTensor类型,例如RegTensor<half>,由编译器自动推导,用户不需要填写。 | |
| 53 | 53 | ||
| 54 | **表2** 参数说明 | 54 | **表2** 参数说明 |
| @@ -73,18 +73,26 @@ __simd_callee__ inline void Log(U& dstReg, U& srcReg, MaskReg& mask) | |||
| 73 | 73 | ||
| 74 | ## 关键特性说明 | 74 | ## 关键特性说明 |
| 75 | 75 | ||
| 76 | -**最大精度误差** | 76 | +### 最大精度误差 |
| 77 | 77 | ||
| 78 | -- LogAlgo::INTRINSIC、LogAlgo::PRECISION_1ULP_FTZ_TRUE,最大精度误差为1ulp。 | 78 | +LogAlgo::INTRINSIC、LogAlgo::PRECISION_1ULP_FTZ_TRUE和LogAlgo::PRECISION_1ULP_FTZ_FALSE的最大精度误差均为1ulp。 |
| 79 | -- LogAlgo::PRECISION_1ULP_FTZ_FALSE,最大精度误差为1ulp。 | ||
| 80 | 79 | ||
| 81 | -**配置Subnormal模式**: | 80 | +### 配置Subnormal模式 |
| 82 | -<br> | 81 | + |
| 83 | -FTZ(Flush To Zero):一种浮点运算模式,当结果为Subnormal时,将其直接清零(近似为0),而非保留其精确的微小数值。 | 82 | +FTZ(Flush-To-Zero):一种浮点运算模式,当结果为Subnormal时,将其直接清零(近似为0),而非保留其精确的微小数值。 |
| 84 | -<br> | 83 | + |
| 85 | -只有将algo设置为LogAlgo::PRECISION_1ULP_FTZ_FALSE时,Log接口才会保留并正确输出Subnormal结果;其他模式下Subnormal均被FTZ。 | 84 | +#### 默认算法 |
| 86 | -<br> | 85 | + |
| 87 | -一般场景推荐使用性能更好的LogAlgo::INTRINSIC、LogAlgo::PRECISION_1ULP_FTZ_TRUE;需要精确Subnormal输出的场景(如特定数据精度要求的算法、避免除零错误)使用LogAlgo::PRECISION_1ULP_FTZ_FALSE。 | 86 | +LogAlgo::INTRINSIC为默认算法。--cce-ftz=false时保留Subnormal;--cce-ftz=true(默认值)时采用FTZ模式。 |
| 87 | + | ||
| 88 | +#### 显式指定的算法 | ||
| 89 | + | ||
| 90 | +- LogAlgo::PRECISION_1ULP_FTZ_TRUE使用单指令计算,始终采用FTZ模式。 | ||
| 91 | +- LogAlgo::PRECISION_1ULP_FTZ_FALSE通过软件仿真实现,支持Subnormal数据计算。 | ||
| 92 | + | ||
| 93 | +#### 使用建议 | ||
| 94 | + | ||
| 95 | +由于保留Subnormal的计算行为通过软件仿真实现,在--cce-ftz=true(默认值)时,一般场景建议使用默认的LogAlgo::INTRINSIC或显式选择LogAlgo::PRECISION_1ULP_FTZ_TRUE,以获得更好的性能;需要精确输出Subnormal时,使用LogAlgo::PRECISION_1ULP_FTZ_FALSE。 | ||
| 88 | 96 | ||
| 89 | ## 调用示例<a name="section642mcpsimp"></a> | 97 | ## 调用示例<a name="section642mcpsimp"></a> |
| 90 | 98 | ||
| @@ -95,13 +103,14 @@ __simd_vf__ inline void LogVF(__ubuf__ T* dstAddr, __ubuf__ T* srcAddr, uint32_t | |||
| 95 | AscendC::Reg::RegTensor<T> srcReg; | 103 | AscendC::Reg::RegTensor<T> srcReg; |
| 96 | AscendC::Reg::RegTensor<T> dstReg; | 104 | AscendC::Reg::RegTensor<T> dstReg; |
| 97 | AscendC::Reg::MaskReg mask; | 105 | AscendC::Reg::MaskReg mask; |
| 98 | - // Subnormal模式 | 106 | + // 1ulp精度及Subnormal模式 |
| 99 | - // static constexpr AscendC::Reg::LogSpecificMode mode = {MaskMergeMode::ZEROING, LogAlgo::PRECISION_1ULP_FTZ_FALSE}; | 107 | + // static constexpr AscendC::Reg::LogSpecificMode mode = { |
| 108 | + // AscendC::Reg::MaskMergeMode::ZEROING, AscendC::LogAlgo::PRECISION_1ULP_FTZ_FALSE}; | ||
| 100 | for (uint16_t i = 0; i < repeatTimes; i++) { | 109 | for (uint16_t i = 0; i < repeatTimes; i++) { |
| 101 | mask = AscendC::Reg::UpdateMask<T>(count); | 110 | mask = AscendC::Reg::UpdateMask<T>(count); |
| 102 | AscendC::Reg::LoadAlign(srcReg, srcAddr + i * oneRepeatSize); | 111 | AscendC::Reg::LoadAlign(srcReg, srcAddr + i * oneRepeatSize); |
| 103 | AscendC::Reg::Log(dstReg, srcReg, mask); | 112 | AscendC::Reg::Log(dstReg, srcReg, mask); |
| 104 | - // Subnormal模式 | 113 | + // 1ulp精度及Subnormal模式 |
| 105 | // AscendC::Reg::Log<DTYPE, &mode>(dstReg, srcReg, mask); | 114 | // AscendC::Reg::Log<DTYPE, &mode>(dstReg, srcReg, mask); |
| 106 | AscendC::Reg::StoreAlign(dstAddr + i * oneRepeatSize, dstReg, mask); | 115 | AscendC::Reg::StoreAlign(dstAddr + i * oneRepeatSize, dstReg, mask); |
| 107 | } | 116 | } |
| @@ -50,7 +50,7 @@ __simd_callee__ inline void Log10(U& dstReg, U& srcReg, MaskReg& mask) | |||
| 50 | | 参数名 | 描述 | | 50 | | 参数名 | 描述 | |
| 51 | | --- | --- | | 51 | | --- | --- | |
| 52 | | T | 操作数数据类型。支持的数据类型请参考[数据类型](#数据类型)。 | | 52 | | T | 操作数数据类型。支持的数据类型请参考[数据类型](#数据类型)。 | |
| 53 | -| mode | 可配置为[MaskMergeMode](../aux_data_types/MaskMergeMode.md)枚举类型或Log10SpecificMode的结构体。<br>• 配置MaskMergeMode枚举类型选择MERGING模式或ZEROING模式。<br> • ZEROING模式下,mask未筛选的元素在dstReg中置零。<br> • MERGING模式当前不支持。<br>• Log10SpecificMode,定义如下:<br><code>enum class Log10Algo {<br> INTRINSIC = 0,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct Log10SpecificMode{<br> MaskMergeMode mrgMode = MaskMergeMode::ZEROING,<br> Log10Algo algo = Log10Algo::INTRINSIC;<br>};</code><br>• mrgMode:选择MERGING模式或ZEROING模式。<br>• algo:用于配置Subnormal模式。<br> • Log10Algo::INTRINSIC、Log10Algo::PRECISION_1ULP_FTZ_TRUE,使用单指令计算得出结果,所有Subnormal被近似为0。<br> • Log10Algo::PRECISION_1ULP_FTZ_FALSE,支持Subnormal数据计算。 | | 53 | +| mode | 可配置为[MaskMergeMode](../aux_data_types/MaskMergeMode.md)枚举值或指向Log10SpecificMode结构体的指针。<br>• 配置MaskMergeMode:选择MERGING模式或ZEROING模式。<br> • ZEROING模式下,mask未筛选的元素在dstReg中置零。<br> • MERGING模式当前不支持。<br>• 配置Log10SpecificMode,定义如下:<br><code>enum class Log10Algo {<br> INTRINSIC = 0,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct Log10SpecificMode {<br> MaskMergeMode mrgMode = MaskMergeMode::ZEROING;<br> Log10Algo algo = Log10Algo::INTRINSIC;<br>};</code><br>• mrgMode:选择MERGING模式或ZEROING模式。<br>• algo:用于选择Log10算法及配置Subnormal模式,详细说明请参考[关键特性说明](#关键特性说明)。<br> • Log10Algo::INTRINSIC:默认算法,最大精度误差为1ulp。对于half、float类型,Subnormal处理受编译选项--cce-ftz控制(默认值为true)。<br> • Log10Algo::PRECISION_1ULP_FTZ_TRUE:使用单指令计算,最大精度误差为1ulp。<br> • Log10Algo::PRECISION_1ULP_FTZ_FALSE:通过软件仿真实现,支持Subnormal数据计算,最大精度误差为1ulp。 | |
| 54 | | U | 目的操作数的RegTensor类型,例如RegTensor<half>,由编译器自动推导,用户不需要填写。 | | 54 | | U | 目的操作数的RegTensor类型,例如RegTensor<half>,由编译器自动推导,用户不需要填写。 | |
| 55 | 55 | ||
| 56 | **表2** 参数说明 | 56 | **表2** 参数说明 |
| @@ -75,22 +75,30 @@ __simd_callee__ inline void Log10(U& dstReg, U& srcReg, MaskReg& mask) | |||
| 75 | 75 | ||
| 76 | ## 关键特性说明 | 76 | ## 关键特性说明 |
| 77 | 77 | ||
| 78 | -**精度提升** | 78 | +### 精度提升 |
| 79 | 79 | ||
| 80 | 当源操作数数据类型为half时,将half提升精度到float后进行计算,再将结果转为half后输出。 | 80 | 当源操作数数据类型为half时,将half提升精度到float后进行计算,再将结果转为half后输出。 |
| 81 | 81 | ||
| 82 | -**最大精度误差** | 82 | +### 最大精度误差 |
| 83 | 83 | ||
| 84 | -- Log10Algo::INTRINSIC、Log10Algo::PRECISION_1ULP_FTZ_TRUE,最大精度误差为1ulp。 | 84 | +Log10Algo::INTRINSIC、Log10Algo::PRECISION_1ULP_FTZ_TRUE和Log10Algo::PRECISION_1ULP_FTZ_FALSE的最大精度误差均为1ulp。 |
| 85 | -- Log10Algo::PRECISION_1ULP_FTZ_FALSE,最大精度误差为1ulp。 | ||
| 86 | 85 | ||
| 87 | -**配置Subnormal模式**: | 86 | +### 配置Subnormal模式 |
| 88 | -<br> | 87 | + |
| 89 | -FTZ(Flush To Zero):一种浮点运算模式,当结果为Subnormal时,将其直接清零(近似为0),而非保留其精确的微小数值。 | 88 | +FTZ(Flush-To-Zero):一种浮点运算模式,当结果为Subnormal时,将其直接清零(近似为0),而非保留其精确的微小数值。 |
| 90 | -<br> | 89 | + |
| 91 | -只有将algo设置为Log10Algo::PRECISION_1ULP_FTZ_FALSE时,Log10接口才会保留并正确输出Subnormal结果;其他模式下Subnormal均被FTZ。 | 90 | +#### 默认算法 |
| 92 | -<br> | 91 | + |
| 93 | -一般场景推荐使用性能更好的Log10Algo::INTRINSIC、Log10Algo::PRECISION_1ULP_FTZ_TRUE;需要精确Subnormal输出的场景(如特定数据精度要求的算法、避免除零错误)使用Log10Algo::PRECISION_1ULP_FTZ_FALSE。 | 92 | +Log10Algo::INTRINSIC为默认算法。--cce-ftz=false时保留Subnormal;--cce-ftz=true(默认值)时采用FTZ模式。 |
| 93 | + | ||
| 94 | +#### 显式指定的算法 | ||
| 95 | + | ||
| 96 | +- Log10Algo::PRECISION_1ULP_FTZ_TRUE使用单指令计算,始终采用FTZ模式。 | ||
| 97 | +- Log10Algo::PRECISION_1ULP_FTZ_FALSE通过软件仿真实现,支持Subnormal数据计算。 | ||
| 98 | + | ||
| 99 | +#### 使用建议 | ||
| 100 | + | ||
| 101 | +由于保留Subnormal的计算行为通过软件仿真实现,在--cce-ftz=true(默认值)时,一般场景建议使用默认的Log10Algo::INTRINSIC或显式选择Log10Algo::PRECISION_1ULP_FTZ_TRUE,以获得更好的性能;需要精确输出Subnormal时,使用Log10Algo::PRECISION_1ULP_FTZ_FALSE。 | ||
| 94 | 102 | ||
| 95 | ## 调用示例<a name="section642mcpsimp"></a> | 103 | ## 调用示例<a name="section642mcpsimp"></a> |
| 96 | 104 | ||
| @@ -101,13 +109,14 @@ __simd_vf__ inline void Log10VF(__ubuf__ T* dstAddr, __ubuf__ T* srcAddr, uint32 | |||
| 101 | AscendC::Reg::RegTensor<T> srcReg; | 109 | AscendC::Reg::RegTensor<T> srcReg; |
| 102 | AscendC::Reg::RegTensor<T> dstReg; | 110 | AscendC::Reg::RegTensor<T> dstReg; |
| 103 | AscendC::Reg::MaskReg mask; | 111 | AscendC::Reg::MaskReg mask; |
| 104 | - // Subnormal模式 | 112 | + // 1ulp精度及Subnormal模式 |
| 105 | - // static constexpr AscendC::Reg::Log10SpecificMode mode = {MaskMergeMode::ZEROING, Log10Algo::PRECISION_1ULP_FTZ_FALSE}; | 113 | + // static constexpr AscendC::Reg::Log10SpecificMode mode = { |
| 114 | + // AscendC::Reg::MaskMergeMode::ZEROING, AscendC::Log10Algo::PRECISION_1ULP_FTZ_FALSE}; | ||
| 106 | for (uint16_t i = 0; i < repeatTimes; i++) { | 115 | for (uint16_t i = 0; i < repeatTimes; i++) { |
| 107 | mask = AscendC::Reg::UpdateMask<T>(count); | 116 | mask = AscendC::Reg::UpdateMask<T>(count); |
| 108 | AscendC::Reg::LoadAlign(srcReg, srcAddr + i * oneRepeatSize); | 117 | AscendC::Reg::LoadAlign(srcReg, srcAddr + i * oneRepeatSize); |
| 109 | AscendC::Reg::Log10(dstReg, srcReg, mask); | 118 | AscendC::Reg::Log10(dstReg, srcReg, mask); |
| 110 | - // Subnormal模式 | 119 | + // 1ulp精度及Subnormal模式 |
| 111 | // AscendC::Reg::Log10<DTYPE, &mode>(dstReg, srcReg, mask); | 120 | // AscendC::Reg::Log10<DTYPE, &mode>(dstReg, srcReg, mask); |
| 112 | AscendC::Reg::StoreAlign(dstAddr + i * oneRepeatSize, dstReg, mask); | 121 | AscendC::Reg::StoreAlign(dstAddr + i * oneRepeatSize, dstReg, mask); |
| 113 | } | 122 | } |
| @@ -50,7 +50,7 @@ __simd_callee__ inline void Log2(U& dstReg, U& srcReg, MaskReg& mask) | |||
| 50 | | 参数名 | 描述 | | 50 | | 参数名 | 描述 | |
| 51 | | --- | --- | | 51 | | --- | --- | |
| 52 | | T | 操作数数据类型。支持的数据类型请参考[数据类型](#数据类型)。 | | 52 | | T | 操作数数据类型。支持的数据类型请参考[数据类型](#数据类型)。 | |
| 53 | -| mode | 可配置为[MaskMergeMode](../aux_data_types/MaskMergeMode.md)枚举类型或Log2SpecificMode的结构体实例。<br>• 配置MaskMergeMode枚举类型选择MERGING模式或ZEROING模式。<br> • ZEROING模式下,mask未筛选的元素在dstReg中置零。<br> • MERGING模式当前不支持。<br>• Log2SpecificMode,定义如下:<br><code>enum class Log2Algo {<br> INTRINSIC = 0,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct Log2SpecificMode{<br> MaskMergeMode mrgMode = MaskMergeMode::ZEROING,<br> Log2Algo algo = Log2Algo::INTRINSIC;<br>};</code><br>• mrgMode:选择MERGING模式或ZEROING模式。<br>• algo:用于配置Subnormal模式。<br> • Log2Algo::INTRINSIC、Log2Algo::PRECISION_1ULP_FTZ_TRUE,所有Subnormal被近似为0。<br> • Log2Algo::PRECISION_1ULP_FTZ_FALSE,支持Subnormal数据计算。 | | 53 | +| mode | 可配置为[MaskMergeMode](../aux_data_types/MaskMergeMode.md)枚举值或指向Log2SpecificMode结构体的指针。<br>• 配置MaskMergeMode:选择MERGING模式或ZEROING模式。<br> • ZEROING模式下,mask未筛选的元素在dstReg中置零。<br> • MERGING模式当前不支持。<br>• 配置Log2SpecificMode,定义如下:<br><code>enum class Log2Algo {<br> INTRINSIC = 0,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct Log2SpecificMode {<br> MaskMergeMode mrgMode = MaskMergeMode::ZEROING;<br> Log2Algo algo = Log2Algo::INTRINSIC;<br>};</code><br>• mrgMode:选择MERGING模式或ZEROING模式。<br>• algo:用于选择Log2算法及配置Subnormal模式,详细说明请参考[关键特性说明](#关键特性说明)。<br> • Log2Algo::INTRINSIC:默认算法,最大精度误差为1ulp。对于half、float类型,Subnormal处理受编译选项--cce-ftz控制(默认值为true)。<br> • Log2Algo::PRECISION_1ULP_FTZ_TRUE:使用单指令计算,最大精度误差为1ulp。<br> • Log2Algo::PRECISION_1ULP_FTZ_FALSE:通过软件仿真实现,支持Subnormal数据计算,最大精度误差为1ulp。 | |
| 54 | | U | 目的操作数的RegTensor类型,例如RegTensor<half>,由编译器自动推导,用户不需要填写。 | | 54 | | U | 目的操作数的RegTensor类型,例如RegTensor<half>,由编译器自动推导,用户不需要填写。 | |
| 55 | 55 | ||
| 56 | **表2** 参数说明 | 56 | **表2** 参数说明 |
| @@ -75,22 +75,30 @@ __simd_callee__ inline void Log2(U& dstReg, U& srcReg, MaskReg& mask) | |||
| 75 | 75 | ||
| 76 | ## 关键特性说明 | 76 | ## 关键特性说明 |
| 77 | 77 | ||
| 78 | -**精度提升** | 78 | +### 精度提升 |
| 79 | 79 | ||
| 80 | 当源操作数数据类型为half时,将half提升精度到float后进行计算,再将结果转为half后输出。 | 80 | 当源操作数数据类型为half时,将half提升精度到float后进行计算,再将结果转为half后输出。 |
| 81 | 81 | ||
| 82 | -**最大精度误差** | 82 | +### 最大精度误差 |
| 83 | 83 | ||
| 84 | -- Log2Algo::INTRINSIC、Log2Algo::PRECISION_1ULP_FTZ_TRUE,最大精度误差为1ulp。 | 84 | +Log2Algo::INTRINSIC、Log2Algo::PRECISION_1ULP_FTZ_TRUE和Log2Algo::PRECISION_1ULP_FTZ_FALSE的最大精度误差均为1ulp。 |
| 85 | -- Log2Algo::PRECISION_1ULP_FTZ_FALSE,最大精度误差为1ulp。 | ||
| 86 | 85 | ||
| 87 | -**配置Subnormal模式**: | 86 | +### 配置Subnormal模式 |
| 88 | -<br> | 87 | + |
| 89 | -FTZ(Flush To Zero):一种浮点运算模式,当结果为Subnormal时,将其直接清零(近似为0),而非保留其精确的微小数值。 | 88 | +FTZ(Flush-To-Zero):一种浮点运算模式,当结果为Subnormal时,将其直接清零(近似为0),而非保留其精确的微小数值。 |
| 90 | -<br> | 89 | + |
| 91 | -只有将algo设置为Log2Algo::PRECISION_1ULP_FTZ_FALSE时,Log2接口才会保留并正确输出Subnormal结果;其他模式下Subnormal均被FTZ。 | 90 | +#### 默认算法 |
| 92 | -<br> | 91 | + |
| 93 | -一般场景推荐使用性能更好的Log2Algo::INTRINSIC、Log2Algo::PRECISION_1ULP_FTZ_TRUE;需要精确Subnormal输出的场景(如特定数据精度要求的算法、避免除零错误)使用Log2Algo::PRECISION_1ULP_FTZ_FALSE。 | 92 | +Log2Algo::INTRINSIC为默认算法。--cce-ftz=false时保留Subnormal;--cce-ftz=true(默认值)时采用FTZ模式。 |
| 93 | + | ||
| 94 | +#### 显式指定的算法 | ||
| 95 | + | ||
| 96 | +- Log2Algo::PRECISION_1ULP_FTZ_TRUE使用单指令计算,始终采用FTZ模式。 | ||
| 97 | +- Log2Algo::PRECISION_1ULP_FTZ_FALSE通过软件仿真实现,支持Subnormal数据计算。 | ||
| 98 | + | ||
| 99 | +#### 使用建议 | ||
| 100 | + | ||
| 101 | +由于保留Subnormal的计算行为通过软件仿真实现,在--cce-ftz=true(默认值)时,一般场景建议使用默认的Log2Algo::INTRINSIC或显式选择Log2Algo::PRECISION_1ULP_FTZ_TRUE,以获得更好的性能;需要精确输出Subnormal时,使用Log2Algo::PRECISION_1ULP_FTZ_FALSE。 | ||
| 94 | 102 | ||
| 95 | ## 调用示例<a name="section642mcpsimp"></a> | 103 | ## 调用示例<a name="section642mcpsimp"></a> |
| 96 | 104 | ||
| @@ -101,13 +109,14 @@ __simd_vf__ inline void Log2VF(__ubuf__ T* dstAddr, __ubuf__ T* srcAddr, uint32_ | |||
| 101 | AscendC::Reg::RegTensor<T> srcReg; | 109 | AscendC::Reg::RegTensor<T> srcReg; |
| 102 | AscendC::Reg::RegTensor<T> dstReg; | 110 | AscendC::Reg::RegTensor<T> dstReg; |
| 103 | AscendC::Reg::MaskReg mask; | 111 | AscendC::Reg::MaskReg mask; |
| 104 | - // Subnormal模式 | 112 | + // 1ulp精度及Subnormal模式 |
| 105 | - // static constexpr AscendC::Reg::Log2SpecificMode mode = {MaskMergeMode::ZEROING, Log2Algo::PRECISION_1ULP_FTZ_FALSE}; | 113 | + // static constexpr AscendC::Reg::Log2SpecificMode mode = { |
| 114 | + // AscendC::Reg::MaskMergeMode::ZEROING, AscendC::Log2Algo::PRECISION_1ULP_FTZ_FALSE}; | ||
| 106 | for (uint16_t i = 0; i < repeatTimes; i++) { | 115 | for (uint16_t i = 0; i < repeatTimes; i++) { |
| 107 | mask = AscendC::Reg::UpdateMask<T>(count); | 116 | mask = AscendC::Reg::UpdateMask<T>(count); |
| 108 | AscendC::Reg::LoadAlign(srcReg, srcAddr + i * oneRepeatSize); | 117 | AscendC::Reg::LoadAlign(srcReg, srcAddr + i * oneRepeatSize); |
| 109 | AscendC::Reg::Log2(dstReg, srcReg, mask); | 118 | AscendC::Reg::Log2(dstReg, srcReg, mask); |
| 110 | - // Subnormal模式 | 119 | + // 1ulp精度及Subnormal模式 |
| 111 | // AscendC::Reg::Log2<T, &mode>(dstReg, srcReg, mask); | 120 | // AscendC::Reg::Log2<T, &mode>(dstReg, srcReg, mask); |
| 112 | AscendC::Reg::StoreAlign(dstAddr + i * oneRepeatSize, dstReg, mask); | 121 | AscendC::Reg::StoreAlign(dstAddr + i * oneRepeatSize, dstReg, mask); |
| 113 | } | 122 | } |
| @@ -48,7 +48,7 @@ __simd_callee__ inline void Sqrt(U& dstReg, U& srcReg, MaskReg& mask) | |||
| 48 | | 参数名 | 描述 | | 48 | | 参数名 | 描述 | |
| 49 | | --- | --- | | 49 | | --- | --- | |
| 50 | | T | 操作数数据类型。支持的数据类型请参考[数据类型](#数据类型)。 | | 50 | | T | 操作数数据类型。支持的数据类型请参考[数据类型](#数据类型)。 | |
| 51 | -| mode | 可配置为[MaskMergeMode](../aux_data_types/MaskMergeMode.md)枚举类型的枚举或SqrtSpecificMode的结构体指针。<br>• MaskMergeMode,选择MERGING模式或ZEROING模式。<br> • ZEROING模式下,mask未筛选的元素在dstReg中置零。<br> • MERGING模式当前不支持。<br>• SqrtSpecificMode,定义如下:<br><code>enum class SqrtAlgo {<br> INTRINSIC = 0,<br> FAST_INVERSE,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_0ULP_FTZ_FALSE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct SqrtSpecificMode {<br> MaskMergeMode mrgMode = MaskMergeMode::ZEROING,<br> bool precisionMode = false;<br> SqrtAlgo algo = SqrtAlgo::INTRINSIC;<br>};</code><br>• mrgMode:选择MERGING模式或ZEROING模式。<br>• precisionMode:用于配置精度模式。当precisionMode为true时,使能更高精度的Sqrt计算,使用快速求逆算法得出结果。该算法目前只针对float数据类型生效。<br>• algo:用于配置Subnormal模式,具体参考[关键特性说明](#关键特性说明)。<br> • SqrtAlgo::INTRINSIC、SqrtAlgo::PRECISION_1ULP_FTZ_TRUE,使用单指令计算得出结果,最大精度误差为1ulp。<br> • SqrtAlgo::FAST_INVERSE、SqrtAlgo::PRECISION_0ULP_FTZ_FALSE,使用快速求逆算法得出结果。目前,该算法仅支持float数据类型,并在该模式下支持Subnormal数据计算。<br> • SqrtAlgo::PRECISION_1ULP_FTZ_FALSE,最大精度误差为1ulp。 | | 51 | +| mode | 可配置为[MaskMergeMode](../aux_data_types/MaskMergeMode.md)枚举值或指向SqrtSpecificMode结构体的指针。<br>• 配置MaskMergeMode:选择MERGING模式或ZEROING模式。<br> • ZEROING模式下,mask未筛选的元素在dstReg中置零。<br> • MERGING模式当前不支持。<br>• 配置SqrtSpecificMode,定义如下:<br><code>enum class SqrtAlgo {<br> INTRINSIC = 0,<br> FAST_INVERSE,<br> PRECISION_1ULP_FTZ_TRUE,<br> PRECISION_0ULP_FTZ_FALSE,<br> PRECISION_1ULP_FTZ_FALSE,<br>};<br>struct SqrtSpecificMode {<br> MaskMergeMode mrgMode = MaskMergeMode::ZEROING;<br> bool precisionMode = false;<br> SqrtAlgo algo = SqrtAlgo::INTRINSIC;<br>};</code><br>• mrgMode:选择MERGING模式或ZEROING模式。<br>• precisionMode:用于配置精度模式。当precisionMode为true时,使能更高精度的Sqrt计算,使用快速求逆算法得出结果。该算法目前只针对float数据类型生效。<br>• algo:用于选择Sqrt算法及配置Subnormal模式,详细说明请参考[关键特性说明](#关键特性说明)。<br> • SqrtAlgo::INTRINSIC:默认算法,最大精度误差为1ulp。对于half、float类型,Subnormal处理受编译选项--cce-ftz控制(默认值为true)。<br> • SqrtAlgo::PRECISION_1ULP_FTZ_TRUE:使用单指令计算,最大精度误差为1ulp。<br> • SqrtAlgo::FAST_INVERSE和SqrtAlgo::PRECISION_0ULP_FTZ_FALSE:使用快速求逆算法得出结果。目前,该算法仅支持float类型,并在该模式下支持Subnormal数据计算。<br> • SqrtAlgo::PRECISION_1ULP_FTZ_FALSE:最大精度误差为1ulp,支持half类型的Subnormal数据计算。 | |
| 52 | | U | 源操作数和目的操作数的RegTensor类型,例如RegTensor<half>,由编译器自动推导,用户不需要填写。 | | 52 | | U | 源操作数和目的操作数的RegTensor类型,例如RegTensor<half>,由编译器自动推导,用户不需要填写。 | |
| 53 | 53 | ||
| 54 | **表 2** 参数说明 | 54 | **表 2** 参数说明 |
| @@ -74,19 +74,30 @@ __simd_callee__ inline void Sqrt(U& dstReg, U& srcReg, MaskReg& mask) | |||
| 74 | 74 | ||
| 75 | ## 关键特性说明 | 75 | ## 关键特性说明 |
| 76 | 76 | ||
| 77 | -**最大精度误差:** | 77 | +### 最大精度误差 |
| 78 | 78 | ||
| 79 | -- SqrtAlgo::INTRINSIC、SqrtAlgo::PRECISION_1ULP_FTZ_TRUE,最大精度误差为1ulp。 | 79 | +- precisionMode设置为true时,使用快速求逆算法进行高精度计算,最大精度误差为0ulp。 |
| 80 | -- SqrtAlgo::PRECISION_1ULP_FTZ_FALSE,最大精度误差为1ulp。 | 80 | +- precisionMode设置为false时: |
| 81 | -- SqrtAlgo::FAST_INVERSE、SqrtAlgo::PRECISION_0ULP_FTZ_FALSE,最大精度误差为0ulp。 | 81 | + - 最大精度误差为1ulp:SqrtAlgo::INTRINSIC、SqrtAlgo::PRECISION_1ULP_FTZ_TRUE和SqrtAlgo::PRECISION_1ULP_FTZ_FALSE。 |
| 82 | + - 最大精度误差为0ulp:SqrtAlgo::FAST_INVERSE和SqrtAlgo::PRECISION_0ULP_FTZ_FALSE。 | ||
| 82 | 83 | ||
| 83 | -**配置Subnormal模式:** | 84 | +### 配置Subnormal模式 |
| 84 | -<br> | 85 | + |
| 85 | -FTZ(Flush To Zero):一种浮点运算模式,当结果为Subnormal时,将其直接清零(近似为0),而非保留其精确的微小数值。 | 86 | +FTZ(Flush-To-Zero):一种浮点运算模式,当结果为Subnormal时,将其直接清零(近似为0),而非保留其精确的微小数值。 |
| 86 | -<br> | 87 | + |
| 87 | -只有将algo设置为SqrtAlgo::FAST_INVERSE、SqrtAlgo::PRECISION_0ULP_FTZ_FALSE、SqrtAlgo::PRECISION_1ULP_FTZ_FALSE时,Sqrt接口才会保留并正确输出Subnormal结果;其他模式下Subnormal均被FTZ。 | 88 | +#### 默认算法 |
| 88 | -<br> | 89 | + |
| 89 | -一般场景推荐使用性能更好的SqrtAlgo::INTRINSIC、SqrtAlgo::PRECISION_1ULP_FTZ_TRUE;需要精确Subnormal输出的场景(如特定数据精度要求的算法、避免除零错误)使用SqrtAlgo::FAST_INVERSE、SqrtAlgo::PRECISION_0ULP_FTZ_FALSE、PRECISION_1ULP_FTZ_FALSE。 | 90 | +SqrtAlgo::INTRINSIC为默认算法,支持half和float类型。--cce-ftz=false时保留Subnormal;--cce-ftz=true(默认值)时采用FTZ模式。 |
| 91 | + | ||
| 92 | +#### 显式指定的算法 | ||
| 93 | + | ||
| 94 | +- SqrtAlgo::PRECISION_1ULP_FTZ_TRUE使用单指令计算,始终采用FTZ模式。 | ||
| 95 | +- SqrtAlgo::FAST_INVERSE和SqrtAlgo::PRECISION_0ULP_FTZ_FALSE使用快速求逆算法,仅支持float类型,并支持Subnormal数据计算。 | ||
| 96 | +- SqrtAlgo::PRECISION_1ULP_FTZ_FALSE支持half类型的Subnormal数据计算。 | ||
| 97 | + | ||
| 98 | +#### 使用建议 | ||
| 99 | + | ||
| 100 | +由于保留Subnormal的计算行为通过软件仿真实现,在--cce-ftz=true(默认值)时,一般场景建议使用默认的SqrtAlgo::INTRINSIC或显式选择SqrtAlgo::PRECISION_1ULP_FTZ_TRUE,以获得更好的性能;需要精确输出Subnormal时,使用SqrtAlgo::FAST_INVERSE、SqrtAlgo::PRECISION_0ULP_FTZ_FALSE或SqrtAlgo::PRECISION_1ULP_FTZ_FALSE。 | ||
| 90 | 101 | ||
| 91 | **表 3** Sqrt Subnormal示例 | 102 | **表 3** Sqrt Subnormal示例 |
| 92 | 103 | ||
| @@ -105,9 +116,10 @@ __simd_vf__ inline void SqrtVF(__ubuf__ T* dstAddr, __ubuf__ T* srcAddr, uint32_ | |||
| 105 | AscendC::Reg::RegTensor<T> dstReg; | 116 | AscendC::Reg::RegTensor<T> dstReg; |
| 106 | AscendC::Reg::MaskReg mask; | 117 | AscendC::Reg::MaskReg mask; |
| 107 | // 高精度模式 | 118 | // 高精度模式 |
| 108 | - // static constexpr AscendC::Reg::SqrtSpecificMode mode = {MaskMergeMode::ZEROING, true}; | 119 | + // static constexpr AscendC::Reg::SqrtSpecificMode mode = {AscendC::Reg::MaskMergeMode::ZEROING, true}; |
| 109 | - // Subnormal模式 | 120 | + // 0ulp精度及Subnormal模式 |
| 110 | - // static constexpr AscendC::Reg::SqrtSpecificMode mode = {MaskMergeMode::ZEROING, true, SqrtAlgo::PRECISION_0ULP_FTZ_FALSE}; | 121 | + // static constexpr AscendC::Reg::SqrtSpecificMode mode = { |
| 122 | + // AscendC::Reg::MaskMergeMode::ZEROING, true, AscendC::SqrtAlgo::PRECISION_0ULP_FTZ_FALSE}; | ||
| 111 | for (uint16_t i = 0; i < repeatTimes; i++) { | 123 | for (uint16_t i = 0; i < repeatTimes; i++) { |
| 112 | mask = AscendC::Reg::UpdateMask<T>(count); | 124 | mask = AscendC::Reg::UpdateMask<T>(count); |
| 113 | AscendC::Reg::LoadAlign(srcReg, srcAddr + i * oneRepeatSize); | 125 | AscendC::Reg::LoadAlign(srcReg, srcAddr + i * oneRepeatSize); |
| @@ -38,7 +38,7 @@ | |||
| 38 | | Cube计算单元不支持s4类型。 | 对于int4b_t数据类型的矩阵乘计算,开发者需要先将int4b_t的数据Cast转换为int8_t类型,再进行Cube计算。 | Mmad | | 38 | | Cube计算单元不支持s4类型。 | 对于int4b_t数据类型的矩阵乘计算,开发者需要先将int4b_t的数据Cast转换为int8_t类型,再进行Cube计算。 | Mmad | |
| 39 | | Cube计算单元不支持L0A上ZZ到ZN的分形变化。 | L0A切分场景下,矩阵乘需要重新计算左矩阵的L0A地址。 | LoadData/LoadDataWithTranspose | | 39 | | Cube计算单元不支持L0A上ZZ到ZN的分形变化。 | L0A切分场景下,矩阵乘需要重新计算左矩阵的L0A地址。 | LoadData/LoadDataWithTranspose | |
| 40 | | Vector Core Membase架构切换到Regbase架构。 | 基础API部分场景性能降低。 | 基础API高维切分模式 | | 40 | | Vector Core Membase架构切换到Regbase架构。 | 基础API部分场景性能降低。 | 基础API高维切分模式 | |
| 41 | - | 硬件不支持Subnormal功能,当前使用软仿实现的Subnormal功能。 | 开发者需要通过设置config模板参数来配置Subnormal计算模式,具体请参考[矢量计算](./2201_to_3510_guide/basic_api_migration.md#section7364115741514)。 | Ln/Sqrt/Rsqrt/Div/Reciprocal/Exp | | 41 | + | 硬件不支持Subnormal功能,基础API和部分高阶API通过软件仿真实现Subnormal功能。 | 对于支持config参数的基础API,开发者可以通过设置config模板参数配置Subnormal计算模式;对于调用时未传入config参数的部分基础API和高阶API,处理方式受编译选项`--cce-ftz`影响,该选项默认为`true`。具体请参考[矢量计算](./2201_to_3510_guide/basic_api_migration.md#vector-compute)。 | Ln/Sqrt/Rsqrt/Div/Reciprocal/Exp及相关高阶API | |
| 42 | | 不支持4:2稀疏矩阵的计算。 | 开发者需要利用Vector Core的能力,进行矩阵稠密转稀疏操作。 | LoadDataWithSparse/MmadWithSparse | | 42 | | 不支持4:2稀疏矩阵的计算。 | 开发者需要利用Vector Core的能力,进行矩阵稠密转稀疏操作。 | LoadDataWithSparse/MmadWithSparse | |
| 43 | 43 | ||
| 44 | - 存储单元<a name="section_2201_to_3510_storage_unit_changes"></a> | 44 | - 存储单元<a name="section_2201_to_3510_storage_unit_changes"></a> |
| @@ -2,13 +2,13 @@ | |||
| 2 | 2 | ||
| 3 | 本节针对[NPU架构版本3510](../../../programming_guide/language_extension/simd_builtin_keywords.md#npu-arch)的芯片变更对基础API兼容性产生的影响进行说明,并提供基础API的兼容性适配方案。 | 3 | 本节针对[NPU架构版本3510](../../../programming_guide/language_extension/simd_builtin_keywords.md#npu-arch)的芯片变更对基础API兼容性产生的影响进行说明,并提供基础API的兼容性适配方案。 |
| 4 | 4 | ||
| 5 | -## 矢量计算<a name="section7364115741514"></a> | 5 | +## 矢量计算<a id="vector-compute"></a> |
| 6 | 6 | ||
| 7 | - **3510架构默认不支持Subnormal功能。** | 7 | - **3510架构默认不支持Subnormal功能。** |
| 8 | 8 | ||
| 9 | - **说明**:SubNormal浮点数指的是指数位全为0、尾数不为0的浮点数,用于表示比最小正常数更小的值,避免“下溢为0”。3510版本默认不支持Subnormal,Subnormal浮点数在计算中被视为0。 | 9 | + **说明**:Subnormal浮点数指的是指数位全为0、尾数不为0的浮点数,用于表示比最小正常数更小的值,避免“下溢为0”。3510版本默认不支持Subnormal,Subnormal浮点数在计算中被视为0。 |
| 10 | 10 | ||
| 11 | - **兼容方案**:通过设置config模板参数来配置Subnormal计算模式。软件模拟对Subnormal数据的处理,通过精度扩展等处理方式来避免Subnormal浮点数下溢为0。 | 11 | + **兼容方案**:对于支持config参数的基础API,可以通过设置config模板参数来配置Subnormal计算模式。对于不传入config参数的部分基础API及高阶API,可通过编译选项`--cce-ftz`配置Subnormal处理方式,该选项默认为`true`。`--cce-ftz=false`时保留Subnormal,`--cce-ftz=true`时采用FTZ(Flush-To-Zero)模式。软件模拟通过精度扩展等方式处理Subnormal数据,避免其下溢为0。 |
| 12 | 12 | ||
| 13 | **表1** 涉及Subnormal的API和config参数说明 | 13 | **表1** 涉及Subnormal的API和config参数说明 |
| 14 | 14 | ||
| @@ -23,7 +23,7 @@ | |||
| 23 | </td> | 23 | </td> |
| 24 | <td class="cellrowborder" align="left" valign="top" width="73%" headers="mcps1.2.3.1.2 "><p id="p1055013361204"><a name="p1055013361204"></a><a name="p1055013361204"></a>以Ln接口为例来进行说明。</p> | 24 | <td class="cellrowborder" align="left" valign="top" width="73%" headers="mcps1.2.3.1.2 "><p id="p1055013361204"><a name="p1055013361204"></a><a name="p1055013361204"></a>以Ln接口为例来进行说明。</p> |
| 25 | <p id="p151399151208"><a name="p151399151208"></a><a name="p151399151208"></a>通过LnConfig结构体的参数algo来配置Subnormal计算模式。algo取值如下:</p> | 25 | <p id="p151399151208"><a name="p151399151208"></a><a name="p151399151208"></a>通过LnConfig结构体的参数algo来配置Subnormal计算模式。algo取值如下:</p> |
| 26 | - <a name="ul118851253124216"></a><a name="ul118851253124216"></a><ul id="ul118851253124216"><li>LnAlgo::INTRINSIC、LnAlgo::PRECISION_1ULP_FTZ_TRUE,使用单指令计算得出结果,所有Subnormal被近似为0。</li><li>LnAlgo::PRECISION_1ULP_FTZ_FALSE,支持Subnormal数据计算。</li></ul> | 26 | + <a name="ul118851253124216"></a><a name="ul118851253124216"></a><ul id="ul118851253124216"><li>LnAlgo::INTRINSIC,Subnormal处理方式受编译选项--cce-ftz控制,该选项默认为true。</li><li>LnAlgo::PRECISION_1ULP_FTZ_TRUE,使用单指令计算得出结果,采用FTZ模式。</li><li>LnAlgo::PRECISION_1ULP_FTZ_FALSE,支持Subnormal数据计算。</li></ul> |
| 27 | <p id="p9885135319427"><a name="p9885135319427"></a><a name="p9885135319427"></a>该参数默认值DEFAULT_LN_CONFIG的取值如下:</p> | 27 | <p id="p9885135319427"><a name="p9885135319427"></a><a name="p9885135319427"></a>该参数默认值DEFAULT_LN_CONFIG的取值如下:</p> |
| 28 | <a name="screen18681133513203"></a><a name="screen18681133513203"></a><pre class="screen" codetype="Cpp" id="screen18681133513203">constexpr LnConfig DEFAULT_LN_CONFIG = { LnAlgo::INTRINSIC };</pre> | 28 | <a name="screen18681133513203"></a><a name="screen18681133513203"></a><pre class="screen" codetype="Cpp" id="screen18681133513203">constexpr LnConfig DEFAULT_LN_CONFIG = { LnAlgo::INTRINSIC };</pre> |
| 29 | </td> | 29 | </td> |
| @@ -72,6 +72,8 @@ | |||
| 72 | } | 72 | } |
| 73 | ``` | 73 | ``` |
| 74 | 74 | ||
| 75 | + 在3510架构下,部分基础API和高阶API在未传入config参数时,其Subnormal处理方式受编译选项`--cce-ftz`影响,该选项默认为`true`。基础API包括Exp、Ln、Reciprocal、Sqrt、Rsqrt和Div;高阶API包括Gelu、Sigmoid、Silu、SoftMax、SoftmaxFlash、SoftmaxFlashV2、SoftmaxFlashV3、Swish、Digamma、Erf、Lgamma、Power、Tanh、BatchNorm和RmsNorm等。关于该编译选项的适用范围及产品限制,请参考[AI-Core算子编译基本用法](../../../programming_guide/compilation_and_execution/operator_compilation/ai_core_operator_compilation.md)。 | ||
| 76 | + | ||
| 75 | ## 数据搬运<a name="section7530159122210"></a> | 77 | ## 数据搬运<a name="section7530159122210"></a> |
| 76 | 78 | ||
| 77 | - **DataCopy接口不支持L1 Buffer-\>GM通路。** | 79 | - **DataCopy接口不支持L1 Buffer-\>GM通路。** |
| @@ -118,7 +118,7 @@ AI Core SIMT的基本编译流程如下:Host代码使用Host编译器编译成 | |||
| 118 | | --cce-disable-vf-stack-reserved-ubuf | 否 | 禁用SIMD VF栈预留的UB空间。开启后,编译器不再预留该部分UB空间,该空间可作为普通UB空间使用。针对 [NPU架构版本2201](../../language_extension/simd_builtin_keywords.md#npu-arch),此编译选项无实际效果;针对 [NPU架构版本3510](../../language_extension/simd_builtin_keywords.md#npu-arch),此编译选项生效,当用户使用此编译选项后,编译器将无法使用预留的UB空间进行寄存器溢出的缓存,需要用户保证寄存器不溢出。 | | 118 | | --cce-disable-vf-stack-reserved-ubuf | 否 | 禁用SIMD VF栈预留的UB空间。开启后,编译器不再预留该部分UB空间,该空间可作为普通UB空间使用。针对 [NPU架构版本2201](../../language_extension/simd_builtin_keywords.md#npu-arch),此编译选项无实际效果;针对 [NPU架构版本3510](../../language_extension/simd_builtin_keywords.md#npu-arch),此编译选项生效,当用户使用此编译选项后,编译器将无法使用预留的UB空间进行寄存器溢出的缓存,需要用户保证寄存器不溢出。 | |
| 119 | | --cce-auto-sync | 否 | 开启毕昇编译器自动同步。AI Core内部的执行单元是异步并行的,Tensor的读写可能存在数据依赖,开启后可由毕昇编译器自动插入部分同步。详细内容请参考[关键特性说明](../../../../api/SIMD-API/basic_api/sync_control/intra_core_sync/key_features.md)。 | | 119 | | --cce-auto-sync | 否 | 开启毕昇编译器自动同步。AI Core内部的执行单元是异步并行的,Tensor的读写可能存在数据依赖,开启后可由毕昇编译器自动插入部分同步。详细内容请参考[关键特性说明](../../../../api/SIMD-API/basic_api/sync_control/intra_core_sync/key_features.md)。 | |
| 120 | | --cce-auto-sync-log=<file> | 否 | 输出毕昇编译器自动同步插入信息到<file>文件中。 | | 120 | | --cce-auto-sync-log=<file> | 否 | 输出毕昇编译器自动同步插入信息到<file>文件中。 | |
| 121 | -| --cce-ftz=false/true | 否 | 控制非规格化数(极小数)的处理方式。 true表示将非规格化数直接刷新为0,可提升性能;false表示保留,精度更高但可能更慢,默认true。当前只支持SIMT。 | | 121 | +| --cce-ftz=false/true | 否 | 控制非规格化数(极小数)的处理方式。true表示将非规格化数直接刷新为0,可提升性能;false表示保留非规格化数,精度更高但性能可能较低,默认值为true。当前支持SIMD和SIMT,其中SIMD仅支持NPU架构版本3510。 | |
| 122 | | --cce-prec-div=false/true | 否 | 是否使用精确的除法计算,默认为false。当前只支持SIMT。 | | 122 | | --cce-prec-div=false/true | 否 | 是否使用精确的除法计算,默认为false。当前只支持SIMT。 | |
| 123 | | --cce-prec-sqrt=false/true | 否 | 是否使用精确的平方根函数,默认false。当前只支持SIMT。 | | 123 | | --cce-prec-sqrt=false/true | 否 | 是否使用精确的平方根函数,默认false。当前只支持SIMT。 | |
| 124 | | --cce-use-fast-math=false/true | 否 | 是否开启快速计算模式,开启时相当于--cce-ftz=true --cce-prec-div=false --cce-prec-sqrt=false(若有冲突,以--cce-ftz,--cce-prec-div,--cce-prec-sqrt设置的为准)。当前只支持SIMT。 | | 124 | | --cce-use-fast-math=false/true | 否 | 是否开启快速计算模式,开启时相当于--cce-ftz=true --cce-prec-div=false --cce-prec-sqrt=false(若有冲突,以--cce-ftz,--cce-prec-div,--cce-prec-sqrt设置的为准)。当前只支持SIMT。 | |


这个接口内部的除法是固定的 1ULP_FTZ_TRUE,会影响这里的逻辑吗