diff options
Diffstat (limited to '1.2/HalPolicy.cpp')
-rw-r--r-- | 1.2/HalPolicy.cpp | 145 |
1 files changed, 98 insertions, 47 deletions
diff --git a/1.2/HalPolicy.cpp b/1.2/HalPolicy.cpp index e96c4cb0..9c44003f 100644 --- a/1.2/HalPolicy.cpp +++ b/1.2/HalPolicy.cpp @@ -1,9 +1,10 @@ // -// Copyright © 2017 Arm Ltd. All rights reserved. +// Copyright © 2019-2023 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #include "HalPolicy.hpp" +#include "DriverOptions.hpp" namespace armnn_driver { @@ -17,6 +18,33 @@ namespace } // anonymous namespace +HalPolicy::DeviceType HalPolicy::GetDeviceTypeFromOptions(const DriverOptions& options) +{ + // Query backends list from the options + auto backends = options.GetBackends(); + // Return first backend + if(backends.size()>0) + { + const auto &first_backend = backends[0]; + if(first_backend.IsCpuAcc()||first_backend.IsCpuRef()) + { + return V1_2::DeviceType::CPU; + } + else if(first_backend.IsGpuAcc()) + { + return V1_2::DeviceType::GPU; + } + else + { + return V1_2::DeviceType::ACCELERATOR; + } + } + else + { + return V1_2::DeviceType::CPU; + } +} + bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, ConversionData& data) { switch (operation.type) @@ -24,7 +52,7 @@ bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, case V1_2::OperationType::ABS: return ConvertElementwiseUnary(operation, model, data, UnaryOperation::Abs); case V1_2::OperationType::ADD: - return ConvertAdd(operation, model, data); + return ConvertElementwiseBinary(operation, model, data, BinaryOperation::Add); case V1_2::OperationType::ARGMAX: return ConvertArgMinMax(operation, model, data, ArgMinMaxFunction::Max); case V1_2::OperationType::ARGMIN: @@ -33,6 +61,10 @@ bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, return ConvertAveragePool2d(operation, model, data); case V1_2::OperationType::BATCH_TO_SPACE_ND: return ConvertBatchToSpaceNd(operation, model, data); + case V1_2::OperationType::CAST: + return ConvertCast(operation, model, data); + case V1_2::OperationType::CHANNEL_SHUFFLE: + return ConvertChannelShuffle(operation, model, data); case V1_2::OperationType::CONCATENATION: return ConvertConcatenation(operation, model, data); case V1_2::OperationType::CONV_2D: @@ -44,7 +76,7 @@ bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, case V1_2::OperationType::DEQUANTIZE: return ConvertDequantize(operation, model, data); case V1_2::OperationType::DIV: - return ConvertDiv(operation, model, data); + return ConvertElementwiseBinary(operation, model, data, BinaryOperation::Div); case V1_2::OperationType::EQUAL: return ConvertComparison(operation, model, data, ComparisonOperation::Equal); case V1_2::OperationType::EXP: @@ -75,6 +107,8 @@ bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, return ConvertComparison(operation, model, data, ComparisonOperation::LessOrEqual); case V1_2::OperationType::LOCAL_RESPONSE_NORMALIZATION: return ConvertLocalResponseNormalization(operation, model, data); + case V1_2::OperationType::LOG: + return ConvertElementwiseUnary(operation, model, data, UnaryOperation::Log); case V1_2::OperationType::LOGISTIC: return ConvertLogistic(operation, model, data); case V1_2::OperationType::LOG_SOFTMAX: @@ -84,13 +118,13 @@ bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, case V1_2::OperationType::MAX_POOL_2D: return ConvertMaxPool2d(operation, model, data); case V1_2::OperationType::MAXIMUM: - return ConvertMaximum(operation, model, data); + return ConvertElementwiseBinary(operation, model, data, BinaryOperation::Maximum); case V1_2::OperationType::MEAN: return ConvertMean(operation, model, data); case V1_2::OperationType::MINIMUM: - return ConvertMinimum(operation, model, data); + return ConvertElementwiseBinary(operation, model, data, BinaryOperation::Minimum); case V1_2::OperationType::MUL: - return ConvertMul(operation, model, data); + return ConvertElementwiseBinary(operation, model, data, BinaryOperation::Mul); case V1_2::OperationType::NEG: return ConvertElementwiseUnary(operation, model, data, UnaryOperation::Neg); case V1_2::OperationType::NOT_EQUAL: @@ -99,6 +133,10 @@ bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, return ConvertPad(operation, model, data); case V1_2::OperationType::PAD_V2: return ConvertPadV2(operation, model, data); +// There's a problem with the combination of Hal 1.2, Android Q and the POW operator. The problem does not happen +// with Hal 1.3. +// case V1_2::OperationType::POW: +// return ConvertElementwiseBinary(operation, model, data, BinaryOperation::Power); case V1_2::OperationType::PRELU: return ConvertPrelu(operation, model, data); case V1_2::OperationType::QUANTIZE: @@ -109,6 +147,8 @@ bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, return ConvertReduce(operation, model, data, ReduceOperation::Max); case V1_2::OperationType::REDUCE_MIN: return ConvertReduce(operation, model, data, ReduceOperation::Min); + case V1_2::OperationType::REDUCE_PROD: + return ConvertReduce(operation, model, data, ReduceOperation::Prod); case V1_2::OperationType::REDUCE_SUM: return ConvertReduce(operation, model, data, ReduceOperation::Sum); case V1_2::OperationType::RELU: @@ -125,38 +165,40 @@ bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, return ConvertResize(operation, model, data, ResizeMethod::NearestNeighbor); case V1_2::OperationType::RSQRT: return ConvertElementwiseUnary(operation, model, data, UnaryOperation::Rsqrt); + case V1_2::OperationType::SIN: + return ConvertElementwiseUnary(operation, model, data, UnaryOperation::Sin); + case V1_2::OperationType::SOFTMAX: + return ConvertSoftmax(operation, model, data); + case V1_2::OperationType::SPACE_TO_BATCH_ND : + return ConvertSpaceToBatchNd(operation, model, data); + case V1_2::OperationType::SPACE_TO_DEPTH: + return ConvertSpaceToDepth(operation, model, data); + case V1_2::OperationType::SPLIT: + return ConvertSplit(operation, model, data); case V1_2::OperationType::SQRT: return ConvertSqrt(operation, model, data); case V1_2::OperationType::SQUEEZE: return ConvertSqueeze(operation, model, data); case V1_2::OperationType::STRIDED_SLICE: return ConvertStridedSlice(operation, model, data); + case V1_2::OperationType::SUB: + return ConvertElementwiseBinary(operation, model, data, BinaryOperation::Sub); case V1_2::OperationType::TRANSPOSE: return ConvertTranspose(operation, model, data); case V1_2::OperationType::TRANSPOSE_CONV_2D: return ConvertTransposeConv2d(operation, model, data); - case V1_2::OperationType::SOFTMAX: - return ConvertSoftmax(operation, model, data); - case V1_2::OperationType::SPACE_TO_BATCH_ND : - return ConvertSpaceToBatchNd(operation, model, data); - case V1_2::OperationType::SPACE_TO_DEPTH: - return ConvertSpaceToDepth(operation, model, data); - case V1_2::OperationType::SUB: - return ConvertSub(operation, model, data); case V1_2::OperationType::TANH: return ConvertTanH(operation, model, data); + case V1_2::OperationType::TILE: + return ConvertTile(operation, model, data); + case V1_2::OperationType::UNIDIRECTIONAL_SEQUENCE_LSTM: + return ConvertUnidirectionalSequenceLstm(operation, model, data); default: return Fail("%s: Operation type %s not supported in ArmnnDriver", __func__, toString(operation.type).c_str()); } } -bool HalPolicy::ConvertAdd(const Operation& operation, const Model& model, ConversionData& data) -{ - ALOGV("hal_1_2::HalPolicy::ConvertAdd()"); - return ::ConvertAdd<hal_1_2::HalPolicy>(operation, model, data); -} - bool HalPolicy::ConvertArgMinMax(const V1_2::Operation& operation, const V1_2::Model& model, ConversionData& data, @@ -178,6 +220,18 @@ bool HalPolicy::ConvertBatchToSpaceNd(const Operation& operation, const Model& m return ::ConvertBatchToSpaceNd<hal_1_2::HalPolicy>(operation, model, data); } +bool HalPolicy::ConvertCast(const Operation& operation, const Model& model, ConversionData& data) +{ + ALOGV("hal_1_2::HalPolicy::ConvertCast()"); + return ::ConvertCast<hal_1_2::HalPolicy>(operation, model, data); +} + +bool HalPolicy::ConvertChannelShuffle(const Operation& operation, const Model& model, ConversionData& data) +{ + ALOGV("hal_1_2::HalPolicy::ConvertChannelShuffle()"); + return ::ConvertChannelShuffle<hal_1_2::HalPolicy>(operation, model, data); +} + bool HalPolicy::ConvertComparison(const Operation& operation, const Model& model, ConversionData& data, @@ -217,10 +271,13 @@ bool HalPolicy::ConvertDequantize(const Operation& operation, const Model& model return ::ConvertDequantize_1_2<hal_1_2::HalPolicy>(operation, model, data); } -bool HalPolicy::ConvertDiv(const Operation& operation, const Model& model, ConversionData& data) +bool HalPolicy::ConvertElementwiseBinary(const Operation& operation, + const Model& model, + ConversionData& data, + BinaryOperation binaryOperation) { - ALOGV("hal_1_2::HalPolicy::ConvertDiv()"); - return ::ConvertDiv<hal_1_2::HalPolicy>(operation, model, data); + ALOGV("hal_1_2::HalPolicy::ConvertElementwiseBinary()"); + return ::ConvertElementwiseBinary<hal_1_2::HalPolicy>(operation, model, data, binaryOperation); } bool HalPolicy::ConvertElementwiseUnary(const Operation& operation, @@ -306,30 +363,12 @@ bool HalPolicy::ConvertMaxPool2d(const Operation& operation, const Model& model, return ConvertPooling2d<hal_1_2::HalPolicy>(operation, __func__, PoolingAlgorithm::Max, model, data); } -bool HalPolicy::ConvertMaximum(const Operation& operation, const Model& model, ConversionData& data) -{ - ALOGV("hal_1_2::HalPolicy::ConvertMaximum()"); - return ::ConvertMaximum<hal_1_2::HalPolicy>(operation, model, data); -} - bool HalPolicy::ConvertMean(const Operation& operation, const Model& model, ConversionData& data) { ALOGV("hal_1_2::HalPolicy::ConvertMean()"); return ::ConvertMean<hal_1_2::HalPolicy>(operation, model, data); } -bool HalPolicy::ConvertMinimum(const Operation& operation, const Model& model, ConversionData& data) -{ - ALOGV("hal_1_2::HalPolicy::ConvertMinimum()"); - return ::ConvertMinimum<hal_1_2::HalPolicy>(operation, model, data); -} - -bool HalPolicy::ConvertMul(const Operation& operation, const Model& model, ConversionData& data) -{ - ALOGV("hal_1_2::HalPolicy::ConvertMul()"); - return ::ConvertMul<hal_1_2::HalPolicy>(operation, model, data); -} - bool HalPolicy::ConvertPad(const Operation& operation, const Model& model, ConversionData& data) { ALOGV("hal_1_2::HalPolicy::ConvertPad()"); @@ -420,12 +459,6 @@ bool HalPolicy::ConvertSoftmax(const Operation& operation, const Model& model, C return ::ConvertSoftmax<hal_1_2::HalPolicy>(operation, model, data); } -bool HalPolicy::ConvertSub(const Operation& operation, const Model& model, ConversionData& data) -{ - ALOGV("hal_1_2::HalPolicy::ConvertSub()"); - return ::ConvertSub<hal_1_2::HalPolicy>(operation, model, data); -} - bool HalPolicy::ConvertTanH(const Operation& operation, const Model& model, ConversionData& data) { ALOGV("hal_1_2::HalPolicy::ConvertTanH()"); @@ -438,6 +471,12 @@ bool HalPolicy::ConvertLstm(const Operation& operation, const Model& model, Conv return ::ConvertLstm<hal_1_2::HalPolicy>(operation, model, data); } +bool HalPolicy::ConvertSplit(const Operation& operation, const Model& model, ConversionData& data) +{ + ALOGV("hal_1_2::HalPolicy::ConvertSplit()"); + return ::ConvertSplit<hal_1_2::HalPolicy>(operation, model, data); +} + bool HalPolicy::ConvertSqrt(const Operation& operation, const Model& model, ConversionData& data) { ALOGV("hal_1_2::HalPolicy::ConvertSqrt()"); @@ -471,5 +510,17 @@ bool HalPolicy::ConvertTransposeConv2d(const Operation& operation, const Model& return ::ConvertTransposeConv2d<hal_1_2::HalPolicy>(operation, model, data); } +bool HalPolicy::ConvertTile(const Operation& operation, const Model& model, ConversionData& data) +{ + ALOGV("hal_1_2::HalPolicy::ConvertTile()"); + return ::ConvertTile<hal_1_2::HalPolicy>(operation, model, data); +} + +bool HalPolicy::ConvertUnidirectionalSequenceLstm(const Operation& operation, const Model& model, ConversionData& data) +{ + ALOGV("hal_1_2::HalPolicy::ConvertUnidirectionalSequenceLstm()"); + return ::ConvertUnidirectionalSequenceLstm<hal_1_2::HalPolicy>(operation, model, data); +} + } // namespace hal_1_2 } // namespace armnn_driver |