diff options
Diffstat (limited to 'runtimes/neurun/backend/srcn/KernelGenerator.cc')
-rw-r--r-- | runtimes/neurun/backend/srcn/KernelGenerator.cc | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/runtimes/neurun/backend/srcn/KernelGenerator.cc b/runtimes/neurun/backend/srcn/KernelGenerator.cc new file mode 100644 index 000000000..c0cd8b43c --- /dev/null +++ b/runtimes/neurun/backend/srcn/KernelGenerator.cc @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "KernelGenerator.h" + +#include <stdexcept> + +#include "cpp14/memory.h" +#include "util/Padding.h" +#include "kernel/TransposeConvLayer.h" + +#include <backend/Backend.h> +#include <backend/IConfig.h> + +#include "util/logging.h" + +#include "util/Utils.h" + +namespace neurun +{ +namespace backend +{ +namespace srcn +{ + +KernelGenerator::KernelGenerator(const neurun::model::Operands &operand_ctx, + const std::shared_ptr<TensorBuilder> &tensor_builder, + const std::shared_ptr<custom::KernelRegistry> &kernel_registry) + : _ctx(operand_ctx), _tensor_builder(tensor_builder), _kernel_registry(kernel_registry), + _current_subg_layout(model::Layout::UNKNOWN) +{ + // DO NOTHING +} + +void KernelGenerator::visit(const model::Subgraph &subgraph) +{ + _current_subg_layout = subgraph.getLayout(); + for (const auto &e : subgraph.operations()) + { + const auto &node = *(e.node); + _tensor_builder->preVisit(node); + node.accept(*this); + _tensor_builder->postVisit(node); + } +} + +void KernelGenerator::visit(const model::operation::TransposeConvNode &node) +{ + using model::operation::TransposeConvNode; + + const auto ofm_index{node.getOutputs().at(0)}; + const auto ifm_index{node.getInputs().at(TransposeConvNode::Input::INPUT)}; + const auto ker_index{node.getInputs().at(TransposeConvNode::Input::KERNEL)}; + const auto output_shape_index{node.getInputs().at(TransposeConvNode::Input::OUTPUT_SHAPE)}; + + const auto ifm_shape = _ctx.at(ifm_index).shape().asFeature(_current_subg_layout); + const auto ofm_shape = _ctx.at(ofm_index).shape().asFeature(_current_subg_layout); + // Kernel format is [depth_out, kernel_height, kernel_width, depth_in]. + const auto &ker_shape = _ctx.at(ker_index).shape(); + const auto ker_height = ker_shape.dim(1); + const auto ker_width = ker_shape.dim(2); + const auto stride = node.param().stride; + const int padding_type = (node.param().padding.type == model::PaddingType::SAME); + const auto padding = neurun::util::calculatePadding(node.param().padding, ofm_shape, ifm_shape, + stride, ker_width, ker_height); + + const auto ofm_backend_shape = + ::neurun::backend::srcn::kernel::getShape(_ctx.at(ofm_index), _current_subg_layout); + const auto ifm_backend_shape = + ::neurun::backend::srcn::kernel::getShape(_ctx.at(ifm_index), _current_subg_layout); + const auto ker_backend_shape = + ::neurun::backend::srcn::kernel::getShape(_ctx.at(ker_index), model::Layout::UNKNOWN); + + auto ofm_alloc = _tensor_builder->at(ofm_index); + auto ifm_alloc = _tensor_builder->at(ifm_index); + auto ker_alloc = _tensor_builder->at(ker_index); + + auto fn = nnfw::cpp14::make_unique<::neurun::backend::srcn::kernel::TransposeConvLayer>(); + + fn->configure(ifm_alloc->buffer(), ifm_backend_shape, ker_alloc->buffer(), ker_backend_shape, + padding_type, padding.left, padding.right, padding.top, padding.bottom, + stride.horizontal, stride.vertical, ofm_alloc->buffer(), ofm_backend_shape); + + _execution_builder->append(std::move(fn)); +} + +} // namespace srcn +} // namespace backend +} // namespace neurun |