From c577f2c6a3b4ddb6ba87a882723c53a248afbeba Mon Sep 17 00:00:00 2001 From: telsoa01 Date: Fri, 31 Aug 2018 09:22:23 +0100 Subject: Release 18.08 --- src/armnn/optimizations/ConvertConstants.hpp | 98 ++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 src/armnn/optimizations/ConvertConstants.hpp (limited to 'src/armnn/optimizations/ConvertConstants.hpp') diff --git a/src/armnn/optimizations/ConvertConstants.hpp b/src/armnn/optimizations/ConvertConstants.hpp new file mode 100644 index 0000000000..d2dd650665 --- /dev/null +++ b/src/armnn/optimizations/ConvertConstants.hpp @@ -0,0 +1,98 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// See LICENSE file in the project root for full license information. +// + +#pragma once + +#include "Optimization.hpp" +#include "backends/CpuTensorHandle.hpp" +#include "Half.hpp" +#include "FloatingPointConverter.hpp" + +namespace armnn +{ +namespace optimizations +{ + +struct Float16ToFloat32 +{ + static void Func(std::unique_ptr& handle) + { + const TensorInfo& info = handle->GetTensorInfo(); + + if (info.GetDataType() == DataType::Float16) + { + std::vector newValues(info.GetNumElements()); + + armnnUtils::FloatingPointConverter::ConvertFloat16To32(handle->GetTensor(), + info.GetNumElements(), + newValues.data()); + + TensorInfo newInfo(info.GetShape(), DataType::Float32); + ConstTensor newInput(newInfo, newValues); + handle.reset(new ScopedCpuTensorHandle(newInput)); + } + } +}; + +struct Float32ToFloat16 +{ + static void Func(std::unique_ptr& handle) + { + const TensorInfo& info = handle->GetTensorInfo(); + + if (info.GetDataType() == DataType::Float32) + { + std::vector newValues(info.GetNumElements()); + + armnnUtils::FloatingPointConverter::ConvertFloat32To16(handle->GetTensor(), + info.GetNumElements(), + newValues.data()); + + TensorInfo newInfo(info.GetShape(), DataType::Float16); + ConstTensor newInput(newInfo, newValues); + handle.reset(new ScopedCpuTensorHandle(newInput)); + } + } +}; + +template +class ConvertConstants : public Optimization +{ +public: + ConvertConstants() = default; + ConvertConstants(const ConvertConstants&) = default; + virtual ~ConvertConstants() = default; + + void Run(Graph& graph, Layer& layer) const override + { + if (Predicate::Test(layer)) + { + layer.OperateOnConstantTensors(Converter::Func); + } + } +protected: +}; + +struct IsFloat32Layer +{ + static bool Test(const Layer& layer) + { + return layer.GetDataType() == DataType::Float32; + } +}; + +struct IsFloat16Layer +{ + static bool Test(const Layer& layer) + { + return layer.GetDataType() == DataType::Float16; + } +}; + +using ConvertConstantsHalfToFloat = ConvertConstants; +using ConvertConstantsFloatToHalf = ConvertConstants; + +} //namespace optimizations +} //namespace armnn -- cgit v1.2.1