已合并
avg_pool kernel精度提升 #8595
klein8793创建于 8月12日
avg_pool kernel精度提升 #8595
已合并
klein8793创建于 8月12日
共 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 
82template <typename T>82template <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+ 
116constexpr AscendC::MicroAPI::CastTrait CAST_INT32_TO_FP32 = {119constexpr 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 AvgPool1790} // namespace AvgPool
1785 1791 
1786-#endif // AVG_POOL_COMMON_H_1792+#endif // AVG_POOL_COMMON_H_