From d24f5f8a508b2a30131771bf6222d4884acf46e5 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: Tue, 28 Aug 2018 16:06:39 +0900 Subject: [PATCH] [enco] Initilize Conv2D kernel overlay (#1206) This commit revises caffe frontend to initialize Conv2D kernel overlay. Signed-off-by: Jonghyun Park --- contrib/enco/frontend/caffe/src/Frontend.cpp | 52 +++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/contrib/enco/frontend/caffe/src/Frontend.cpp b/contrib/enco/frontend/caffe/src/Frontend.cpp index 7394297..3357504 100644 --- a/contrib/enco/frontend/caffe/src/Frontend.cpp +++ b/contrib/enco/frontend/caffe/src/Frontend.cpp @@ -2,6 +2,8 @@ #include "ConvolutionSpec.h" #include +#include +#include #include #include #include @@ -41,6 +43,11 @@ tensor::Shape as_tensor_shape(const ::caffe::BlobShape &blob_shape) return res; } +tensor::Shape as_tensor_shape(const ::caffe::BlobProto *blob_proto) +{ + return as_tensor_shape(blob_proto->shape()); +} + } // namespace Frontend::Frontend() : _prototxt{new ::caffe::NetParameter}, _caffemodel{new ::caffe::NetParameter} @@ -55,6 +62,27 @@ enco::Bundle Frontend::load(void) const auto d = coco::Data::create(); + // For weight access + std::map weight_ctx; + + for (uint32_t n = 0; n < _caffemodel->layer_size(); ++n) + { + auto layer = _caffemodel->mutable_layer(n); + + if (layer->has_name()) + { + weight_ctx[layer->name()] = layer; + } + } + + auto blob_count = [&weight_ctx](const std::string &name) { + return weight_ctx.at(name)->blobs_size(); + }; + + auto blob_get = [&weight_ctx](const std::string &name, uint32_t n) { + return weight_ctx.at(name)->mutable_blobs(n); + }; + // For inter-layer communication std::map shape_ctx; std::map bag_ctx; @@ -146,7 +174,29 @@ enco::Bundle Frontend::load(void) const auto ker_id = d->allocate(num_elements(ker_shape) * sizeof(float)); d->f32()->link(ker_id, ker_obj); - // TODO Initializer the kernel overlay + // Initialize the kernel overlay + assert(blob_count(layer.name()) >= 1); + auto ker_blob = blob_get(layer.name(), 0); + + assert(ker_shape == as_tensor_shape(ker_blob)); + + auto ker_dst = d->f32()->access(ker_obj); + auto ker_src = kernel::OverlayFactory::make( + ker_obj->shape(), ker_blob->mutable_data()->begin()); + + for (uint32_t n = 0; n < ker_obj->shape().count(); ++n) + { + for (uint32_t ch = 0; ch < ker_obj->shape().depth(); ++ch) + { + for (uint32_t row = 0; row < ker_obj->shape().height(); ++row) + { + for (uint32_t col = 0; col < ker_obj->shape().width(); ++col) + { + ker_dst->at(n, ch, row, col) = ker_src.at(n, ch, row, col); + } + } + } + } // Create a Conv2D op auto op = m->entity()->op()->create(); -- 2.7.4