// // ConvInt8Winograd.hpp // MNN // // Created by MNN on 2018/08/20. // Copyright © 2018, Alibaba Group Holding Limited // #ifndef ConvInt8Winograd_hpp #define ConvInt8Winograd_hpp #include "backend/cpu/CPUConvolution.hpp" #include "backend/cpu/compute/Int8FunctionsOpt.h" #include "ConvInt8TiledExecutor.hpp" #ifndef MNN_REDUCE_SIZE namespace MNN { class ConvInt8Winograd : public CPUConvolution { class WinoExecution; public: struct Unit { int kyStart; int kxStart; std::shared_ptr input; std::shared_ptr output; std::shared_ptr runner; }; ConvInt8Winograd(Backend *b, const Convolution2D *convOp, std::shared_ptr res); virtual ~ConvInt8Winograd(); virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; static bool mustUse(const Convolution2D *convOp); virtual bool onClone(Backend* bn, const Op* op, Execution** dst) override; private: ConvInt8Winograd(Backend* backend, const Convolution2DCommon* common, const ConvInt8Winograd& exe); // subExecutions std::vector mUnits; std::shared_ptr mResource; std::shared_ptr mInputFloat; std::shared_ptr mFusedBias; struct WinoResource { std::shared_ptr weight; std::shared_ptr offsets; std::shared_ptr scales; // alpha2 * ROUND_UP(oc, UNIT) std::shared_ptr transInputScales; // alpha2 std::vector transInputZeroPoints; Backend* backend; ~WinoResource() { backend->onReleaseBuffer(weight.get(), Backend::STATIC); backend->onReleaseBuffer(offsets.get(), Backend::STATIC); backend->onReleaseBuffer(scales.get(), Backend::STATIC); backend->onReleaseBuffer(transInputScales.get(), Backend::STATIC); } }; static std::shared_ptr makeWinoResource(const int8_t* originWeight, std::shared_ptr scaleFloat, const int32_t* attr, Backend* backend, int oc, int ic, int kernelY, int kernelX); class WinoExecution : public Execution { public: WinoExecution(std::shared_ptr res, int kernelY, int kernelX, int unitY, int unitX, int outputCount, int inputCount); WinoExecution(Backend* bn, const WinoExecution& exe); virtual ~WinoExecution() = 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; // weight std::shared_ptr mWinoResource; // buffer std::shared_ptr mTempInputBuffer; std::shared_ptr mTempOutputBuffer; std::shared_ptr mTransformMidBuffer; int mUnitY, mUnitX; int mKernelY, mKernelX; int mPadY, mPadX; friend class ConvInt8Winograd; }; }; } // namespace MNN #endif #endif /* ConvInt8Winograd_hpp */