From 30944fde95ce2b3f956f6500a15c4d973bf17386 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EB=B0=95=EC=A2=85=ED=98=84/=EB=8F=99=EC=9E=91=EC=A0=9C?= =?utf8?q?=EC=96=B4Lab=28SR=29/Staff=20Engineer/=EC=82=BC=EC=84=B1?= =?utf8?q?=EC=A0=84=EC=9E=90?= Date: Thu, 16 Aug 2018 15:49:58 +0900 Subject: [PATCH] [coco] Automatic update Kernel Object's user list (#1049) This commit revises Conv2D op class to automatically update kernel object's user list on ker method call. Signed-off-by: Jonghyun Park --- contrib/coco/core/include/coco/IR/Op.h | 9 +++++---- contrib/coco/core/src/IR/Op.cpp | 10 ++++++---- contrib/coco/core/src/IR/Op.test.cpp | 6 +++++- contrib/coco/core/src/IR/OpManager.cpp | 2 +- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/contrib/coco/core/include/coco/IR/Op.h b/contrib/coco/core/include/coco/IR/Op.h index 83f2ae5..f56e35f 100644 --- a/contrib/coco/core/include/coco/IR/Op.h +++ b/contrib/coco/core/include/coco/IR/Op.h @@ -81,6 +81,7 @@ public: } // namespace coco #include "coco/IR/KernelObject.h" +#include "coco/IR/UseSlot.h" namespace coco { @@ -91,7 +92,7 @@ namespace coco * NOTE IFM and OFM are implicit. Only 4D kernel is explicit in this class * TODO Decide source code layout policy and extract this class if necessary */ -class Conv2D : public Op +class Conv2D : public Op, public Object::Use { public: struct Param @@ -103,7 +104,7 @@ public: }; public: - explicit Conv2D(const PtrLink *, const Param &); + explicit Conv2D(const PtrLink *, const PtrLink *, const Param &); public: std::set uses(void) const override; @@ -113,10 +114,10 @@ public: const Conv2D *asConv2D(void) const override { return this; } private: - KernelObject *_ker; + UseSlot _ker; public: - KernelObject *ker(void) const { return _ker; } + KernelObject *ker(void) const { return _ker.value(); } void ker(KernelObject *ker); private: diff --git a/contrib/coco/core/src/IR/Op.cpp b/contrib/coco/core/src/IR/Op.cpp index 3cee376..2364163 100644 --- a/contrib/coco/core/src/IR/Op.cpp +++ b/contrib/coco/core/src/IR/Op.cpp @@ -22,7 +22,9 @@ Instr *Op::parent(void) const namespace coco { -Conv2D::Conv2D(const PtrLink *op_link, const Param &) : _op_link{op_link}, _ker{nullptr} +Conv2D::Conv2D(const PtrLink *op_link, const PtrLink *obj_link, + const Param &) + : _op_link{op_link}, _ker{obj_link, this} { // NOTE Currently, Param class is just a placeholder } @@ -31,14 +33,14 @@ std::set Conv2D::uses(void) const { std::set res; - if (_ker) + if (ker()) { - res.insert(_ker); + res.insert(ker()); } return res; } -void Conv2D::ker(KernelObject *ker) { _ker = ker; } +void Conv2D::ker(KernelObject *ker) { _ker.value(ker); } } // namespace coco diff --git a/contrib/coco/core/src/IR/Op.test.cpp b/contrib/coco/core/src/IR/Op.test.cpp index 6cab7e7..b45b71f 100644 --- a/contrib/coco/core/src/IR/Op.test.cpp +++ b/contrib/coco/core/src/IR/Op.test.cpp @@ -19,7 +19,7 @@ public: protected: coco::Conv2D *allocate(const coco::Conv2D::Param ¶m) { - auto op = new coco::Conv2D{&op_link, param}; + auto op = new coco::Conv2D{&op_link, &obj_link, param}; _allocated.emplace_back(op); return op; } @@ -89,6 +89,10 @@ TEST_F(Conv2DTest, ker_update) ASSERT_NE(uses.find(obj), uses.end()); } + + // ker method should enlist op itself as a user of a given kernel object + ASSERT_EQ(obj->user()->size(), 1); + ASSERT_EQ(obj->user()->count(op), 1); } TEST_F(Conv2DTest, accept) diff --git a/contrib/coco/core/src/IR/OpManager.cpp b/contrib/coco/core/src/IR/OpManager.cpp index d534567..d67c1dc 100644 --- a/contrib/coco/core/src/IR/OpManager.cpp +++ b/contrib/coco/core/src/IR/OpManager.cpp @@ -15,7 +15,7 @@ OpManager::OpManager(const PtrLink *op_link, const PtrLink(_op_link, param)); + return take(make_unique(_op_link, _obj_link, param)); } } // namespace coco -- 2.7.4