已合并
broadcast_to算子性能优化: nddma条件优化 #1974
luwenxiang创建于 3月28日
broadcast_to算子性能优化: nddma条件优化 #1974
已合并
共 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 broadcast | 534 | (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); |