From 92d04d6dc31c872a2a399d09051376f3b5a8248e Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EB=82=A8=EA=B6=81=EC=84=9D/=EB=8F=99=EC=9E=91=EC=A0=9C?= =?utf8?q?=EC=96=B4Lab=28SR=29/Engineer/=EC=82=BC=EC=84=B1=EC=A0=84?= =?utf8?q?=EC=9E=90?= Date: Wed, 14 Nov 2018 12:53:07 +0900 Subject: [PATCH] [enco] Extend backend for ReLU6 (#2265) This commit will extend the backend of enco for ReLU6 Signed-off-by: Seok NamKoong --- contrib/enco/core/src/ANN/IR/Operation.def | 1 + contrib/enco/core/src/Transforms/Split.cpp | 42 ++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/contrib/enco/core/src/ANN/IR/Operation.def b/contrib/enco/core/src/ANN/IR/Operation.def index 6a4d1fa..56b2e5c 100644 --- a/contrib/enco/core/src/ANN/IR/Operation.def +++ b/contrib/enco/core/src/ANN/IR/Operation.def @@ -10,4 +10,5 @@ ANN_OPERATION(DEPTHWISE_CONV_2D, ANEURALNETWORKS_DEPTHWISE_CONV_2D) ANN_OPERATION(MAX_POOL_2D, ANEURALNETWORKS_MAX_POOL_2D) ANN_OPERATION(AVG_POOL_2D, ANEURALNETWORKS_AVERAGE_POOL_2D) ANN_OPERATION(RELU, ANEURALNETWORKS_RELU) +ANN_OPERATION(RELU6, ANEURALNETWORKS_RELU6) ANN_OPERATION(PAD, ANEURALNETWORKS_PAD) diff --git a/contrib/enco/core/src/Transforms/Split.cpp b/contrib/enco/core/src/Transforms/Split.cpp index dba8172..178ffab 100644 --- a/contrib/enco/core/src/Transforms/Split.cpp +++ b/contrib/enco/core/src/Transforms/Split.cpp @@ -330,6 +330,26 @@ private: coco::FeatureObject *_ofm; }; +class ANNReLU6Appender final : public ANNOpAppender +{ +public: + void ifm(coco::FeatureObject *ifm) { _ifm = ifm; } + void ofm(coco::FeatureObject *ofm) { _ofm = ofm; } + +public: + void append(ANNBinder *binder) const override + { + auto ifm = binder->addOperand(_ifm); + auto ofm = binder->addOperand(_ofm); + + binder->addOperation(ann::Operation::Code::RELU6, {ifm}, {ofm}); + } + +private: + coco::FeatureObject *_ifm; + coco::FeatureObject *_ofm; +}; + class ANNMaxPool2DAppender final : public ANNOpAppender { public: @@ -717,6 +737,28 @@ public: return std::move(app); } } + else if (auto relu6 = eval->op()->asReLU6()) + { + if (auto load = relu->arg()->asLoad()) + { + // Let's compile the following code fragment: + // + // %ofm = eval(ReLU6(Load(%ifm)) + // + // TODO Support objects of other kinds, such as Tensor + auto ifm = load->object()->asFeature(); + auto ofm = eval->out()->asFeature(); + + assert(ifm != nullptr && ofm != nullptr); + + auto app = make_unique(); + + app->ifm(ifm); + app->ofm(ofm); + + return std::move(app); + } + } // Return nullptr if a given Eval instruction is incompatible return nullptr; -- 2.7.4