Introduce padding struct (#5210)
author오형석/On-Device Lab(SR)/Staff Engineer/삼성전자 <hseok82.oh@samsung.com>
Fri, 17 May 2019 10:04:50 +0000 (19:04 +0900)
committer박세희/On-Device Lab(SR)/Principal Engineer/삼성전자 <saehie.park@samsung.com>
Fri, 17 May 2019 10:04:50 +0000 (19:04 +0900)
* Introduce padding struct

Introduce padding struct including padding type and explicit padding value
Use padding type field only

Signed-off-by: Hyeongseok Oh <hseok82.oh@samsung.com>
* Fix bug in debug build

14 files changed:
runtimes/neurun/backend/acl_cl/StageGenerator.cc
runtimes/neurun/backend/acl_neon/StageGenerator.cc
runtimes/neurun/backend/cpu/StageGenerator.cc
runtimes/neurun/core/include/model/InternalType.h
runtimes/neurun/core/include/model/operation/AvgPool2DNode.h
runtimes/neurun/core/include/model/operation/Conv2DNode.h
runtimes/neurun/core/include/model/operation/DepthwiseConv2DNode.h
runtimes/neurun/core/include/model/operation/L2Pool2DNode.h
runtimes/neurun/core/include/model/operation/MaxPool2DNode.h
runtimes/neurun/core/include/model/operation/TransposeConvNode.h
runtimes/neurun/core/src/compiler/OperationValidator.cc
runtimes/neurun/core/src/graph/dumper/Dumper.cc
runtimes/neurun/frontend/nnapi/wrapper/OperationFactory.cc
runtimes/neurun/test/graph/operation/SetIO.cc

index 439ec7a..3a50ed2 100644 (file)
@@ -254,7 +254,7 @@ void StageGenerator::visit(const model::operation::Conv2DNode &node)
   param.stride = stride;
 
   // TODO : Extract this to a function
-  const auto padding_type = node.param().padding;
+  const auto padding_type = node.param().padding.type;
   param.padding = [&]() {
     if (padding_type != model::PaddingType::EXPLICIT) // implicit padding
     {
@@ -351,7 +351,7 @@ void StageGenerator::visit(const model::operation::DepthwiseConv2DNode &node)
   param.stride = stride;
 
   // TODO : Extract this to a function
-  const auto padding_type = node.param().padding;
+  const auto padding_type = node.param().padding.type;
   param.padding = [&]() {
     if (padding_type != model::PaddingType::EXPLICIT) // implicit padding
     {
@@ -449,7 +449,7 @@ void StageGenerator::visit(const model::operation::MaxPool2DNode &node)
   param.stride.horizontal = hstride;
 
   // TODO : Extract this to a function
-  const auto padding_type = node.param().padding;
+  const auto padding_type = node.param().padding.type;
   param.padding = [&]() {
     if (padding_type != model::PaddingType::EXPLICIT) // implicit padding
     {
@@ -556,7 +556,7 @@ void StageGenerator::visit(const model::operation::AvgPool2DNode &node)
   param.stride.horizontal = hstride;
 
   // TODO : Extract this to a function
-  const auto padding_type = node.param().padding;
+  const auto padding_type = node.param().padding.type;
   param.padding = [&]() {
     if (padding_type != model::PaddingType::EXPLICIT) // implicit padding
     {
@@ -2018,7 +2018,7 @@ void StageGenerator::visit(const model::operation::L2Pool2DNode &node)
   param.stride = stride;
 
   // TODO : Extract this to a function
-  const auto padding_type = node.param().padding;
+  const auto padding_type = node.param().padding.type;
   param.padding = [&]() {
     if (padding_type != model::PaddingType::EXPLICIT) // implicit padding
     {
@@ -2314,7 +2314,7 @@ void StageGenerator::visit(const model::operation::TransposeConvNode &node)
   param.stride.horizontal = hstride;
   param.stride.vertical = vstride;
 
-  const auto padding_type = node.param().padding;
+  const auto padding_type = node.param().padding.type;
   assert((padding_type == model::PaddingType::SAME) || (padding_type == model::PaddingType::VALID));
   param.padding =
       (padding_type == model::PaddingType::SAME)
index 72615ca..6f96e3d 100644 (file)
@@ -221,7 +221,7 @@ void StageGenerator::visit(const model::operation::Conv2DNode &node)
   param.stride = stride;
 
   // TODO : Extract this to a function
-  const auto padding_type = node.param().padding;
+  const auto padding_type = node.param().padding.type;
   param.padding = [&]() {
     if (padding_type != model::PaddingType::EXPLICIT) // implicit padding
     {
@@ -318,7 +318,7 @@ void StageGenerator::visit(const model::operation::DepthwiseConv2DNode &node)
   param.stride = stride;
 
   // TODO : Extract this to a function
-  const auto padding_type = node.param().padding;
+  const auto padding_type = node.param().padding.type;
   param.padding = [&]() {
     if (padding_type != model::PaddingType::EXPLICIT) // implicit padding
     {
@@ -416,7 +416,7 @@ void StageGenerator::visit(const model::operation::MaxPool2DNode &node)
   param.stride.horizontal = hstride;
 
   // TODO : Extract this to a function
-  const auto padding_type = node.param().padding;
+  const auto padding_type = node.param().padding.type;
   param.padding = [&]() {
     if (padding_type != model::PaddingType::EXPLICIT) // implicit padding
     {
@@ -523,7 +523,7 @@ void StageGenerator::visit(const model::operation::AvgPool2DNode &node)
   param.stride.horizontal = hstride;
 
   // TODO : Extract this to a function
-  const auto padding_type = node.param().padding;
+  const auto padding_type = node.param().padding.type;
   param.padding = [&]() {
     if (padding_type != model::PaddingType::EXPLICIT) // implicit padding
     {
index 3fb6bf0..799bfcb 100644 (file)
@@ -104,7 +104,7 @@ void StageGenerator::visit(const model::operation::Conv2DNode &node)
   param.stride = stride;
 
   // TODO : Extract this to a function
-  const auto padding_type = node.param().padding;
+  const auto padding_type = node.param().padding.type;
   param.padding = [&]() {
     if (padding_type != model::PaddingType::EXPLICIT) // implicit padding
     {
@@ -209,7 +209,7 @@ void StageGenerator::visit(const model::operation::DepthwiseConv2DNode &node)
   param.stride = stride;
 
   // TODO : Extract this to a function
-  const auto padding_type = node.param().padding;
+  const auto padding_type = node.param().padding.type;
   param.padding = [&]() {
     if (padding_type != model::PaddingType::EXPLICIT) // implicit padding
     {
@@ -309,7 +309,7 @@ void StageGenerator::visit(const model::operation::MaxPool2DNode &node)
   param.stride.horizontal = hstride;
 
   // TODO : Extract this to a function
-  const auto padding_type = node.param().padding;
+  const auto padding_type = node.param().padding.type;
   param.padding = [&]() {
     if (padding_type != model::PaddingType::EXPLICIT) // implicit padding
     {
@@ -404,7 +404,7 @@ void StageGenerator::visit(const model::operation::AvgPool2DNode &node)
   param.stride.horizontal = hstride;
 
   // TODO : Extract this to a function
-  const auto padding_type = node.param().padding;
+  const auto padding_type = node.param().padding.type;
   param.padding = [&]() {
     if (padding_type != model::PaddingType::EXPLICIT) // implicit padding
     {
index 54ba6bd..7cf9226 100644 (file)
@@ -17,6 +17,8 @@
 #ifndef __NEURUN_MODEL_INTERNAL_TYPE_H__
 #define __NEURUN_MODEL_INTERNAL_TYPE_H__
 
+#include <cstdint>
+
 namespace neurun
 {
 namespace model
@@ -39,6 +41,22 @@ enum class PaddingType
   VALID = 2
 };
 
+// TODO merge with neurun::util::Padding struct
+struct ExplicitPadding
+{
+  int32_t left;
+  int32_t right;
+  int32_t top;
+  int32_t bottom;
+};
+
+// TODO Resolve explicit padding value at frontend and save in value field
+struct Padding
+{
+  PaddingType type;
+  ExplicitPadding value;
+};
+
 } // namespace model
 } // namespace neurun
 
index dd62f55..cf0e54e 100644 (file)
@@ -45,7 +45,7 @@ public:
     OperandIndex hstride_index;
     OperandIndex vstride_index;
 
-    PaddingType padding;
+    Padding padding;
 
     OperandIndex padding_left_index;
     OperandIndex padding_right_index;
index be3f019..b5e314f 100644 (file)
@@ -44,7 +44,7 @@ public:
     OperandIndex hstride_index;
     OperandIndex vstride_index;
 
-    PaddingType padding;
+    Padding padding;
 
     OperandIndex padding_left_index;
     OperandIndex padding_right_index;
index ddd0d07..5d27eb5 100644 (file)
@@ -44,7 +44,7 @@ public:
     OperandIndex hstride_index;
     OperandIndex vstride_index;
 
-    PaddingType padding;
+    Padding padding;
 
     OperandIndex padding_left_index;
     OperandIndex padding_right_index;
index eedfbda..5fbddfb 100644 (file)
@@ -39,7 +39,7 @@ public:
 
   struct Param
   {
-    PaddingType padding;
+    Padding padding;
 
     OperandIndex padding_left_index;
     OperandIndex padding_right_index;
index 23626cf..8217e70 100644 (file)
@@ -45,7 +45,7 @@ public:
     OperandIndex hstride_index;
     OperandIndex vstride_index;
 
-    PaddingType padding;
+    Padding padding;
 
     OperandIndex padding_left_index;
     OperandIndex padding_right_index;
index 3247501..38ba3f5 100644 (file)
@@ -41,7 +41,7 @@ public:
 
   struct Param
   {
-    PaddingType padding;
+    Padding padding;
     OperandIndex hstride_index;
     OperandIndex vstride_index;
   };
index 9204c9d..927f7dc 100644 (file)
@@ -356,8 +356,8 @@ void OperationValidator::visit(const model::operation::TransposeConvNode &node)
 
   assert(vstride > 0);
   assert(hstride > 0);
-  assert((node.param().padding == model::PaddingType::SAME) ||
-         (node.param().padding == model::PaddingType::VALID));
+  assert((node.param().padding.type == model::PaddingType::SAME) ||
+         (node.param().padding.type == model::PaddingType::VALID));
   assert(ifm_shape.N == ofm_shape.N);
   assert(ifm_shape.C == ker_shape.C);
   assert(ker_shape.N == ofm_shape.C);
index 771a685..92514a4 100644 (file)
@@ -93,7 +93,7 @@ void Dumper::visit(const ConcatNode &node)
 void Dumper::visit(const Conv2DNode &node)
 {
   std::string padding_type =
-      node.param().padding == model::PaddingType::EXPLICIT ? "Explicit" : "Implicit";
+      node.param().padding.type == model::PaddingType::EXPLICIT ? "Explicit" : "Implicit";
   VERBOSE(LIR) << "* Conv2D(" << padding_type << ")" << std::endl;
   VERBOSE(LIR) << "  - Inputs : IFM(" << node.getInputs().at(Conv2DNode::Input::INPUT).value()
                << ") Kernel(" << node.getInputs().at(Conv2DNode::Input::KERNEL).value() << ") Bias("
@@ -112,7 +112,7 @@ void Dumper::visit(const DepthToSpaceNode &node)
 void Dumper::visit(const DepthwiseConv2DNode &node)
 {
   std::string padding_type =
-      node.param().padding == model::PaddingType::EXPLICIT ? "Explicit" : "Implicit";
+      node.param().padding.type == model::PaddingType::EXPLICIT ? "Explicit" : "Implicit";
   VERBOSE(LIR) << "* DepthwiseConv2D(" << padding_type << ")" << std::endl;
   VERBOSE(LIR) << "  - Inputs : IFM("
                << node.getInputs().at(DepthwiseConv2DNode::Input::INPUT).value() << ") Kernel("
@@ -259,7 +259,7 @@ void Dumper::visit(const LogisticNode &node)
 void Dumper::visit(const MaxPool2DNode &node)
 {
   std::string padding_type =
-      node.param().padding == model::PaddingType::EXPLICIT ? "Explicit" : "Implicit";
+      node.param().padding.type == model::PaddingType::EXPLICIT ? "Explicit" : "Implicit";
   VERBOSE(LIR) << "* MaxPool2D(" << padding_type << ")" << std::endl;
   VERBOSE(LIR) << "  - Inputs : IFM(" << node.getInputs().at(MaxPool2DNode::Input::INPUT).value()
                << ")" << std::endl;
@@ -469,7 +469,7 @@ void Dumper::visit(const TopKV2Node &node)
 void Dumper::visit(const TransposeConvNode &node)
 {
   std::string padding_type =
-      node.param().padding == model::PaddingType::EXPLICIT ? "Explicit" : "Implicit";
+      node.param().padding.type == model::PaddingType::EXPLICIT ? "Explicit" : "Implicit";
   VERBOSE(LIR) << "* TransposeConv(" << padding_type << ")" << std::endl;
   VERBOSE(LIR) << "  - Inputs : Output Shape("
                << node.getInputs().at(TransposeConvNode::Input::OUTPUT_SHAPE).value() << ") KERNEL("
index d30dc3d..a59854a 100644 (file)
@@ -68,7 +68,7 @@ OperationFactory::OperationFactory()
       const auto padding_index = OperandIndex{init_param.inputs[3]};
       const auto activation_index = OperandIndex{init_param.inputs[7]};
 
-      param.padding =
+      param.padding.type =
           NNAPIConvert::getPaddingType(operands.at(padding_index).asScalar<PaddingCode>());
       param.hstride_index = OperandIndex{init_param.inputs[4]};
       param.vstride_index = OperandIndex{init_param.inputs[5]};
@@ -92,7 +92,7 @@ OperationFactory::OperationFactory()
 
       const auto activation_index = OperandIndex{init_param.inputs[10]};
 
-      param.padding = PaddingType::EXPLICIT;
+      param.padding.type = PaddingType::EXPLICIT;
       param.padding_left_index = OperandIndex{init_param.inputs[3]};
       param.padding_right_index = OperandIndex{init_param.inputs[4]};
       param.padding_top_index = OperandIndex{init_param.inputs[5]};
@@ -132,7 +132,7 @@ OperationFactory::OperationFactory()
       const auto padding_index = OperandIndex{init_param.inputs[1]};
       const auto activation_index = OperandIndex{init_param.inputs[6]};
 
-      param.padding =
+      param.padding.type =
           NNAPIConvert::getPaddingType(operands.at(padding_index).asScalar<PaddingCode>());
 
       param.hstride_index = OperandIndex{init_param.inputs[2]};
@@ -159,7 +159,7 @@ OperationFactory::OperationFactory()
 
       const auto activation_index = OperandIndex{init_param.inputs[9]};
 
-      param.padding = PaddingType::EXPLICIT;
+      param.padding.type = PaddingType::EXPLICIT;
 
       param.padding_left_index = OperandIndex{init_param.inputs[1]};
       param.padding_right_index = OperandIndex{init_param.inputs[2]};
@@ -202,7 +202,7 @@ OperationFactory::OperationFactory()
       const auto padding_index = OperandIndex{init_param.inputs[1]};
       const auto activation_index = OperandIndex{init_param.inputs[6]};
 
-      param.padding =
+      param.padding.type =
           NNAPIConvert::getPaddingType(operands.at(padding_index).asScalar<PaddingCode>());
       param.hstride_index = OperandIndex{init_param.inputs[2]};
       param.vstride_index = OperandIndex{init_param.inputs[3]};
@@ -228,7 +228,7 @@ OperationFactory::OperationFactory()
 
       auto activation_index = OperandIndex{init_param.inputs[9]};
 
-      param.padding = PaddingType::EXPLICIT;
+      param.padding.type = PaddingType::EXPLICIT;
 
       param.padding_left_index = OperandIndex{init_param.inputs[1]};
       param.padding_right_index = OperandIndex{init_param.inputs[2]};
@@ -372,7 +372,7 @@ OperationFactory::OperationFactory()
       const auto padding_index = OperandIndex{init_param.inputs[3]};
       const auto activation_index = OperandIndex{init_param.inputs[6]};
 
-      param.padding =
+      param.padding.type =
           NNAPIConvert::getPaddingType(operands.at(padding_index).asScalar<PaddingCode>());
       param.hstride_index = OperandIndex{init_param.inputs[4]};
       param.vstride_index = OperandIndex{init_param.inputs[5]};
@@ -393,7 +393,7 @@ OperationFactory::OperationFactory()
 
       const auto activation_index = OperandIndex{init_param.inputs[6]};
 
-      param.padding = PaddingType::EXPLICIT;
+      param.padding.type = PaddingType::EXPLICIT;
       param.padding_left_index = OperandIndex{init_param.inputs[3]};
       param.padding_right_index = OperandIndex{init_param.inputs[4]};
       param.padding_top_index = OperandIndex{init_param.inputs[5]};
@@ -882,7 +882,7 @@ OperationFactory::OperationFactory()
       const auto padding_index = OperandIndex{init_param.inputs[1]};
       const auto activation_index = OperandIndex{init_param.inputs[6]};
 
-      param.padding =
+      param.padding.type =
           NNAPIConvert::getPaddingType(operands.at(padding_index).asScalar<PaddingCode>());
       param.hstride_index = OperandIndex{init_param.inputs[2]};
       param.vstride_index = OperandIndex{init_param.inputs[3]};
@@ -904,7 +904,7 @@ OperationFactory::OperationFactory()
       //  9 -> FuseCode (activation) Index
       const auto activation_index = OperandIndex{init_param.inputs[9]};
 
-      param.padding = PaddingType::EXPLICIT;
+      param.padding.type = PaddingType::EXPLICIT;
       param.padding_left_index = OperandIndex{init_param.inputs[1]};
       param.padding_right_index = OperandIndex{init_param.inputs[2]};
       param.padding_top_index = OperandIndex{init_param.inputs[3]};
@@ -1002,7 +1002,7 @@ OperationFactory::OperationFactory()
 
     operation::TransposeConvNode::Param param;
     auto padding_index = OperandIndex{init_param.inputs[3]};
-    param.padding =
+    param.padding.type =
         NNAPIConvert::getPaddingType(operands.at(padding_index).asScalar<PaddingCode>());
     param.hstride_index = OperandIndex{init_param.inputs[4]};
     param.vstride_index = OperandIndex{init_param.inputs[5]};
index b41065f..b98b914 100644 (file)
@@ -46,7 +46,7 @@ TEST(graph_operation_setIO, operation_setIO_conv)
   IndexSet inputs{input_operand, kernel_operand, bias_operand};
 
   GraphNode::Param conv_params;
-  conv_params.padding = neurun::model::PaddingType::SAME;
+  conv_params.padding.type = neurun::model::PaddingType::SAME;
   conv_params.hstride_index = model.operands.append(shape, type);
   conv_params.vstride_index = model.operands.append(shape, type);
   conv_params.activation = neurun::model::Activation::NONE;