// // CPUConvolutionDepthwise.hpp // MNN // // Created by MNN on 2018/07/20. // Copyright © 2018, Alibaba Group Holding Limited // #ifndef CPUConvolutionDepthwise_hpp #define CPUConvolutionDepthwise_hpp #include "core/AutoStorage.h" #include "backend/cpu/CPUConvolution.hpp" #include "backend/cpu/compute/ConvolutionIntFactory.hpp" namespace MNN { class CPUConvolutionDepthwise { public: class BasicFloatExecution : public CPUConvolution { public: BasicFloatExecution(const Convolution2DCommon *common, Backend *b) : CPUConvolution(common, b) { } virtual ~BasicFloatExecution() = 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: std::function mExecutor; std::function mFastKernel; int mNumber = 1; std::shared_ptr mInputPad; bool mFastKernelApply = false; }; class MultiInputFloatExecution : public BasicFloatExecution { public: MultiInputFloatExecution(const Convolution2DCommon *common, Backend *b) : BasicFloatExecution(common, b) { } virtual ~MultiInputFloatExecution() = default; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; private: std::unique_ptr mWeight; std::unique_ptr mBias; std::vector mTempInputs; }; class FloatExecution : public CPUConvolution { public: FloatExecution(const Convolution2DCommon *common, Backend *b, const float *originWeight, size_t originWeightSize, const float *bias, size_t biasSize); virtual ~FloatExecution(); virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override { return mOrigin->onExecute(mTempInputs, outputs); } virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override { mTempInputs = {inputs[0], mResource->mWeight.get(), mResource->mBias.get()}; return mOrigin->onResize(mTempInputs, outputs); } virtual bool onClone(Backend* bn, const Op* op, Execution** dst) override; private: FloatExecution(std::shared_ptr resource, const Convolution2DCommon* common, Backend* b) : CPUConvolution(common, b) { mResource = resource; mOrigin.reset(new BasicFloatExecution(common, b)); } std::shared_ptr mResource; std::vector mTempInputs; std::unique_ptr mOrigin; }; }; } // namespace MNN #endif /* CPUConvolutionDepthwise_hpp */