已合并
broadcast_to算子性能优化: nddma条件优化 #1974
broadcast_to算子性能优化: nddma条件优化 #1974
已合并
luwenxiang创建于 3月28日
1 个文件变更+7-18
@@ -274,23 +274,6 @@ void BroadcastToTilingAscendC::UpdateTilingKey()
274 auto lastDimAlign = Ops::Base::CeilAlign(outShapePtr_->GetDim(dimNum - 1) * dtypeSize_, blockSize_);274 auto lastDimAlign = Ops::Base::CeilAlign(outShapePtr_->GetDim(dimNum - 1) * dtypeSize_, blockSize_);
275 if (outShapePtr_->GetDim(dimNum - nTwo) * lastDimAlign <= vlSize_) {275 if (outShapePtr_->GetDim(dimNum - nTwo) * lastDimAlign <= vlSize_) {
276 tilingKey_ = TILING_MODE_LAST_DIM_SMALL_A;276 tilingKey_ = TILING_MODE_LAST_DIM_SMALL_A;
277- // 优化:LAST_DIM_SMALL_A模板下,当CopyDataIn单次搬运数据量小于cacheLine时,增大uLpUnit_
278- // 单次搬运数据量 = blockCount * blockLen = uLpUnit_ * uInOffset_ * dtypeSize_
279- // 条件:U轴是A轴 且 当前搬运量<cacheLine 且 uLpUnit_可增大
280- if (isUNotB_ == 1 && uLpUnit_ * uInOffset_ * dtypeSize_ < cacheLine_ && uLpUnit_ < uAxisLen_) {
281- // 计算满足 >= cacheLine_ 的最小uLpUnit_
282- int64_t minULpUnit = Ops::Base::CeilDiv(cacheLine_, uInOffset_ * dtypeSize_);
283- // 取满足条件的最小值,但不超过uAxisLen_
284- uLpUnit_ = std::min(minULpUnit, uAxisLen_);
285- xSize_[0] = static_cast<uint32_t>(uLpUnit_); // 更新DMA参数
286- // 更新tensorSize_以适应新的uLpUnit_
287- // UB中需要的空间 = uLpUnit_ * outShape[dimNum-2] * CeilAlign(outShape[dimNum-1], blockSize_/dtypeSize_)
288- int64_t lastDimBA = Ops::Base::CeilAlign(outShapePtr_->GetDim(dimNum - 1), blockSize_ / dtypeSize_);
289- int64_t newTensorSize = uLpUnit_ * outShapePtr_->GetDim(dimNum - nTwo) * lastDimBA;
290- if (newTensorSize > tensorSize_) {
291- tensorSize_ = newTensorSize;
292- }
293- }
294 return;277 return;
295 }278 }
296 }279 }
@@ -538,9 +521,15 @@ void BroadcastToTilingAscendC::CalcTensorSize()
538 bool isBrwd = false;521 bool isBrwd = false;
539 522 
540 int64_t ubGate = maxTensorSize_ / nTwo / nTwo;523 int64_t ubGate = maxTensorSize_ / nTwo / nTwo;
524+ int64_t r4DimSize = minTensorSize_;
525+ if (dimNum > 5) {
526+ r4DimSize = CalcDimSize(inShapePtr_, dimNum - 4, dimNum);
527+ }
528+
541 isDMABrcA_ =529 isDMABrcA_ =
542 (dimNum > 1 && (nTwo * outLastDim <= LAST_DIM_GATE || (outLastDim == LAST_DIM_GATE / nTwo + 1 &&530 (dimNum > 1 && (nTwo * outLastDim <= LAST_DIM_GATE || (outLastDim == LAST_DIM_GATE / nTwo + 1 &&
543- outShapePtr_->GetDim(dimNum - nTwo) <= LAST_DIM_GATE)));531+ outShapePtr_->GetDim(dimNum - nTwo) <= LAST_DIM_GATE)
532+ || ((outLastDim < 8) && (r4DimSize < minTensorSize_))));
544 if ((!abInfo_[dimNum - 1] && outLastDim <= ubGate && !isDMABrcA_) ||533 if ((!abInfo_[dimNum - 1] && outLastDim <= ubGate && !isDMABrcA_) ||
545 (abInfo_[dimNum - 1] && outLastDim >= LAST_DIM_GATE)) { // UB broadcast534 (abInfo_[dimNum - 1] && outLastDim >= LAST_DIM_GATE)) { // UB broadcast
546 tmpTensorSize = std::min(ubGate, MAX_TENSOR_SIZE);535 tmpTensorSize = std::min(ubGate, MAX_TENSOR_SIZE);