diff options
author | Chunseok Lee <chunseok.lee@samsung.com> | 2020-12-14 14:43:43 +0900 |
---|---|---|
committer | Chunseok Lee <chunseok.lee@samsung.com> | 2020-12-14 14:43:43 +0900 |
commit | 62529acabbafce7730601ed01d5709d7bc0d378a (patch) | |
tree | bf6912cfa8fac4a2997292bfcb3c82055734c97e /runtime/onert/backend/ruy/ops/OperationUtils.h | |
parent | 6ea13af5257155ff993c205cf997b870cc627f73 (diff) | |
download | nnfw-62529acabbafce7730601ed01d5709d7bc0d378a.tar.gz nnfw-62529acabbafce7730601ed01d5709d7bc0d378a.tar.bz2 nnfw-62529acabbafce7730601ed01d5709d7bc0d378a.zip |
Imported Upstream version 1.12.0upstream/1.12.0
Diffstat (limited to 'runtime/onert/backend/ruy/ops/OperationUtils.h')
-rw-r--r-- | runtime/onert/backend/ruy/ops/OperationUtils.h | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/runtime/onert/backend/ruy/ops/OperationUtils.h b/runtime/onert/backend/ruy/ops/OperationUtils.h new file mode 100644 index 000000000..5dfdc7ec5 --- /dev/null +++ b/runtime/onert/backend/ruy/ops/OperationUtils.h @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2020 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 __ONERT_BACKEND_RUY_OPS_OPERATION_UTILS_H__ +#define __ONERT_BACKEND_RUY_OPS_OPERATION_UTILS_H__ + +#include <backend/IPortableTensor.h> + +#include <ruy/Shape.h> +#include <ruy/Types.h> +#include <iostream> +#include <ir/DataType.h> +#include <ir/InternalType.h> +#include <ir/Padding.h> + +#include <limits> + +using OperandType = onert::ir::DataType; + +namespace onert +{ +namespace backend +{ +namespace ruy +{ +namespace ops +{ + +inline nnfw::ruy::Shape getTensorShape(const IPortableTensor *tensor) +{ + if (tensor == nullptr) + return nnfw::ruy::Shape(); + + const ir::Shape &shape = tensor->get_info().shape(); + + assert(tensor->layout() == ir::Layout::NHWC); + + auto rank = shape.rank(); + nnfw::ruy::Shape ret(rank); + auto data = ret.DimsData(); + for (int i = 0; i < rank; ++i) + { + data[i] = shape.dim(i); + } + return ret; +} + +inline nnfw::ruy::FusedActivationFunctionType convertActivationType(const ir::Activation activation) +{ + switch (activation) + { + case ir::Activation::NONE: + return nnfw::ruy::FusedActivationFunctionType::kNone; + case ir::Activation::RELU: + return nnfw::ruy::FusedActivationFunctionType::kRelu; + case ir::Activation::RELU1: + return nnfw::ruy::FusedActivationFunctionType::kRelu1; + case ir::Activation::RELU6: + return nnfw::ruy::FusedActivationFunctionType::kRelu6; + case ir::Activation::TANH: + return nnfw::ruy::FusedActivationFunctionType::kTanh; + case ir::Activation::SIGMOID: + return nnfw::ruy::FusedActivationFunctionType::kSigmoid; + default: + throw std::runtime_error{"RUY backend: Cannot convert activation type"}; + } +} + +template <typename T> +void CalculateActivationRange(ir::Activation activation, T *activation_min, T *activation_max) +{ + if (activation == ir::Activation::RELU) + { + *activation_min = 0; + *activation_max = std::numeric_limits<T>::max(); + } + else if (activation == ir::Activation::RELU6) + { + *activation_min = 0; + *activation_max = 6; + } + else if (activation == ir::Activation::RELU1) + { + *activation_min = -1; + *activation_max = 1; + } + else if (activation == ir::Activation::SIGMOID) + { + *activation_min = 0; + *activation_max = 1; + } + else if (activation == ir::Activation::NONE) + { + *activation_min = std::numeric_limits<T>::lowest(); + *activation_max = std::numeric_limits<T>::max(); + } + else + { + std::cout << "Unsupported fused activation function." << std::endl; + } +} + +nnfw::ruy::PaddingType getPaddingType(ir::PaddingType ir_padding_type); + +} // namespace ops +} // namespace ruy +} // namespace backend +} // namespace onert + +#endif // __ONERT_BACKEND_RUY_OPS_OPERATION_UTILS_H__ |