// // NPUUnary.cpp // MNN // // Created by MNN on b'2020/10/15'. // Copyright © 2018, Alibaba Group Holding Limited // #include "NPUUnary.hpp" #include "NPUBackend.hpp" using namespace std; namespace MNN { NPUUnary::NPUUnary(MNN::Backend *b, const MNN::Op *op, const std::vector &inputs, const std::vector &outputs) : NPUCommonExecution(b, op) {} ErrorCode NPUUnary::onResize(const std::vector &inputs, const std::vector &outputs) { mNpuBackend->setNetworkInput(inputs, mOp); auto opName = mOp->name()->str(); auto xOp = mNpuBackend->getInputOps(mOp); auto inputIndex = mOp->inputIndexes()->data()[0]; auto iops = mNpuBackend->mGrapMap[inputIndex]; // x xOp = iops.back().first; auto unary_type = mOp->main_as_UnaryOp()->opType(); if (unary_type == UnaryOpOperation_EXP){ shared_ptr unary(new hiai::op::Exp(opName)); (*unary).set_input_x(*xOp.get()); mNpuBackend->setOutputOps(mOp, {unary}, outputs); } else if (unary_type == UnaryOpOperation_NEG){ shared_ptr unary(new hiai::op::Neg(opName)); (*unary).set_input_x(*xOp.get()); mNpuBackend->setOutputOps(mOp, {unary}, outputs); } else if (unary_type == UnaryOpOperation_ABS){ shared_ptr unary(new hiai::op::Activation(opName+ "_abs")); (*unary).set_input_x(*xOp.get()) .set_attr_mode(6); mNpuBackend->setOutputOps(mOp, {unary}, outputs); } else if (unary_type == UnaryOpOperation_SIGMOID){ shared_ptr unary(new hiai::op::Activation(opName+ "_sigmoid")); (*unary).set_input_x(*xOp.get()) .set_attr_mode(0); mNpuBackend->setOutputOps(mOp, {unary}, outputs); } else if (unary_type == UnaryOpOperation_TANH) { shared_ptr unary(new hiai::op::Activation(opName)); (*unary) .set_attr_coef(.000000) .set_attr_negative_slope(0.0f) .set_attr_mode(2); (*unary).set_input_x(*xOp.get()); mNpuBackend->setOutputOps(mOp, {unary}, outputs); } else if (unary_type == UnaryOpOperation_SILU) { shared_ptr unary(new hiai::op::Swish(opName)); (*unary).set_input_x(*xOp.get()); mNpuBackend->setOutputOps(mOp, {unary}, outputs); } else if (unary_type == UnaryOpOperation_SQRT){ shared_ptr unary(new hiai::op::Sqrt(opName)); (*unary).set_input_x(*xOp.get()); mNpuBackend->setOutputOps(mOp, {unary}, outputs); } else if (unary_type == UnaryOpOperation_HARDSWISH){ shared_ptr unary(new hiai::op::HardSwish(opName)); (*unary).set_input_x(*xOp.get()); mNpuBackend->setOutputOps(mOp, {unary}, outputs); } else if (unary_type == UnaryOpOperation_RSQRT){ shared_ptr unary(new hiai::op::Rsqrt(opName)); (*unary).set_input_x(*xOp.get()); mNpuBackend->setOutputOps(mOp, {unary}, outputs); } else if (unary_type == UnaryOpOperation_SQUARE){ shared_ptr unary(new hiai::op::Square(opName)); (*unary).set_input_x(*xOp.get()); mNpuBackend->setOutputOps(mOp, {unary}, outputs); } else if (unary_type == UnaryOpOperation_LOG){ shared_ptr unary(new hiai::op::Log(opName)); (*unary).set_input_x(*xOp.get()); mNpuBackend->setOutputOps(mOp, {unary}, outputs); } else if (unary_type == UnaryOpOperation_GELU || unary_type == UnaryOpOperation_GELU_STANDARD){ shared_ptr unary(new hiai::op::Activation(opName+ "_gelu")); (*unary).set_input_x(*xOp.get()).set_attr_mode(15); mNpuBackend->setOutputOps(mOp, {unary}, outputs); } else if (unary_type == UnaryOpOperation_ERF){ shared_ptr unary(new hiai::op::Erf(opName)); (*unary).set_input_x(*xOp.get()); mNpuBackend->setOutputOps(mOp, {unary}, outputs); } else { MNN_ERROR("unary not support this case : %d \n", unary_type); } return NO_ERROR; } NPUCreatorRegister> __unary_op(OpType_UnaryOp); } // namespace MNN