From 677651add50745478367da009936e4505d627399 Mon Sep 17 00:00:00 2001 From: Alexander Bengtsson Date: Thu, 24 Apr 2025 15:21:23 +0200 Subject: [PATCH] MLBEDSW-10740: Add leading dimension decomposition for Resize Change-Id: Ibb1b00160e50fc0edacb7e1e18b1d6c437832b0c Signed-off-by: Alexander Bengtsson --- ethosu/regor/compiler/scheduler_decompose.cpp | 28 +++++++++++++++++++ ethosu/regor/compiler/scheduler_decompose.hpp | 1 + ethosu/regor/compiler/scheduler_packing.cpp | 3 ++ 3 files changed, 32 insertions(+) diff --git a/ethosu/regor/compiler/scheduler_decompose.cpp b/ethosu/regor/compiler/scheduler_decompose.cpp index d9b12235..0ce98d1a 100644 --- a/ethosu/regor/compiler/scheduler_decompose.cpp +++ b/ethosu/regor/compiler/scheduler_decompose.cpp @@ -245,6 +245,7 @@ bool CanDecompose(Architecture *, const SchedulerOperation *schedOp) if ( schedOp->Type() == OpType::Reverse ) return true; if ( schedOp->Type() == OpType::Transpose ) return true; if ( schedOp->Type() == OpType::MaxPool ) return true; + if ( schedOp->Type() == OpType::Resize ) return true; return false; } @@ -1732,5 +1733,32 @@ std::vector> DecomposeMaxPool(Architecture * return result; } +std::vector> DecomposeResize(Architecture *arch, std::unique_ptr op) +{ + std::vector> result; + auto ofmConn = op->Output(TensorUsage::OFM); + auto &ofmShape = ofmConn->SliceShape(); + auto &ofmSlice = ofmConn->slice; + auto ifmConn = op->Input(TensorUsage::IFM); + auto &ifmShape = ifmConn->SliceShape(); + auto &ifmSlice = ifmConn->slice; + + ofmSlice.Initialize(ofmShape.WithZeros(), ofmShape); + ifmSlice.Initialize(ifmShape.WithZeros(), ifmShape); + + auto req = ArchRequirements(); + auto qResult = OperatorQuery(arch, op.get(), &req); + bool decomposeLeadingDims = false; + if ( qResult.Any(QueryResult::HasRequirements) && req.req.Any(ArchRequirement::Decompose) ) + { + decomposeLeadingDims = req.decomposeProps.Any(ArchProperty::TensorDims); + } + if ( decomposeLeadingDims ) + { + return DecomposeLeadingDimensions(ofmShape.Size() - 3, arch, std::move(op), DecomposeResize); + } + result.emplace_back(std::move(op)); + return result; +} } // namespace regor diff --git a/ethosu/regor/compiler/scheduler_decompose.hpp b/ethosu/regor/compiler/scheduler_decompose.hpp index 88502411..256a57c1 100644 --- a/ethosu/regor/compiler/scheduler_decompose.hpp +++ b/ethosu/regor/compiler/scheduler_decompose.hpp @@ -45,6 +45,7 @@ std::vector> DecomposeReduce(Architecture *a std::vector> DecomposeReverse(Architecture *arch, std::unique_ptr op); std::vector> DecomposeTranspose(Architecture *arch, std::unique_ptr op); std::vector> DecomposeMaxPool(Architecture *arch, std::unique_ptr op); +std::vector> DecomposeResize(Architecture *arch, std::unique_ptr op); // Operator query helpers diff --git a/ethosu/regor/compiler/scheduler_packing.cpp b/ethosu/regor/compiler/scheduler_packing.cpp index 7af4acf2..4b8419ec 100644 --- a/ethosu/regor/compiler/scheduler_packing.cpp +++ b/ethosu/regor/compiler/scheduler_packing.cpp @@ -650,6 +650,9 @@ std::vector> SchedulerPacking::DecomposeSche case OpType::MaxPool: result = DecomposeMaxPool(_arch, std::move(op)); break; + case OpType::Resize: + result = DecomposeResize(_arch, std::move(op)); + break; default: if ( DecomposeAsElementwise(op->Type()) || op->Type() == OpType::MemoryCopy ) { -- GitLab