diff options
Diffstat (limited to 'runtime/neurun/backend/cpu/kernel/PermuteLayer.h')
-rw-r--r-- | runtime/neurun/backend/cpu/kernel/PermuteLayer.h | 209 |
1 files changed, 0 insertions, 209 deletions
diff --git a/runtime/neurun/backend/cpu/kernel/PermuteLayer.h b/runtime/neurun/backend/cpu/kernel/PermuteLayer.h deleted file mode 100644 index 1f9110807..000000000 --- a/runtime/neurun/backend/cpu/kernel/PermuteLayer.h +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (c) 2018 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. - */ - -#ifndef __NEURUN_BACKEND_CPU_KERNEL_PERMUTE_LAYER_H__ -#define __NEURUN_BACKEND_CPU_KERNEL_PERMUTE_LAYER_H__ - -#include <exec/IFunction.h> - -#include "util/feature/nhwc/View.h" -#include "OperationUtils.h" -#include "ir/operation/Permute.h" -#include "util/feature/nhwc/Reader.h" -#include "util/feature/nchw/View.h" -#include "util/Coordinates.h" - -#include <misc/feature/IndexIterator.h> -namespace neurun -{ -namespace backend -{ -namespace cpu -{ -namespace kernel -{ - -class PermuteLayer : public ::neurun::exec::IFunction -{ -public: - PermuteLayer() = default; - -public: - void configure(std::shared_ptr<backend::operand::ITensor> input, - std::shared_ptr<backend::operand::ITensor> output, const ir::Shape &output_shape, - ir::operation::Permute::Type type, ir::DataType dataType); - void run(); - void runSync() - { - // this abstract method is used just for profiling and called for - // backend::acl_common::AclFunction - run(); - } - -private: - template <class T> void runTempl() - { - auto rank = _output_shape.rank(); - auto fn = [&](::neurun::backend::operand::ITensor &in_tensor) { - _output->access([&](::neurun::backend::operand::ITensor &out_tensor) { - auto input_buffer = in_tensor.buffer(); - auto input_size = in_tensor.total_size(); - auto output_buffer = out_tensor.buffer(); - if (_type == ir::operation::Permute::Type::COPY) - { - assert(in_tensor.layout() == out_tensor.layout()); - if (!in_tensor.has_padding() && !out_tensor.has_padding()) - { - assert(input_size == out_tensor.total_size()); - memcpy(output_buffer, input_buffer, input_size); - return; - } - } - switch (rank) - { - case 0: - case 1: - { - const int32_t copy_len = _output_shape.dim(0); - - memcpy(output_buffer, input_buffer, copy_len); - break; - } - case 2: - { - const int32_t copy_len = _output_shape.dim(1); - - for (auto i = 0; i < _output_shape.dim(0); ++i) - { - neurun::util::Coordinates coords{i, 0}; - memcpy(output_buffer + out_tensor.calcOffset(coords), - input_buffer + in_tensor.calcOffset(coords), copy_len * sizeof(T)); - } - break; - } - case 3: - { - const int32_t copy_len = _output_shape.dim(2); - - for (auto i = 0; i < _output_shape.dim(0); ++i) - { - for (auto j = 0; j < _output_shape.dim(1); ++j) - { - neurun::util::Coordinates coords{i, j, 0}; - memcpy(output_buffer + out_tensor.calcOffset(coords), - input_buffer + in_tensor.calcOffset(coords), copy_len * sizeof(T)); - } - } - break; - } - case 4: - { - // TODO Unify permute type and remove switch case - switch (_type) - { - case ir::operation::Permute::Type::NHWC_TO_NCHW: - { - for (auto n = 0; n < _output_shape.dim(0); ++n) - { - for (auto c = 0; c < _output_shape.dim(1); ++c) - { - for (auto h = 0; h < _output_shape.dim(2); ++h) - { - for (auto w = 0; w < _output_shape.dim(3); ++w) - { - const neurun::util::Coordinates in_coords{n, h, w, c}; - const auto out_coords = - convertCoordinates(in_coords, in_tensor.layout(), out_tensor.layout()); - const auto value = - *reinterpret_cast<T *>(input_buffer + in_tensor.calcOffset(in_coords)); - *reinterpret_cast<T *>(output_buffer + out_tensor.calcOffset(out_coords)) = - value; - } - } - } - } - break; - } - case ir::operation::Permute::Type::NCHW_TO_NHWC: - { - for (auto n = 0; n < _output_shape.dim(0); ++n) - { - for (auto h = 0; h < _output_shape.dim(1); ++h) - { - for (auto w = 0; w < _output_shape.dim(2); ++w) - { - for (auto c = 0; c < _output_shape.dim(3); ++c) - { - const neurun::util::Coordinates in_coords{n, c, h, w}; - const auto out_coords = - convertCoordinates(in_coords, in_tensor.layout(), out_tensor.layout()); - const auto value = - *reinterpret_cast<T *>(input_buffer + in_tensor.calcOffset(in_coords)); - *reinterpret_cast<T *>(output_buffer + out_tensor.calcOffset(out_coords)) = - value; - } - } - } - } - break; - } - case ir::operation::Permute::Type::COPY: - { - const int32_t copy_len = _output_shape.dim(3); - - for (auto i = 0; i < _output_shape.dim(0); ++i) - { - for (auto j = 0; j < _output_shape.dim(1); ++j) - { - for (auto k = 0; k < _output_shape.dim(2); ++k) - { - neurun::util::Coordinates coords{i, j, k, 0}; - memcpy(output_buffer + out_tensor.calcOffset(coords), - input_buffer + in_tensor.calcOffset(coords), copy_len * sizeof(T)); - } - } - } - break; - } - default: - throw std::runtime_error("NYI"); - break; - } - break; - } - default: - throw std::runtime_error("NYI"); - break; - } - }); - }; - _input->access(fn); - } - -private: - std::shared_ptr<backend::operand::ITensor> _input{nullptr}; - std::shared_ptr<backend::operand::ITensor> _output{nullptr}; - ir::Shape _output_shape{}; - ir::operation::Permute::Type _type{ir::operation::Permute::Type::COPY}; - ir::DataType _dataType{ir::DataType::FLOAT32}; -}; - -} // namespace kernel -} // namespace cpu -} // namespace backend -} // namespace neurun - -#endif // __NEURUN_BACKEND_CPU_KERNEL_PERMUTE_LAYER_H__ |