[enco] Insert Copy instead of Shuffle (#1654)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Thu, 27 Sep 2018 07:44:21 +0000 (16:44 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Thu, 27 Sep 2018 07:44:21 +0000 (16:44 +0900)
The current implementation of data layout normalization pass inserts
shuffle, which necessitates excessive iterations.

As an optimization, this commit revises data layout normalization
pass to insert copy instead of shuffle.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
contrib/enco/core/src/Transforms/Normalize.cpp

index cb7a0cf..5887cb4 100644 (file)
@@ -14,6 +14,7 @@ using nncc::foundation::make_unique;
 
 namespace
 {
+// TODO Remove unused code
 bool aligned(const coco::FeatureObject *o, const nncc::core::ADT::feature::Layout &l)
 {
   const auto &shape = o->shape();
@@ -59,11 +60,26 @@ bool aligned(const coco::KernelObject *o, const nncc::core::ADT::kernel::Layout
   return true;
 }
 
+// TODO Remove unused code
 bool is_HWC_layout(const coco::FeatureObject *o)
 {
   return aligned(o, nncc::core::ADT::feature::HWCLayout{});
 }
 
+coco::Copy *make_copy(coco::FeatureObject *from, coco::FeatureObject *into)
+{
+  auto m = from->module();
+  assert(m != nullptr);
+  assert(from->module() == into->module());
+
+  auto copy = m->entity()->instr()->create<coco::Copy>();
+
+  copy->from(from);
+  copy->into(into);
+
+  return copy;
+}
+
 class ShuffleGen : public coco::Instr::Mutator
 {
 public:
@@ -74,11 +90,13 @@ public:
 
 private:
   coco::FeatureObject *clone(const coco::FeatureObject *oldobj) const;
+  // TODO Remove unused code
   coco::Shuffle *create(const coco::FeatureObject *from, const coco::FeatureObject *into) const;
 
 public:
   void mutate(coco::UnitF *unit) override;
   void mutate(coco::Shuffle *) override;
+  void mutate(coco::Copy *) override;
 
 private:
   coco::Module *const _module;
@@ -97,6 +115,7 @@ coco::FeatureObject *ShuffleGen::clone(const coco::FeatureObject *oldobj) const
   return newobj;
 }
 
+// TODO Remove unused code
 coco::Shuffle *ShuffleGen::create(const coco::FeatureObject *oldobj,
                                   const coco::FeatureObject *newobj) const
 {
@@ -159,26 +178,26 @@ void ShuffleGen::mutate(coco::UnitF *unit)
   //   shuffle->at(ElemID{n}) = m[ElemID{n}];
 #endif
   {
-    if (!is_HWC_layout(unit->ifm()))
+    if (unit->ifm()->layout()->id() != coco::FeatureLayouts::BHWC::uid())
     {
       auto oldobj = unit->ifm();
       auto newobj = clone(oldobj);
 
-      auto shuffle = create(oldobj, newobj);
-      shuffle->insertBefore(unit);
-
       unit->ifm(newobj);
+
+      auto copy = make_copy(oldobj, newobj);
+      copy->insertBefore(unit);
     }
 
-    if (!is_HWC_layout(unit->ofm()))
+    if (unit->ofm()->layout()->id() != coco::FeatureLayouts::BHWC::uid())
     {
       auto oldobj = unit->ofm();
       auto newobj = clone(oldobj);
 
-      auto shuffle = create(newobj, oldobj);
-      shuffle->insertAfter(unit);
-
       unit->ofm(newobj);
+
+      auto copy = make_copy(newobj, oldobj);
+      copy->insertAfter(unit);
     }
   }
 
@@ -200,6 +219,11 @@ void ShuffleGen::mutate(coco::Shuffle *)
   // DO NOTHING
 }
 
+void ShuffleGen::mutate(coco::Copy *)
+{
+  // DO NOTHING
+}
+
 } // namespace
 
 namespace enco