已合并
Conv:WeightUbTrans NDDMA bug fix #7453
高维健创建于 7月13日
Conv:WeightUbTrans NDDMA bug fix #7453
已合并
共 3 个文件变更+20-18
| @@ -108,7 +108,6 @@ const static uint8_t CV_SYNC_ID_MTE3_MTE1 = 0; | |||
| 108 | const static uint8_t CV_SYNC_ID_MTE1_MTE3 = 1; | 108 | const static uint8_t CV_SYNC_ID_MTE1_MTE3 = 1; |
| 109 | const static uint8_t CV_SYUC_ID_V_ROTATE = 2; | 109 | const static uint8_t CV_SYUC_ID_V_ROTATE = 2; |
| 110 | const static uint8_t NDDMA_DIMS_BASE = 1; | 110 | const static uint8_t NDDMA_DIMS_BASE = 1; |
| 111 | -const static uint8_t NDDMA_DIMS_NO_TRANS = 2; | ||
| 112 | const static uint8_t NDDMA_DIMS = 3; | 111 | const static uint8_t NDDMA_DIMS = 3; |
| 113 | const static uint8_t NDDMA_DIMS_LOAD_FMAP = 3; | 112 | const static uint8_t NDDMA_DIMS_LOAD_FMAP = 3; |
| 114 | const static uint8_t NDDMA_HWC_DIMS = 4; | 113 | const 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 conv | 187 | } // namespace conv |
| 189 | 188 | ||
| 190 | -#endif // CONV_UTIL_H | 189 | +#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 params | 46 | // 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 params | 50 | // 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 params | 58 | // 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 params | 61 | // 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 | ||
| 105 | template <class Intf> | 108 | template <class Intf> |
| @@ -254,4 +257,4 @@ private: | |||
| 254 | 257 | ||
| 255 | }; // namespace Conv2dFunc | 258 | }; // namespace Conv2dFunc |
| 256 | 259 | ||
| 257 | -#endif // CONV2D_V2_INSTR_WEIHGT_UB_TRANS_IMPL_H | 260 | +#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 Conv2dFunc | 457 | } // namespace Conv2dFunc |
| 458 | 458 | ||
| 459 | -#endif // CONV2D_V2_WEIGHT_UB_TRANS_IMPL_H | 459 | +#endif // CONV2D_V2_WEIGHT_UB_TRANS_IMPL_H |