blob: 6fdcf6bd2bfcaa06790ed6c934520c6ea17620b5 [file] [log] [blame]
telsoa015307bc12018-03-09 13:51:08 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// See LICENSE file in the project root for full license information.
4//
5
6#pragma once
7
surmeh01deb3bdb2018-07-05 12:06:04 +01008#include "ArmnnDriver.hpp"
9
telsoa01ce3e84a2018-08-31 09:31:35 +010010#include <NeuralNetworks.h>
11#include <ActivationFunctor.h>
12
telsoa015307bc12018-03-09 13:51:08 +000013#include <armnn/ArmNN.hpp>
14#include <armnn/INetwork.hpp>
15#include <CpuExecutor.h>
16
17#include "Utils.hpp"
18
19#include <memory>
20#include <vector>
21#include <set>
22
23namespace armnn_driver
24{
25
26class ConstTensorPin;
27class LayerInputHandle;
28
29enum class ConversionResult
30{
31 Success,
32 ErrorMappingPools,
33 UnsupportedFeature
34};
35
kevmay01bc5f7842018-08-30 12:34:39 +010036struct HalVersion_1_0
37{
38 using Model = ::android::hardware::neuralnetworks::V1_0::Model;
39};
40
41#if defined(ARMNN_ANDROID_NN_V1_1)
42struct HalVersion_1_1
43{
44 using Model = ::android::hardware::neuralnetworks::V1_1::Model;
45};
46#endif
47
telsoa015307bc12018-03-09 13:51:08 +000048// A helper performing the conversion from an AndroidNN driver Model representation,
49// to an armnn::INetwork object
kevmay01bc5f7842018-08-30 12:34:39 +010050template <typename HalVersion>
telsoa015307bc12018-03-09 13:51:08 +000051class ModelToINetworkConverter
52{
53public:
kevmay01bc5f7842018-08-30 12:34:39 +010054 using HalModel = typename HalVersion::Model;
55
telsoa01ce3e84a2018-08-31 09:31:35 +010056 ModelToINetworkConverter(armnn::Compute compute,
kevmay01bc5f7842018-08-30 12:34:39 +010057 const HalModel& model,
telsoa015307bc12018-03-09 13:51:08 +000058 const std::set<unsigned int>& forcedUnsupportedOperations);
59
60 ConversionResult GetConversionResult() const { return m_ConversionResult; }
61
62 // Returns the ArmNN INetwork corresponding to the input model, if preparation went smoothly, nullptr otherwise.
63 armnn::INetwork* GetINetwork() const { return m_Network.get(); }
64
65 bool IsOperationSupported(uint32_t operationIndex) const;
66
67private:
68 void Convert();
69
kevmay01bc5f7842018-08-30 12:34:39 +010070#if defined(ARMNN_ANDROID_NN_V1_1)
71 bool ConvertOperation(const ::android::hardware::neuralnetworks::V1_1::Operation& operation);
72#endif
73
telsoa01ce3e84a2018-08-31 09:31:35 +010074 bool ConvertOperation(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +000075
telsoa01ce3e84a2018-08-31 09:31:35 +010076 bool ConvertAdd(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +000077
telsoa01ce3e84a2018-08-31 09:31:35 +010078 bool ConvertAveragePool2d(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +000079
telsoa01ce3e84a2018-08-31 09:31:35 +010080 bool ConvertConcatenation(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +000081
telsoa01ce3e84a2018-08-31 09:31:35 +010082 bool ConvertConv2d(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +000083
telsoa01ce3e84a2018-08-31 09:31:35 +010084 bool ConvertDepthwiseConv2d(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +000085
telsoa01ce3e84a2018-08-31 09:31:35 +010086 bool ConvertFloor(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +000087
telsoa01ce3e84a2018-08-31 09:31:35 +010088 bool ConvertFullyConnected(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +000089
telsoa01ce3e84a2018-08-31 09:31:35 +010090 bool ConvertLogistic(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +000091
telsoa01ce3e84a2018-08-31 09:31:35 +010092 bool ConvertLocalResponseNormalization(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +000093
telsoa01ce3e84a2018-08-31 09:31:35 +010094 bool ConvertL2Normalization(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +000095
telsoa01ce3e84a2018-08-31 09:31:35 +010096 bool ConvertL2Pool2d(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +000097
telsoa01ce3e84a2018-08-31 09:31:35 +010098 bool ConvertMaxPool2d(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +000099
telsoa01ce3e84a2018-08-31 09:31:35 +0100100 bool ConvertMul(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +0000101
telsoa01ce3e84a2018-08-31 09:31:35 +0100102 bool ConvertReLu(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +0000103
telsoa01ce3e84a2018-08-31 09:31:35 +0100104 bool ConvertReLu1(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +0000105
telsoa01ce3e84a2018-08-31 09:31:35 +0100106 bool ConvertReLu6(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +0000107
telsoa01ce3e84a2018-08-31 09:31:35 +0100108 bool ConvertSoftmax(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +0000109
telsoa01ce3e84a2018-08-31 09:31:35 +0100110 bool ConvertTanH(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +0000111
telsoa01ce3e84a2018-08-31 09:31:35 +0100112 bool ConvertReshape(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +0000113
telsoa01ce3e84a2018-08-31 09:31:35 +0100114 bool ConvertResizeBilinear(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
telsoa015307bc12018-03-09 13:51:08 +0000115
telsoa01ce3e84a2018-08-31 09:31:35 +0100116 bool ConvertLstm(const ::android::hardware::neuralnetworks::V1_0::Operation& operation);
117
118 bool ConvertToActivation(const ::android::hardware::neuralnetworks::V1_0::Operation& operation,
119 const char* operationName,
telsoa015307bc12018-03-09 13:51:08 +0000120 const armnn::ActivationDescriptor& activationDesc);
121
telsoa01ce3e84a2018-08-31 09:31:35 +0100122 bool ConvertPooling2d(const ::android::hardware::neuralnetworks::V1_0::Operation& operation,
123 const char* name, armnn::PoolingAlgorithm poolType);
telsoa015307bc12018-03-09 13:51:08 +0000124
125
126 const void* GetOperandValueReadOnlyAddress(const Operand& operand) const;
127
telsoa01ce3e84a2018-08-31 09:31:35 +0100128 const Operand* GetInputOperand(const ::android::hardware::neuralnetworks::V1_0::Operation& operation,
129 uint32_t inputIndex) const;
telsoa015307bc12018-03-09 13:51:08 +0000130
telsoa01ce3e84a2018-08-31 09:31:35 +0100131 const Operand* GetOutputOperand(const ::android::hardware::neuralnetworks::V1_0::Operation& operation,
132 uint32_t outputIndex) const;
telsoa015307bc12018-03-09 13:51:08 +0000133
kevmay01bc5f7842018-08-30 12:34:39 +0100134 template <typename T>
telsoa01ce3e84a2018-08-31 09:31:35 +0100135 bool GetInputScalar(const ::android::hardware::neuralnetworks::V1_0::Operation& operation, uint32_t inputIndex,
136 OperandType type, T& outValue) const;
telsoa015307bc12018-03-09 13:51:08 +0000137
telsoa01ce3e84a2018-08-31 09:31:35 +0100138 bool GetInputInt32(const ::android::hardware::neuralnetworks::V1_0::Operation& operation, uint32_t inputIndex,
139 int32_t& outValue) const;
telsoa015307bc12018-03-09 13:51:08 +0000140
telsoa01ce3e84a2018-08-31 09:31:35 +0100141 bool GetInputFloat32(const ::android::hardware::neuralnetworks::V1_0::Operation& operation, uint32_t inputIndex,
142 float& outValue) const;
telsoa015307bc12018-03-09 13:51:08 +0000143
telsoa01ce3e84a2018-08-31 09:31:35 +0100144 bool GetInputActivationFunctionImpl(const ::android::hardware::neuralnetworks::V1_0::Operation& operation,
145 uint32_t inputIndex,
146 OperandType type,
147 ActivationFn& outActivationFunction) const;
telsoa015307bc12018-03-09 13:51:08 +0000148
telsoa01ce3e84a2018-08-31 09:31:35 +0100149 bool GetInputActivationFunction(const ::android::hardware::neuralnetworks::V1_0::Operation& operation,
150 uint32_t inputIndex,
151 ActivationFn& outActivationFunction) const;
telsoa015307bc12018-03-09 13:51:08 +0000152
telsoa01ce3e84a2018-08-31 09:31:35 +0100153 bool GetInputActivationFunctionFromTensor(const ::android::hardware::neuralnetworks::V1_0::Operation& operation,
154 uint32_t inputIndex,
155 ActivationFn& outActivationFunction) const;
telsoa015307bc12018-03-09 13:51:08 +0000156
telsoa01ce3e84a2018-08-31 09:31:35 +0100157 bool GetOptionalInputActivation(const ::android::hardware::neuralnetworks::V1_0::Operation& operation,
158 uint32_t inputIndex,
159 ActivationFn& activationFunction) const;
160
161 bool GetInputPaddingScheme(const ::android::hardware::neuralnetworks::V1_0::Operation& operation,
162 uint32_t inputIndex,
163 android::nn::PaddingScheme& outPaddingScheme) const;
164
165 LayerInputHandle ConvertToLayerInputHandle(const ::android::hardware::neuralnetworks::V1_0::Operation& operation,
166 uint32_t inputIndex);
167
168 ConstTensorPin ConvertOperationInputToConstTensorPin(
169 const ::android::hardware::neuralnetworks::V1_0::Operation& operation, uint32_t inputIndex,
170 const armnn::PermutationVector& dimensionMappings = g_DontPermute,
171 const armnn::TensorShape* overrideTensorShape = nullptr, bool optional = false);
telsoa015307bc12018-03-09 13:51:08 +0000172
173 ConstTensorPin ConvertOperandToConstTensorPin(const Operand& operand,
174 const armnn::PermutationVector& dimensionMappings = g_DontPermute,
telsoa01ce3e84a2018-08-31 09:31:35 +0100175 const armnn::TensorShape* overrideTensorShape = nullptr, bool optional = false);
telsoa015307bc12018-03-09 13:51:08 +0000176
177 bool GetTensorInt32Values(const Operand& operand, std::vector<int32_t>& outValues) const;
178
179
180 armnn::IConnectableLayer* ProcessActivation(const armnn::TensorInfo& tensorInfo, ActivationFn activation,
181 armnn::IConnectableLayer* prevLayer);
182
telsoa01ce3e84a2018-08-31 09:31:35 +0100183 bool SetupAndTrackLayerOutputSlot(const ::android::hardware::neuralnetworks::V1_0::Operation& operation,
184 uint32_t operationOutputIndex,
185 armnn::IConnectableLayer& layer,
186 uint32_t layerOutputIndex);
telsoa015307bc12018-03-09 13:51:08 +0000187
telsoa01ce3e84a2018-08-31 09:31:35 +0100188 bool SetupAndTrackLayerOutputSlot(const ::android::hardware::neuralnetworks::V1_0::Operation& operation,
189 uint32_t outputIndex,
telsoa015307bc12018-03-09 13:51:08 +0000190 armnn::IConnectableLayer& layer);
191
192
193 // Input data
kevmay01bc5f7842018-08-30 12:34:39 +0100194 armnn::Compute m_Compute;
195 const HalModel& m_Model;
196 const std::set<unsigned int>& m_ForcedUnsupportedOperations;
telsoa015307bc12018-03-09 13:51:08 +0000197
198 // Output data
telsoa01ce3e84a2018-08-31 09:31:35 +0100199 armnn::INetworkPtr m_Network;
200 ConversionResult m_ConversionResult;
201 std::map<uint32_t, bool> m_OperationSupported;
telsoa015307bc12018-03-09 13:51:08 +0000202
203 // Working/intermediate data
204 std::vector<armnn::IOutputSlot*> m_OutputSlotForOperand;
205 std::vector<android::nn::RunTimePoolInfo> m_MemPools;
206};
207
208} // armnn_driver