[nnc] Implemented PadOp in ACL backend (#2925)
authorIvan Vagin/AI Tools Lab /SRR/Engineer/삼성전자 <ivan.vagin@samsung.com>
Fri, 25 Jan 2019 14:15:40 +0000 (17:15 +0300)
committerEfimov Alexander/AI Tools Lab/./Samsung Electronics <a.efimov@samsung.com>
Fri, 25 Jan 2019 14:15:40 +0000 (17:15 +0300)
Implemented ACL backend pad operation.

Signed-off-by: Ivan Vagin <ivan.vagin@samsung.com>
contrib/nnc/passes/acl_soft_backend/AclCppOpGenerator.cpp

index b493697..edb2733 100644 (file)
@@ -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 <typename Op>