From: Ivan Vagin/AI Tools Lab /SRR/Engineer/삼성전자 Date: Fri, 25 Jan 2019 14:15:40 +0000 (+0300) Subject: [nnc] Implemented PadOp in ACL backend (#2925) X-Git-Tag: nncc_backup~922 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8d22b7efee913bb15a75af777aa69ac507159d32;p=platform%2Fcore%2Fml%2Fnnfw.git [nnc] Implemented PadOp in ACL backend (#2925) Implemented ACL backend pad operation. Signed-off-by: Ivan Vagin --- diff --git a/contrib/nnc/passes/acl_soft_backend/AclCppOpGenerator.cpp b/contrib/nnc/passes/acl_soft_backend/AclCppOpGenerator.cpp index b493697..edb2733 100644 --- a/contrib/nnc/passes/acl_soft_backend/AclCppOpGenerator.cpp +++ b/contrib/nnc/passes/acl_soft_backend/AclCppOpGenerator.cpp @@ -36,6 +36,7 @@ #include "core/modelIR/operations/GemmOp.h" #include "core/modelIR/operations/InputOp.h" #include "core/modelIR/operations/LeakyReluOp.h" +#include "core/modelIR/operations/PadOp.h" #include "core/modelIR/operations/PoolOp.h" #include "core/modelIR/operations/ReduceFOp.h" #include "core/modelIR/operations/ReluOp.h" @@ -710,8 +711,32 @@ void AclCppOpGenerator::visit(ops::EluOp&) { throw AclCppException("EluOp not supported by the ACL library yet."); } -void AclCppOpGenerator::visit(ops::PadOp&) { - throw AclCppException("PadOp not supported by the ACL library yet."); +void AclCppOpGenerator::visit(ops::PadOp& op) { + // Get the id of the input tensor. + auto in_op = op.getPrevNodes()[0].op; + auto input = AF::id(tensorName(in_op)); + + // Create the output tensor in the DOM + auto out = genTensor(op, op.getOutputShape(0)); + addToPersistentTensors(out); + + // Generate PadLayer params + auto prefix = out->name() + "_pad_layer"; + auto pad_list_decl = _constrBlock->var("arm_compute::PaddingList", prefix + "_pads"); + auto pad_list = pad_list_decl->use(); + for (int i = 0; i < op.getNumDim(); ++i) { + auto pad_var = _constrBlock->var("arm_compute::PaddingInfo", prefix + "_pad_" + to_string(i), + {}, + {AF::lit(to_string(op.getPaddingForDim(i).first)), + AF::lit(to_string(op.getPaddingForDim(i).second))}); + auto pad = pad_var->use(); + _constrBlock->call("push_back", {pad}, pad_list); + } + + // Generate PadLayer + auto layer = genLayer("arm_compute::CLPadLayer", prefix, + {AF::ref(input), AF::ref(out), pad_list}); + genLayerExecution(layer); } template