已合并
avg_pool kernel精度提升 #8595
klein8793创建于 8月12日
avg_pool kernel精度提升 #8595
已合并
共 3 个文件变更+48-34
| @@ -76,7 +76,7 @@ private: | |||
| 76 | int64_t beginIdx_ = 0; | 76 | int64_t beginIdx_ = 0; |
| 77 | int64_t endIdx_ = 0; | 77 | int64_t endIdx_ = 0; |
| 78 | 78 | ||
| 79 | - float mulsFactor_ = 0; | 79 | + float divisor_ = 0; |
| 80 | }; | 80 | }; |
| 81 | 81 | ||
| 82 | template <typename T> | 82 | template <typename T> |
| @@ -136,11 +136,11 @@ __aicore__ inline void AvgPoolBigKernel<T>::CalcKernelSize(int64_t curIdx, int64 | |||
| 136 | curInOffset = curNc * inHW_ + curOriginIndex_; | 136 | curInOffset = curNc * inHW_ + curOriginIndex_; |
| 137 | 137 | ||
| 138 | if (tilingData_->divisorOverride) { | 138 | if (tilingData_->divisorOverride) { |
| 139 | - mulsFactor_ = 1.0f / static_cast<float>(tilingData_->divisorOverride); | 139 | + divisor_ = static_cast<float>(tilingData_->divisorOverride); |
| 140 | } else if (tilingData_->countIncludePad == 0) { | 140 | } else if (tilingData_->countIncludePad == 0) { |
| 141 | - mulsFactor_ = curkH * curkW == 0 ? 0 : 1.0f / static_cast<float>(curkH * curkW); | 141 | + divisor_ = curkH * curkW == 0 ? 1.0f : static_cast<float>(curkH * curkW); |
| 142 | } else { | 142 | } else { |
| 143 | - mulsFactor_ = 1.0f / static_cast<float>(curkPadH * curkPadW); | 143 | + divisor_ = static_cast<float>(curkPadH * curkPadW); |
| 144 | } | 144 | } |
| 145 | } | 145 | } |
| 146 | 146 | ||
| @@ -351,10 +351,10 @@ __aicore__ inline void AvgPoolBigKernel<T>::ComputeAvg() | |||
| 351 | if constexpr (std::is_same<T, float>::value) { | 351 | if constexpr (std::is_same<T, float>::value) { |
| 352 | LocalTensor<T> loopReduce = ubLoopReduce_.Get<T>(); | 352 | LocalTensor<T> loopReduce = ubLoopReduce_.Get<T>(); |
| 353 | LocalTensor<T> resultLocal = ubLoopResult_.Get<T>(); | 353 | LocalTensor<T> resultLocal = ubLoopResult_.Get<T>(); |
| 354 | - Muls(resultLocal, loopReduce, mulsFactor_, ONE); | 354 | + Divs(resultLocal, loopReduce, divisor_, ONE); |
| 355 | } else { | 355 | } else { |
| 356 | LocalTensor<float> loopReduce = ubLoopReduce_.Get<float>(); | 356 | LocalTensor<float> loopReduce = ubLoopReduce_.Get<float>(); |
| 357 | - Muls(loopReduce, loopReduce, mulsFactor_, ONE); | 357 | + Divs(loopReduce, loopReduce, divisor_, ONE); |
| 358 | LocalTensor<T> resultLocal = ubLoopResult_.Get<T>(); | 358 | LocalTensor<T> resultLocal = ubLoopResult_.Get<T>(); |
| 359 | Cast(resultLocal, loopReduce, RoundMode::CAST_ROUND, ONE); | 359 | Cast(resultLocal, loopReduce, RoundMode::CAST_ROUND, ONE); |
| 360 | } | 360 | } |
| @@ -86,7 +86,7 @@ private: | |||
| 86 | int64_t inStrideH_ = 0; | 86 | int64_t inStrideH_ = 0; |
| 87 | int64_t inStrideW_ = 0; | 87 | int64_t inStrideW_ = 0; |
| 88 | int32_t maxOutLen_ = 0; | 88 | int32_t maxOutLen_ = 0; |
| 89 | - float mulsFactor_ = 0.0f; | 89 | + float divisor_ = 0.0f; |
| 90 | static constexpr int64_t vRegLen_ = Ops::Base::GetVRegSize() / sizeof(T); | 90 | static constexpr int64_t vRegLen_ = Ops::Base::GetVRegSize() / sizeof(T); |
| 91 | static constexpr int64_t eleBlockSize_ = Ops::Base::GetUbBlockSize() / sizeof(T); | 91 | static constexpr int64_t eleBlockSize_ = Ops::Base::GetUbBlockSize() / sizeof(T); |
| 92 | }; | 92 | }; |
| @@ -155,11 +155,11 @@ __aicore__ inline void AvgPoolNhwcBigKernel<T>::CalcKernelSize(int64_t curIdx, i | |||
| 155 | curInOffset = curN * inHW_ * tilingData_->channel + curOriginIndex_; | 155 | curInOffset = curN * inHW_ * tilingData_->channel + curOriginIndex_; |
| 156 | 156 | ||
| 157 | if (tilingData_->divisorOverride) { | 157 | if (tilingData_->divisorOverride) { |
| 158 | - mulsFactor_ = 1.0f / static_cast<float>(tilingData_->divisorOverride); | 158 | + divisor_ = static_cast<float>(tilingData_->divisorOverride); |
| 159 | } else if (tilingData_->countIncludePad == 0) { | 159 | } else if (tilingData_->countIncludePad == 0) { |
| 160 | - mulsFactor_ = curkH * curkW == 0 ? 0 : 1.0f / static_cast<float>(curkH * curkW); | 160 | + divisor_ = curkH * curkW == 0 ? 1.0f : static_cast<float>(curkH * curkW); |
| 161 | } else { | 161 | } else { |
| 162 | - mulsFactor_ = 1.0f / static_cast<float>(curkPadH * curkPadW); | 162 | + divisor_ = static_cast<float>(curkPadH * curkPadW); |
| 163 | } | 163 | } |
| 164 | } | 164 | } |
| 165 | 165 | ||
| @@ -297,11 +297,11 @@ __aicore__ inline void AvgPoolNhwcBigKernel<T>::ComputeAvg(int64_t length) | |||
| 297 | // 求平均并转回原类型 | 297 | // 求平均并转回原类型 |
| 298 | if constexpr (std::is_same<T, float>::value) { | 298 | if constexpr (std::is_same<T, float>::value) { |
| 299 | LocalTensor<T> sumLocal = outputBuf_.Get<T>(); | 299 | LocalTensor<T> sumLocal = outputBuf_.Get<T>(); |
| 300 | - Muls(sumLocal, sumLocal, mulsFactor_, length); | 300 | + Divs(sumLocal, sumLocal, divisor_, length); |
| 301 | } else { | 301 | } else { |
| 302 | LocalTensor<float> sumLocal = sumBuf_.Get<float>(); | 302 | LocalTensor<float> sumLocal = sumBuf_.Get<float>(); |
| 303 | LocalTensor<T> avgLocal = outputBuf_.Get<T>(); | 303 | LocalTensor<T> avgLocal = outputBuf_.Get<T>(); |
| 304 | - Muls(sumLocal, sumLocal, mulsFactor_, length); | 304 | + Divs(sumLocal, sumLocal, divisor_, length); |
| 305 | Cast(avgLocal, sumLocal, RoundMode::CAST_ROUND, length); | 305 | Cast(avgLocal, sumLocal, RoundMode::CAST_ROUND, length); |
| 306 | } | 306 | } |
| 307 | } | 307 | } |
| @@ -517,7 +517,9 @@ __aicore__ inline void AvgPoolNhwcBigKernel<T>::ComputeSingleNorm(int32_t localC | |||
| 517 | MergeAvgParaRes<T>(res, dstAddr, repeatElm); | 517 | MergeAvgParaRes<T>(res, dstAddr, repeatElm); |
| 518 | } | 518 | } |
| 519 | if constexpr (IS_LAST_LOOP) { | 519 | if constexpr (IS_LAST_LOOP) { |
| 520 | - MicroAPI::Muls(res, res, mulsFactor_, p0); | 520 | + MicroAPI::RegTensor<T> divisorReg; |
| 521 | + MicroAPI::Duplicate(divisorReg, divisor_); | ||
| 522 | + MicroAPI::Div(res, res, divisorReg, p0); | ||
| 521 | } | 523 | } |
| 522 | MicroAPI::DataCopyUnAlign(dstAddr, res, u0, repeatElm); | 524 | MicroAPI::DataCopyUnAlign(dstAddr, res, u0, repeatElm); |
| 523 | MicroAPI::DataCopyUnAlignPost(dstAddr, u0, 0); | 525 | MicroAPI::DataCopyUnAlignPost(dstAddr, u0, 0); |
| @@ -572,7 +574,9 @@ __aicore__ inline void AvgPoolNhwcBigKernel<T>::ComputeSingleNormForAvgNotFp32(i | |||
| 572 | MicroAPI::DataCopyUnAlign(sumAddr, resFp32, u0, repeatElm); | 574 | MicroAPI::DataCopyUnAlign(sumAddr, resFp32, u0, repeatElm); |
| 573 | MicroAPI::DataCopyUnAlignPost(sumAddr, u0, 0); | 575 | MicroAPI::DataCopyUnAlignPost(sumAddr, u0, 0); |
| 574 | } else { | 576 | } else { |
| 575 | - MicroAPI::Muls(resFp32, resFp32, mulsFactor_, p0); | 577 | + MicroAPI::RegTensor<float> divisorReg; |
| 578 | + MicroAPI::Duplicate(divisorReg, divisor_); | ||
| 579 | + MicroAPI::Div(resFp32, resFp32, divisorReg, p0); | ||
| 576 | MicroAPI::Cast<T, float, castTraitFp322T>(in, resFp32, p0); | 580 | MicroAPI::Cast<T, float, castTraitFp322T>(in, resFp32, p0); |
| 577 | MicroAPI::Pack((MicroAPI::RegTensor<uint16_t>&)in, (MicroAPI::RegTensor<uint32_t>&)in); | 581 | MicroAPI::Pack((MicroAPI::RegTensor<uint16_t>&)in, (MicroAPI::RegTensor<uint32_t>&)in); |
| 578 | MicroAPI::DataCopyUnAlign(dstAddr, in, u0, repeatElm); | 582 | MicroAPI::DataCopyUnAlign(dstAddr, in, u0, repeatElm); |
| @@ -645,7 +649,9 @@ __aicore__ inline void AvgPoolNhwcBigKernel<T>::ComputeSingleWithGatherForAvgNot | |||
| 645 | MicroAPI::DataCopyUnAlign(sumAddr, res, u0, 1); | 649 | MicroAPI::DataCopyUnAlign(sumAddr, res, u0, 1); |
| 646 | MicroAPI::DataCopyUnAlignPost(sumAddr, u0, 0); | 650 | MicroAPI::DataCopyUnAlignPost(sumAddr, u0, 0); |
| 647 | } else { | 651 | } else { |
| 648 | - MicroAPI::Muls(res, res, mulsFactor_, maskAll); | 652 | + MicroAPI::RegTensor<float> divisorReg; |
| 653 | + MicroAPI::Duplicate(divisorReg, divisor_); | ||
| 654 | + MicroAPI::Div(res, res, divisorReg, maskAll); | ||
| 649 | MicroAPI::Cast<T, float, castTraitFp322T>(in, res, maskAll); | 655 | MicroAPI::Cast<T, float, castTraitFp322T>(in, res, maskAll); |
| 650 | MicroAPI::Pack((MicroAPI::RegTensor<uint16_t>&)in, (MicroAPI::RegTensor<uint32_t>&)in); | 656 | MicroAPI::Pack((MicroAPI::RegTensor<uint16_t>&)in, (MicroAPI::RegTensor<uint32_t>&)in); |
| 651 | MicroAPI::DataCopyUnAlign(dstAddr, in, u0, 1); | 657 | MicroAPI::DataCopyUnAlign(dstAddr, in, u0, 1); |
| @@ -700,7 +706,9 @@ __aicore__ inline void AvgPoolNhwcBigKernel<T>::ComputeSingleWithGather(int32_t | |||
| 700 | MergeSumRes<T>(res, dstAddr, 0); | 706 | MergeSumRes<T>(res, dstAddr, 0); |
| 701 | } | 707 | } |
| 702 | if constexpr (IS_LAST_LOOP) { | 708 | if constexpr (IS_LAST_LOOP) { |
| 703 | - MicroAPI::Muls(res, res, mulsFactor_, maskAll); | 709 | + MicroAPI::RegTensor<T> divisorReg; |
| 710 | + MicroAPI::Duplicate(divisorReg, divisor_); | ||
| 711 | + MicroAPI::Div(res, res, divisorReg, maskAll); | ||
| 704 | } | 712 | } |
| 705 | MicroAPI::DataCopyUnAlign(dstAddr, res, u0, 1); | 713 | MicroAPI::DataCopyUnAlign(dstAddr, res, u0, 1); |
| 706 | MicroAPI::DataCopyUnAlignPost(dstAddr, u0, 0); | 714 | MicroAPI::DataCopyUnAlignPost(dstAddr, u0, 0); |
| @@ -113,6 +113,9 @@ constexpr AscendC::MicroAPI::CastTrait castTraitB32ToB16 = { | |||
| 113 | AscendC::RoundMode::CAST_RINT, | 113 | AscendC::RoundMode::CAST_RINT, |
| 114 | }; | 114 | }; |
| 115 | 115 | ||
| 116 | +constexpr MicroAPI::DivSpecificMode divHighPrecisionMode = {MicroAPI::MaskMergeMode::ZEROING, true, | ||
| 117 | + DivAlgo::PRECISION_0ULP_FTZ_TRUE}; | ||
| 118 | + | ||
| 116 | constexpr AscendC::MicroAPI::CastTrait CAST_INT32_TO_FP32 = { | 119 | constexpr AscendC::MicroAPI::CastTrait CAST_INT32_TO_FP32 = { |
| 117 | AscendC::MicroAPI::RegLayout::UNKNOWN, AscendC::MicroAPI::SatMode::NO_SAT, | 120 | AscendC::MicroAPI::RegLayout::UNKNOWN, AscendC::MicroAPI::SatMode::NO_SAT, |
| 118 | AscendC::MicroAPI::MaskMergeMode::ZEROING, AscendC::RoundMode::CAST_RINT}; | 121 | AscendC::MicroAPI::MaskMergeMode::ZEROING, AscendC::RoundMode::CAST_RINT}; |
| @@ -277,7 +280,7 @@ __aicore__ inline void AvgPoolB32Impl(RegDstT& res, __local_mem__ T* srcAddr, Mi | |||
| 277 | } | 280 | } |
| 278 | if constexpr (!NO_DIV) { | 281 | if constexpr (!NO_DIV) { |
| 279 | MicroAPI::Duplicate(divisorReg, divisor); | 282 | MicroAPI::Duplicate(divisorReg, divisor); |
| 280 | - MicroAPI::Div(res, res, divisorReg, pMask); | 283 | + MicroAPI::Div<float32_t, &divHighPrecisionMode>(res, res, divisorReg, pMask); |
| 281 | } | 284 | } |
| 282 | } | 285 | } |
| 283 | 286 | ||
| @@ -349,7 +352,7 @@ __aicore__ inline void AvgPoolSingleChannelB32(__local_mem__ M* dstLocalAddr, __ | |||
| 349 | } | 352 | } |
| 350 | } | 353 | } |
| 351 | MicroAPI::Duplicate(divRegs, divisor); | 354 | MicroAPI::Duplicate(divRegs, divisor); |
| 352 | - MicroAPI::Div(res, res, divRegs, p0); | 355 | + MicroAPI::Div<M, &divHighPrecisionMode>(res, res, divRegs, p0); |
| 353 | MicroAPI::DataCopy(dstLocalAddr, res, p0); | 356 | MicroAPI::DataCopy(dstLocalAddr, res, p0); |
| 354 | } | 357 | } |
| 355 | 358 | ||
| @@ -1079,7 +1082,7 @@ __aicore__ inline void AvgPoolDivNormChannel(__local_mem__ T* dstAddr, __local_m | |||
| 1079 | MicroAPI::DataCopyUnAlign(src, u0, curSrcAddr, oneRegNum); | 1082 | MicroAPI::DataCopyUnAlign(src, u0, curSrcAddr, oneRegNum); |
| 1080 | MicroAPI::DataCopyGather(div, divAddr + i * oneRegChannel, index, pMask); | 1083 | MicroAPI::DataCopyGather(div, divAddr + i * oneRegChannel, index, pMask); |
| 1081 | if constexpr (std::is_same<T, float32_t>::value) { | 1084 | if constexpr (std::is_same<T, float32_t>::value) { |
| 1082 | - MicroAPI::Div(res, src, div, pMask); | 1085 | + MicroAPI::Div<float32_t, &divHighPrecisionMode>(res, src, div, pMask); |
| 1083 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, oneRegNum); | 1086 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, oneRegNum); |
| 1084 | } else { | 1087 | } else { |
| 1085 | MicroAPI::Div(tmp, src, div, pMask); | 1088 | MicroAPI::Div(tmp, src, div, pMask); |
| @@ -1091,15 +1094,15 @@ __aicore__ inline void AvgPoolDivNormChannel(__local_mem__ T* dstAddr, __local_m | |||
| 1091 | MicroAPI::DataCopyUnAlign(src, u0, curSrcAddr, tailNum); | 1094 | MicroAPI::DataCopyUnAlign(src, u0, curSrcAddr, tailNum); |
| 1092 | MicroAPI::DataCopyGather(div, divAddr + loopNum * oneRegChannel, index, pMaskTail); | 1095 | MicroAPI::DataCopyGather(div, divAddr + loopNum * oneRegChannel, index, pMaskTail); |
| 1093 | if constexpr (std::is_same<T, float32_t>::value) { | 1096 | if constexpr (std::is_same<T, float32_t>::value) { |
| 1094 | - MicroAPI::Div(res, src, div, pMask); | 1097 | + MicroAPI::Div<float32_t, &divHighPrecisionMode>(res, src, div, pMaskTail); |
| 1095 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, tailNum); | 1098 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, tailNum); |
| 1096 | } else { | 1099 | } else { |
| 1097 | - MicroAPI::Div(tmp, src, div, pMask); | 1100 | + MicroAPI::Div(tmp, src, div, pMaskTail); |
| 1098 | - MicroAPI::Cast<T, float32_t, castTraitB32ToB16>(res, tmp, pMask); | 1101 | + MicroAPI::Cast<T, float32_t, castTraitB32ToB16>(res, tmp, pMaskTail); |
| 1099 | MicroAPI::Pack((MicroAPI::RegTensor<uint16_t>&)res, (MicroAPI::RegTensor<uint32_t>&)res); | 1102 | MicroAPI::Pack((MicroAPI::RegTensor<uint16_t>&)res, (MicroAPI::RegTensor<uint32_t>&)res); |
| 1100 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, tailNum); | 1103 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, tailNum); |
| 1101 | } | 1104 | } |
| 1102 | - MicroAPI::DataCopyUnAlignPost(curDstAddr, u0, 0); | 1105 | + MicroAPI::DataCopyUnAlignPost(curDstAddr, u1, 0); |
| 1103 | } | 1106 | } |
| 1104 | } | 1107 | } |
| 1105 | 1108 | ||
| @@ -1131,7 +1134,7 @@ __aicore__ inline void AvgPoolDivNorm(__local_mem__ T* dstAddr, __local_mem__ fl | |||
| 1131 | MicroAPI::DataCopyUnAlign(div, u0, divAddr, oneRegNum); | 1134 | MicroAPI::DataCopyUnAlign(div, u0, divAddr, oneRegNum); |
| 1132 | 1135 | ||
| 1133 | if constexpr (std::is_same<T, float32_t>::value) { | 1136 | if constexpr (std::is_same<T, float32_t>::value) { |
| 1134 | - MicroAPI::Div(res, src, div, pMask); | 1137 | + MicroAPI::Div<float32_t, &divHighPrecisionMode>(res, src, div, pMask); |
| 1135 | MicroAPI::DataCopy(dstAddr, res, dstOffset, pMask); | 1138 | MicroAPI::DataCopy(dstAddr, res, dstOffset, pMask); |
| 1136 | } else { | 1139 | } else { |
| 1137 | MicroAPI::Div(tmp, src, div, pMask); | 1140 | MicroAPI::Div(tmp, src, div, pMask); |
| @@ -1189,7 +1192,7 @@ __aicore__ inline void AvgPoolDivBatchV1(__local_mem__ T* dstAddr, __local_mem__ | |||
| 1189 | MicroAPI::DataCopy(div, divAddr, divOffset); | 1192 | MicroAPI::DataCopy(div, divAddr, divOffset); |
| 1190 | } | 1193 | } |
| 1191 | if constexpr (std::is_same<T, float32_t>::value) { | 1194 | if constexpr (std::is_same<T, float32_t>::value) { |
| 1192 | - MicroAPI::Div(res, src, div, pMask); | 1195 | + MicroAPI::Div<float32_t, &divHighPrecisionMode>(res, src, div, pMask); |
| 1193 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, oneRegNum); | 1196 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, oneRegNum); |
| 1194 | } else { | 1197 | } else { |
| 1195 | MicroAPI::Div(tmp, src, div, pMask); | 1198 | MicroAPI::Div(tmp, src, div, pMask); |
| @@ -1205,11 +1208,11 @@ __aicore__ inline void AvgPoolDivBatchV1(__local_mem__ T* dstAddr, __local_mem__ | |||
| 1205 | MicroAPI::DataCopy(div, divAddr + loopNum * oneRegNum); | 1208 | MicroAPI::DataCopy(div, divAddr + loopNum * oneRegNum); |
| 1206 | } | 1209 | } |
| 1207 | if constexpr (std::is_same<T, float32_t>::value) { | 1210 | if constexpr (std::is_same<T, float32_t>::value) { |
| 1208 | - MicroAPI::Div(res, src, div, pMask); | 1211 | + MicroAPI::Div<float32_t, &divHighPrecisionMode>(res, src, div, pMaskTail); |
| 1209 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, tailNum); | 1212 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, tailNum); |
| 1210 | } else { | 1213 | } else { |
| 1211 | - MicroAPI::Div(tmp, src, div, pMask); | 1214 | + MicroAPI::Div(tmp, src, div, pMaskTail); |
| 1212 | - MicroAPI::Cast<T, float32_t, castTraitB32ToB16>(res, tmp, pMask); | 1215 | + MicroAPI::Cast<T, float32_t, castTraitB32ToB16>(res, tmp, pMaskTail); |
| 1213 | MicroAPI::Pack((MicroAPI::RegTensor<uint16_t>&)res, (MicroAPI::RegTensor<uint32_t>&)res); | 1216 | MicroAPI::Pack((MicroAPI::RegTensor<uint16_t>&)res, (MicroAPI::RegTensor<uint32_t>&)res); |
| 1214 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, tailNum); | 1217 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, tailNum); |
| 1215 | } | 1218 | } |
| @@ -1239,7 +1242,9 @@ __aicore__ inline void AvgPoolDivBatchV2(__local_mem__ T* dstAddr, __local_mem__ | |||
| 1239 | auto curSrcAddr = srcAddr; | 1242 | auto curSrcAddr = srcAddr; |
| 1240 | auto curDstAddr = dstAddr; | 1243 | auto curDstAddr = dstAddr; |
| 1241 | uint32_t mainSreg = onceRepeatNum; | 1244 | uint32_t mainSreg = onceRepeatNum; |
| 1245 | + uint32_t tailSreg = tailRepeatNum; | ||
| 1242 | MicroAPI::MaskReg pMask = MicroAPI::UpdateMask<float32_t>(mainSreg); | 1246 | MicroAPI::MaskReg pMask = MicroAPI::UpdateMask<float32_t>(mainSreg); |
| 1247 | + MicroAPI::MaskReg pTailMask = MicroAPI::UpdateMask<float32_t>(tailSreg); | ||
| 1243 | if constexpr (CHANNEL_BROADACAST) { | 1248 | if constexpr (CHANNEL_BROADACAST) { |
| 1244 | MicroAPI::Arange((MicroAPI::RegTensor<int32_t>&)index, 0); | 1249 | MicroAPI::Arange((MicroAPI::RegTensor<int32_t>&)index, 0); |
| 1245 | MicroAPI::RegTensor<uint32_t> channelDiv; | 1250 | MicroAPI::RegTensor<uint32_t> channelDiv; |
| @@ -1256,7 +1261,7 @@ __aicore__ inline void AvgPoolDivBatchV2(__local_mem__ T* dstAddr, __local_mem__ | |||
| 1256 | for (uint16_t i = 0; i < loopNum; i++) { | 1261 | for (uint16_t i = 0; i < loopNum; i++) { |
| 1257 | MicroAPI::DataCopyUnAlign(src, u0, curSrcAddr, onceRepeatNum); | 1262 | MicroAPI::DataCopyUnAlign(src, u0, curSrcAddr, onceRepeatNum); |
| 1258 | if constexpr (std::is_same<T, float32_t>::value) { | 1263 | if constexpr (std::is_same<T, float32_t>::value) { |
| 1259 | - MicroAPI::Div(res, src, div, pMask); | 1264 | + MicroAPI::Div<float32_t, &divHighPrecisionMode>(res, src, div, pMask); |
| 1260 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, onceRepeatNum); | 1265 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, onceRepeatNum); |
| 1261 | } else { | 1266 | } else { |
| 1262 | MicroAPI::Div(tmp, src, div, pMask); | 1267 | MicroAPI::Div(tmp, src, div, pMask); |
| @@ -1265,13 +1270,14 @@ __aicore__ inline void AvgPoolDivBatchV2(__local_mem__ T* dstAddr, __local_mem__ | |||
| 1265 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, onceRepeatNum); | 1270 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, onceRepeatNum); |
| 1266 | } | 1271 | } |
| 1267 | } | 1272 | } |
| 1273 | + | ||
| 1268 | MicroAPI::DataCopyUnAlign(src, u0, curSrcAddr, tailRepeatNum); | 1274 | MicroAPI::DataCopyUnAlign(src, u0, curSrcAddr, tailRepeatNum); |
| 1269 | if constexpr (std::is_same<T, float32_t>::value) { | 1275 | if constexpr (std::is_same<T, float32_t>::value) { |
| 1270 | - MicroAPI::Div(res, src, div, pMask); | 1276 | + MicroAPI::Div<float32_t, &divHighPrecisionMode>(res, src, div, pTailMask); |
| 1271 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, tailRepeatNum); | 1277 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, tailRepeatNum); |
| 1272 | } else { | 1278 | } else { |
| 1273 | - MicroAPI::Div(tmp, src, div, pMask); | 1279 | + MicroAPI::Div(tmp, src, div, pTailMask); |
| 1274 | - MicroAPI::Cast<T, float32_t, castTraitB32ToB16>(res, tmp, pMask); | 1280 | + MicroAPI::Cast<T, float32_t, castTraitB32ToB16>(res, tmp, pTailMask); |
| 1275 | MicroAPI::Pack((MicroAPI::RegTensor<uint16_t>&)res, (MicroAPI::RegTensor<uint32_t>&)res); | 1281 | MicroAPI::Pack((MicroAPI::RegTensor<uint16_t>&)res, (MicroAPI::RegTensor<uint32_t>&)res); |
| 1276 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, tailRepeatNum); | 1282 | MicroAPI::DataCopyUnAlign(curDstAddr, res, u1, tailRepeatNum); |
| 1277 | } | 1283 | } |
| @@ -1579,7 +1585,7 @@ __aicore__ inline void DivCompute(MicroAPI::RegTensor<T>& res, MicroAPI::RegTens | |||
| 1579 | // B32类型, 此处即float32类型 | 1585 | // B32类型, 此处即float32类型 |
| 1580 | MicroAPI::Duplicate(divisorReg, divisor); | 1586 | MicroAPI::Duplicate(divisorReg, divisor); |
| 1581 | MicroAPI::MaskReg divMask = MicroAPI::UpdateMask<Z>(scalar); | 1587 | MicroAPI::MaskReg divMask = MicroAPI::UpdateMask<Z>(scalar); |
| 1582 | - MicroAPI::Div(res, sum, divisorReg, divMask); | 1588 | + MicroAPI::Div<Z, &divHighPrecisionMode>(res, sum, divisorReg, divMask); |
| 1583 | } | 1589 | } |
| 1584 | } | 1590 | } |
| 1585 | 1591 | ||
| @@ -1783,4 +1789,4 @@ __aicore__ inline void AvgPoolSingleKernelDefault(__local_mem__ T* dstLocalAddr, | |||
| 1783 | 1789 | ||
| 1784 | } // namespace AvgPool | 1790 | } // namespace AvgPool |
| 1785 | 1791 | ||
| 1786 | -#endif // AVG_POOL_COMMON_H_ | 1792 | +#endif // AVG_POOL_COMMON_H_ |