已合并
Conv:WeightUbTrans NDDMA bug fix #7453
高维健创建于 7月13日
Conv:WeightUbTrans NDDMA bug fix #7453
已合并
高维健创建于 7月13日
3 个文件变更+20-18
@@ -108,7 +108,6 @@ const static uint8_t CV_SYNC_ID_MTE3_MTE1 = 0;
108const static uint8_t CV_SYNC_ID_MTE1_MTE3 = 1;108const static uint8_t CV_SYNC_ID_MTE1_MTE3 = 1;
109const static uint8_t CV_SYUC_ID_V_ROTATE = 2;109const static uint8_t CV_SYUC_ID_V_ROTATE = 2;
110const static uint8_t NDDMA_DIMS_BASE = 1;110const static uint8_t NDDMA_DIMS_BASE = 1;
111-const static uint8_t NDDMA_DIMS_NO_TRANS = 2;
112const static uint8_t NDDMA_DIMS = 3;111const static uint8_t NDDMA_DIMS = 3;
113const static uint8_t NDDMA_DIMS_LOAD_FMAP = 3;112const static uint8_t NDDMA_DIMS_LOAD_FMAP = 3;
114const static uint8_t NDDMA_HWC_DIMS = 4;113const static uint8_t NDDMA_HWC_DIMS = 4;
@@ -187,4 +186,4 @@ enum class QuantModeType : std::uint8_t { NO_QUANT = 0, SCALAR_QUANT, VECTOR_QUA
187 186 
188} // namespace conv187} // namespace conv
189 188 
190-#endif // CONV_UTIL_H189+#endif // CONV_UTIL_H
@@ -44,19 +44,23 @@ private:
44 {44 {
45 if (unlikely(self_->ctx.isFirstIterate)) {45 if (unlikely(self_->ctx.isFirstIterate)) {
46 // NDDMA Loop0 params46 // NDDMA Loop0 params
47+ copyParams.loopInfo.loopSize[NDDMA_LOOP0_INDEX] = self_->ctx.convTilingData->kernelHxkernelW;
47 copyParams.loopInfo.loopSrcStride[NDDMA_LOOP0_INDEX] = 1;48 copyParams.loopInfo.loopSrcStride[NDDMA_LOOP0_INDEX] = 1;
48 copyParams.loopInfo.loopDstStride[NDDMA_LOOP0_INDEX] = 1;49 copyParams.loopInfo.loopDstStride[NDDMA_LOOP0_INDEX] = 1;
49 // NDDMA Loop1 params50 // NDDMA Loop1 params
50- copyParams.loopInfo.loopSrcStride[NDDMA_LOOP1_INDEX] = self_->ctx.convTilingData->coutOffsetBlock;51+ copyParams.loopInfo.loopSrcStride[NDDMA_LOOP1_INDEX] = self_->ctx.convTilingData->kernelHxkernelW;
51- copyParams.loopInfo.loopDstStride[NDDMA_LOOP1_INDEX] = self_->ctx.convTilingData->bUbKStep;52+ copyParams.loopInfo.loopDstStride[NDDMA_LOOP1_INDEX] = self_->ctx.convTilingData->kernelHxkernelW;
53+ // NDDMA Loop2 params
54+ copyParams.loopInfo.loopSrcStride[NDDMA_LOOP2_INDEX] = self_->ctx.convTilingData->coutOffsetBlock;
55+ copyParams.loopInfo.loopDstStride[NDDMA_LOOP2_INDEX] = self_->ctx.convTilingData->bUbKStep;
52 copyParams.constantValue = 0;56 copyParams.constantValue = 0;
53 }57 }
54 // NDDMA Loop0 params58 // NDDMA Loop0 params
55- copyParams.loopInfo.loopSize[NDDMA_LOOP0_INDEX] = self_->ctx.currentUbKStep;59+ copyParams.loopInfo.loopSize[NDDMA_LOOP1_INDEX] = self_->ctx.currentUbKStep;
56- copyParams.loopInfo.loopRpSize[NDDMA_LOOP0_INDEX] = self_->ctx.currentKLoopRpSize;60+ copyParams.loopInfo.loopRpSize[NDDMA_LOOP1_INDEX] = self_->ctx.currentKLoopRpSize;
57 // NDDMA Loop1 params61 // NDDMA Loop1 params
58- copyParams.loopInfo.loopSize[NDDMA_LOOP1_INDEX] = self_->ctx.currentUbNStep;62+ copyParams.loopInfo.loopSize[NDDMA_LOOP2_INDEX] = self_->ctx.currentUbNStep;
59- copyParams.loopInfo.loopRpSize[NDDMA_LOOP1_INDEX] = self_->ctx.currentNLoopRpSize;63+ copyParams.loopInfo.loopRpSize[NDDMA_LOOP2_INDEX] = self_->ctx.currentNLoopRpSize;
60 64 
61 uint64_t srcOffset = (self_->ctx.nBL1Iter * self_->ctx.convTilingData->nBL1 +65 uint64_t srcOffset = (self_->ctx.nBL1Iter * self_->ctx.convTilingData->nBL1 +
62 self_->ctx.vecNIter * self_->ctx.convTilingData->bUbNStep) *66 self_->ctx.vecNIter * self_->ctx.convTilingData->bUbNStep) *
@@ -68,16 +72,15 @@ private:
68 if constexpr (sizeof(typename Intf::WeightT) == DTYPE_SIZE_B8) {72 if constexpr (sizeof(typename Intf::WeightT) == DTYPE_SIZE_B8) {
69 GlobalTensor<NddmaT> bgmNddma;73 GlobalTensor<NddmaT> bgmNddma;
70 bgmNddma.SetGlobalBuffer((__gm__ NddmaT*)self_->ctx.bgm.GetPhyAddr());74 bgmNddma.SetGlobalBuffer((__gm__ NddmaT*)self_->ctx.bgm.GetPhyAddr());
71- DataCopy<NddmaT, NDDMA_DIMS_NO_TRANS, kDefaultMultiCopyConfig>(ndTensorNddma, bgmNddma[srcOffset],75+ DataCopy<NddmaT, NDDMA_DIMS, kDefaultMultiCopyConfig>(ndTensorNddma, bgmNddma[srcOffset], copyParams);
72- copyParams);
73 } else {76 } else {
74- DataCopy<NddmaT, NDDMA_DIMS_NO_TRANS, kDefaultMultiCopyConfig>(ndTensorNddma, self_->ctx.bgm[srcOffset],77+ DataCopy<NddmaT, NDDMA_DIMS, kDefaultMultiCopyConfig>(ndTensorNddma, self_->ctx.bgm[srcOffset], copyParams);
75- copyParams);
76 }78 }
77 }79 }
78 80 
79 __aicore__ inline void LoadGM2UBAlign()81 __aicore__ inline void LoadGM2UBAlign()
80 {82 {
83+ self_->ctx.currentUbKStep *= self_->ctx.convTilingData->kernelHxkernelW;
81 repeatParams.blockLen = self_->ctx.currentUbKStep / Intf::k0;84 repeatParams.blockLen = self_->ctx.currentUbKStep / Intf::k0;
82 repeatParams.blockCount = self_->ctx.currentUbNStep;85 repeatParams.blockCount = self_->ctx.currentUbNStep;
83 repeatParams.srcStride = (self_->ctx.convTilingData->singleCoreCi * self_->ctx.convTilingData->kernelHxkernelW -86 repeatParams.srcStride = (self_->ctx.convTilingData->singleCoreCi * self_->ctx.convTilingData->kernelHxkernelW -
@@ -99,7 +102,7 @@ private:
99 using NddmaT = typename Conditional<(sizeof(typename Intf::WeightT) == DTYPE_SIZE_B8), uint8_t,102 using NddmaT = typename Conditional<(sizeof(typename Intf::WeightT) == DTYPE_SIZE_B8), uint8_t,
100 typename Intf::WeightT>::type;103 typename Intf::WeightT>::type;
101 DataCopyParams repeatParams;104 DataCopyParams repeatParams;
102- MultiCopyParams<NddmaT, NDDMA_DIMS_NO_TRANS> copyParams;105+ MultiCopyParams<NddmaT, NDDMA_DIMS> copyParams;
103};106};
104 107 
105template <class Intf>108template <class Intf>
@@ -254,4 +257,4 @@ private:
254 257 
255}; // namespace Conv2dFunc258}; // namespace Conv2dFunc
256 259 
257-#endif // CONV2D_V2_INSTR_WEIHGT_UB_TRANS_IMPL_H260+#endif // CONV2D_V2_INSTR_WEIHGT_UB_TRANS_IMPL_H
@@ -250,10 +250,10 @@ public:
250 self->ctx.maxVecKIter = self->ctx.vecKLoopTimes - 1;250 self->ctx.maxVecKIter = self->ctx.vecKLoopTimes - 1;
251 251 
252 if (self->ctx.kBL1Iter == self->ctx.maxKBL1Iter && self->ctx.vecKIter == self->ctx.maxVecKIter) {252 if (self->ctx.kBL1Iter == self->ctx.maxKBL1Iter && self->ctx.vecKIter == self->ctx.maxVecKIter) {
253- self->ctx.currentUbKStep = self->ctx.kUbTail;253+ self->ctx.currentUbKStep = self->ctx.kUbTail / self->ctx.convTilingData->kernelHxkernelW;
254- self->ctx.currentKLoopRpSize = self->ctx.convTilingData->bUbKStep - self->ctx.kUbTail;254+ self->ctx.currentKLoopRpSize = AlignB(self->ctx.currentUbKStep, Intf::k0) - self->ctx.currentUbKStep;
255 } else {255 } else {
256- self->ctx.currentUbKStep = self->ctx.convTilingData->bUbKStep;256+ self->ctx.currentUbKStep = self->ctx.convTilingData->bUbKStep / self->ctx.convTilingData->kernelHxkernelW;
257 self->ctx.currentKLoopRpSize = 0;257 self->ctx.currentKLoopRpSize = 0;
258 }258 }
259 }259 }
@@ -456,4 +456,4 @@ public:
456 456 
457} // namespace Conv2dFunc457} // namespace Conv2dFunc
458 458 
459-#endif // CONV2D_V2_WEIGHT_UB_TRANS_IMPL_H459+#endif // CONV2D_V2_WEIGHT_UB_TRANS_IMPL_H