// // CPUDeconvolution.hpp // MNN // // Created by MNN on 2018/07/20. // Copyright © 2018, Alibaba Group Holding Limited // #ifndef CPUDeconvolution_hpp #define CPUDeconvolution_hpp #include "CPUConvolution.hpp" #include "compute/CommonOptFunction.h" #include "core/TensorUtils.hpp" namespace MNN { struct DeconvolutionResource { struct Param { int outputCount; int srcCount; int fh; int fw; }; Param mParam; std::shared_ptr mBias; std::shared_ptr mWeight; }; class CPUDeconvolutionBasic : public CPUConvolution { public: CPUDeconvolutionBasic(int inputChannel, const Op *convOp, Backend *b); virtual ~CPUDeconvolutionBasic() = default; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; protected: int mSrcCount; std::vector mPostParameters; }; class CPUDeconvolutionOrigin : public CPUDeconvolutionBasic { public: CPUDeconvolutionOrigin(int inputChannel, const Op *convOp, Backend *b); virtual ~CPUDeconvolutionOrigin() = default; virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; private: MemChunk mGemmOutput; MemChunk mGemmInput; MemChunk mExtraOutput; std::vector, int>> mExecuteFuntion; }; class CPUDeconvolution : public CPUDeconvolutionBasic { public: static std::shared_ptr makeResource(int inputChannel, const Op *convOp, Backend *b, bool dynamic); CPUDeconvolution(int inputChannel, const Op *convOp, Backend *b, bool dynamicWeight, std::shared_ptr res); virtual ~CPUDeconvolution(); virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; virtual bool onClone(Backend* bn, const Op* op, Execution** dst) override; private: bool mDynamicWeight; std::shared_ptr mResource; std::shared_ptr mWeight; std::shared_ptr mBias; std::shared_ptr mWeightTransformCache; std::vector mTempInputs; std::shared_ptr mOrigin; }; } // namespace MNN #endif /* CPUDeconvolution_hpp */