[coco] Introduce BHWC Feature Layout (#1601)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Thu, 20 Sep 2018 23:57:37 +0000 (08:57 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Thu, 20 Sep 2018 23:57:37 +0000 (08:57 +0900)
This commit implements BHWC Feature Layout class, which may speed up
some model import/codegen phase.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
contrib/coco/core/include/coco/IR/FeatureLayouts.h
contrib/coco/core/src/IR/FeatureLayouts.cpp

index cbd6af9..8f3392c 100644 (file)
@@ -35,6 +35,31 @@ public:
   static std::unique_ptr<BCHW> create(const nncc::core::ADT::feature::Shape &shape);
 };
 
+/**
+ * @brief BHWC Feature Layout
+ */
+class BHWC : public coco::FeatureLayout
+{
+private:
+  BHWC(uint32_t batch, const nncc::core::ADT::feature::Shape &shape) : _batch{batch}, _shape{shape}
+  {
+    // DO NOTHING
+  }
+
+public:
+  uint32_t batch(void) const override { return _batch; }
+  const nncc::core::ADT::feature::Shape &shape(void) const override { return _shape; }
+
+  coco::ElemID at(uint32_t b, uint32_t ch, uint32_t row, uint32_t col) const override;
+
+private:
+  uint32_t _batch;
+  nncc::core::ADT::feature::Shape _shape;
+
+public:
+  static std::unique_ptr<BHWC> create(const nncc::core::ADT::feature::Shape &shape);
+};
+
 } // namespace FeatureLayouts
 } // namespace coco
 
index f3f9f85..d3522f7 100644 (file)
@@ -1,6 +1,7 @@
 #include "coco/IR/FeatureLayouts.h"
 
 #include <nncc/core/ADT/feature/CHWLayout.h>
+#include <nncc/core/ADT/feature/HWCLayout.h>
 
 using namespace nncc::core::ADT::feature;
 
@@ -30,3 +31,31 @@ std::unique_ptr<BCHW> BCHW::create(const nncc::core::ADT::feature::Shape &shape)
 
 } // namespace FeatureLayouts
 } // namespace coco
+
+//
+// BHWC Layout
+//
+namespace coco
+{
+namespace FeatureLayouts
+{
+
+ElemID BHWC::at(uint32_t b, uint32_t ch, uint32_t row, uint32_t col) const
+{
+  static HWCLayout l;
+
+  uint32_t offset = 0;
+  offset += b * num_elements(_shape);
+  offset += l.offset(_shape, ch, row, col);
+
+  return ElemID{offset};
+}
+
+std::unique_ptr<BHWC> BHWC::create(const nncc::core::ADT::feature::Shape &shape)
+{
+  // NOTE It is impossible to use make_unique here as the constructor is private
+  return std::unique_ptr<BHWC>{new BHWC{1, shape}};
+}
+
+} // namespace FeatureLayouts
+} // namespace coco