From bd6dfe7bf5c9b19e27ee3628c6e0655625eff6e6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EC=9C=A4=EC=A7=80=EC=98=81/On-Device=20Lab=28SR=29/Enginee?= =?utf8?q?r/=EC=82=BC=EC=84=B1=EC=A0=84=EC=9E=90?= Date: Tue, 18 Dec 2018 16:11:41 +0900 Subject: [PATCH] [enco] Add ann backend for Sub (#2711) This commit will add the ann backend of enco for Sub. Signed-off-by: Jiyoung Yun --- contrib/enco/core/src/ANN/IR/Operation.def | 1 + contrib/enco/core/src/Transforms/Split.cpp | 53 ++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/contrib/enco/core/src/ANN/IR/Operation.def b/contrib/enco/core/src/ANN/IR/Operation.def index 693377e..8e345d9 100644 --- a/contrib/enco/core/src/ANN/IR/Operation.def +++ b/contrib/enco/core/src/ANN/IR/Operation.def @@ -13,3 +13,4 @@ ANN_OPERATION(RELU, ANEURALNETWORKS_RELU) ANN_OPERATION(RELU6, ANEURALNETWORKS_RELU6) ANN_OPERATION(PAD, ANEURALNETWORKS_PAD) ANN_OPERATION(CONCAT, ANEURALNETWORKS_CONCATENATION) +ANN_OPERATION(SUB, ANEURALNETWORKS_SUB) diff --git a/contrib/enco/core/src/Transforms/Split.cpp b/contrib/enco/core/src/Transforms/Split.cpp index 7d55a47..53cea7f 100644 --- a/contrib/enco/core/src/Transforms/Split.cpp +++ b/contrib/enco/core/src/Transforms/Split.cpp @@ -576,6 +576,32 @@ private: Appender _fun; }; +class ANNSubAppender final : public ANNOpAppender +{ +public: + void left(coco::FeatureObject *o) { _left = o; } + void right(coco::FeatureObject *o) { _right = o; } + void out(coco::FeatureObject *o) { _out = o; } + +public: + void append(ANNBinder *binder) const override + { + auto left = binder->addOperand(_left); + auto right = binder->addOperand(_right); + auto fuse = binder->addOperand(); + binder->setOperand(fuse, 0); + + auto out = binder->addOperand(_out); + + binder->addOperation(ann::Operation::Code::SUB, {left, right, fuse}, {out}); + } + +private: + coco::FeatureObject *_left = nullptr; + coco::FeatureObject *_right = nullptr; + coco::FeatureObject *_out = nullptr; +}; + class ANNOpBuilder : public coco::Instr::Visitor> { public: @@ -833,6 +859,33 @@ public: return std::move(app); } } + else if (auto op = eval->op()->asSub()) + { + auto left_load = op->left()->asLoad(); + auto right_load = op->right()->asLoad(); + + if (left_load && right_load) + { + // Let's compile the following code fragment: + // + // %out = eval(Sub(Load(%left), Load(%right))) + // + auto left = left_load->object()->asFeature(); + auto right = right_load->object()->asFeature(); + assert(left != nullptr && right != nullptr); + + auto out = eval->out()->asFeature(); + assert(out != nullptr); + + auto app = make_unique(); + + app->left(left); + app->right(right); + app->out(out); + + return std::move(app); + } + } // Return nullptr if a given Eval instruction is incompatible return nullptr; -- 2.7.4