diff options
Diffstat (limited to 'src/armnnSerializer')
-rw-r--r-- | src/armnnSerializer/ArmnnSchema.fbs | 22 | ||||
-rw-r--r-- | src/armnnSerializer/Serializer.cpp | 24 | ||||
-rw-r--r-- | src/armnnSerializer/Serializer.hpp | 6 | ||||
-rw-r--r-- | src/armnnSerializer/SerializerUtils.cpp | 29 | ||||
-rw-r--r-- | src/armnnSerializer/SerializerUtils.hpp | 4 | ||||
-rw-r--r-- | src/armnnSerializer/test/SerializerTests.cpp | 45 |
6 files changed, 121 insertions, 9 deletions
diff --git a/src/armnnSerializer/ArmnnSchema.fbs b/src/armnnSerializer/ArmnnSchema.fbs index 2dbfd85b23..fb3bc018bb 100644 --- a/src/armnnSerializer/ArmnnSchema.fbs +++ b/src/armnnSerializer/ArmnnSchema.fbs @@ -1,5 +1,5 @@ // -// Copyright © 2017 Arm Ltd and Contributors. All rights reserved. +// Copyright © 2017,2019-2023 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // @@ -183,6 +183,7 @@ enum LayerType : uint { Pooling3d = 66, GatherNd = 67, BatchMatMul = 68, + ElementwiseBinary = 69, } // Base layer table to be used as part of other layers @@ -324,6 +325,24 @@ table DivisionLayer { base:LayerBase; } +enum BinaryOperation : byte { + Add = 0, + Div = 1, + Maximum = 2, + Minimum = 3, + Mul = 4, + Sub = 5 +} + +table ElementwiseBinaryDescriptor { + operation:BinaryOperation; +} + +table ElementwiseBinaryLayer { + base:LayerBase; + descriptor:ElementwiseBinaryDescriptor; +} + enum UnaryOperation : byte { Abs = 0, Rsqrt = 1, @@ -1094,6 +1113,7 @@ union Layer { Pooling3dLayer, GatherNdLayer, BatchMatMulLayer, + ElementwiseBinaryLayer, } table AnyLayer { diff --git a/src/armnnSerializer/Serializer.cpp b/src/armnnSerializer/Serializer.cpp index c9a3022b8d..5a095d9887 100644 --- a/src/armnnSerializer/Serializer.cpp +++ b/src/armnnSerializer/Serializer.cpp @@ -1,5 +1,5 @@ // -// Copyright © 2017 Arm Ltd and Contributors. All rights reserved. +// Copyright © 2017,2019-2023 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #include "Serializer.hpp" @@ -533,6 +533,21 @@ void SerializerStrategy::SerializeDivisionLayer(const armnn::IConnectableLayer* CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer); } +void SerializerStrategy::SerializeElementwiseBinaryLayer(const armnn::IConnectableLayer* layer, + const armnn::ElementwiseBinaryDescriptor& descriptor, + const char* name) +{ + IgnoreUnused(name); + + auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseBinary); + auto fbDescriptor = serializer::CreateElementwiseBinaryDescriptor( + m_flatBufferBuilder, + GetFlatBufferBinaryOperation(descriptor.m_Operation)); + + auto fbLayer = serializer::CreateElementwiseBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor); + CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseBinaryLayer); +} + void SerializerStrategy::SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer, const armnn::ElementwiseUnaryDescriptor& descriptor, const char* name) @@ -2119,6 +2134,13 @@ void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer, SerializeDivisionLayer(layer, name); break; } + case armnn::LayerType::ElementwiseBinary : + { + const armnn::ElementwiseBinaryDescriptor& layerDescriptor = + static_cast<const armnn::ElementwiseBinaryDescriptor&>(descriptor); + SerializeElementwiseBinaryLayer(layer, layerDescriptor, name); + break; + } case armnn::LayerType::ElementwiseUnary : { const armnn::ElementwiseUnaryDescriptor& layerDescriptor = diff --git a/src/armnnSerializer/Serializer.hpp b/src/armnnSerializer/Serializer.hpp index 60fed4f6df..4d5e806db1 100644 --- a/src/armnnSerializer/Serializer.hpp +++ b/src/armnnSerializer/Serializer.hpp @@ -1,5 +1,5 @@ // -// Copyright © 2017 Arm Ltd and Contributors. All rights reserved. +// Copyright © 2017,2019-2023 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once @@ -172,6 +172,10 @@ private: void SerializeDivisionLayer(const armnn::IConnectableLayer* layer, const char* name = nullptr); + void SerializeElementwiseBinaryLayer(const armnn::IConnectableLayer* layer, + const armnn::ElementwiseBinaryDescriptor& descriptor, + const char* name = nullptr); + void SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer, const armnn::ElementwiseUnaryDescriptor& descriptor, const char* name = nullptr); diff --git a/src/armnnSerializer/SerializerUtils.cpp b/src/armnnSerializer/SerializerUtils.cpp index 49ce7217dc..703f56ff5c 100644 --- a/src/armnnSerializer/SerializerUtils.cpp +++ b/src/armnnSerializer/SerializerUtils.cpp @@ -1,5 +1,5 @@ // -// Copyright © 2017 Arm Ltd and Contributors. All rights reserved. +// Copyright © 2017,2019-2021,2023 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // @@ -107,9 +107,30 @@ armnnSerializer::DataLayout GetFlatBufferDataLayout(armnn::DataLayout dataLayout } } -armnnSerializer::UnaryOperation GetFlatBufferUnaryOperation(armnn::UnaryOperation comparisonOperation) +armnnSerializer::BinaryOperation GetFlatBufferBinaryOperation(armnn::BinaryOperation binaryOperation) { - switch (comparisonOperation) + switch (binaryOperation) + { + case armnn::BinaryOperation::Add: + return armnnSerializer::BinaryOperation::BinaryOperation_Add; + case armnn::BinaryOperation::Div: + return armnnSerializer::BinaryOperation::BinaryOperation_Div; + case armnn::BinaryOperation::Maximum: + return armnnSerializer::BinaryOperation::BinaryOperation_Maximum; + case armnn::BinaryOperation::Minimum: + return armnnSerializer::BinaryOperation::BinaryOperation_Minimum; + case armnn::BinaryOperation::Mul: + return armnnSerializer::BinaryOperation::BinaryOperation_Mul; + case armnn::BinaryOperation::Sub: + return armnnSerializer::BinaryOperation::BinaryOperation_Sub; + default: + throw armnn::InvalidArgumentException("Elementwise Binary operation unknown"); + } +} + +armnnSerializer::UnaryOperation GetFlatBufferUnaryOperation(armnn::UnaryOperation unaryOperation) +{ + switch (unaryOperation) { case armnn::UnaryOperation::Abs: return armnnSerializer::UnaryOperation::UnaryOperation_Abs; @@ -128,7 +149,7 @@ armnnSerializer::UnaryOperation GetFlatBufferUnaryOperation(armnn::UnaryOperatio case armnn::UnaryOperation::Sin: return armnnSerializer::UnaryOperation::UnaryOperation_Sin; default: - throw armnn::InvalidArgumentException("Unary operation unknown"); + throw armnn::InvalidArgumentException("Elementwise Unary operation unknown"); } } diff --git a/src/armnnSerializer/SerializerUtils.hpp b/src/armnnSerializer/SerializerUtils.hpp index 07cdc2a491..628385eea9 100644 --- a/src/armnnSerializer/SerializerUtils.hpp +++ b/src/armnnSerializer/SerializerUtils.hpp @@ -1,5 +1,5 @@ // -// Copyright © 2017 Arm Ltd. All rights reserved. +// Copyright © 2017,2019-2021,2023 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once @@ -18,6 +18,8 @@ armnnSerializer::DataType GetFlatBufferDataType(armnn::DataType dataType); armnnSerializer::DataLayout GetFlatBufferDataLayout(armnn::DataLayout dataLayout); +armnnSerializer::BinaryOperation GetFlatBufferBinaryOperation(armnn::BinaryOperation binaryOperation); + armnnSerializer::UnaryOperation GetFlatBufferUnaryOperation(armnn::UnaryOperation unaryOperation); armnnSerializer::PoolingAlgorithm GetFlatBufferPoolingAlgorithm(armnn::PoolingAlgorithm poolingAlgorithm); diff --git a/src/armnnSerializer/test/SerializerTests.cpp b/src/armnnSerializer/test/SerializerTests.cpp index 3573a8195c..6ddc971f36 100644 --- a/src/armnnSerializer/test/SerializerTests.cpp +++ b/src/armnnSerializer/test/SerializerTests.cpp @@ -1,5 +1,5 @@ // -// Copyright © 2017 Arm Ltd and Contributors. All rights reserved. +// Copyright © 2017,2020-2023 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // @@ -331,6 +331,7 @@ TEST_CASE("SerializeConstant") case armnn::LayerType::Input: break; case armnn::LayerType::Output: break; case armnn::LayerType::Addition: break; + case armnn::LayerType::ElementwiseBinary: break; default: { this->VerifyNameAndConnections(layer, name); @@ -972,6 +973,47 @@ TEST_CASE("SerializeDeserializeComparisonEqual") deserializedNetwork->ExecuteStrategy(verifier); } +void SerializeElementwiseBinaryTest(armnn::BinaryOperation binaryOperation) +{ + auto layerName = GetBinaryOperationAsCString(binaryOperation); + const armnn::TensorInfo tensorInfo({ 1, 5, 2, 3 }, armnn::DataType::Float32); + armnn::ElementwiseBinaryDescriptor descriptor(binaryOperation); + + armnn::INetworkPtr network = armnn::INetwork::Create(); + armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0); + armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1); + armnn::IConnectableLayer* const elementwiseBinaryLayer = network->AddElementwiseBinaryLayer(descriptor, + layerName); + armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0); + + inputLayer0->GetOutputSlot(0).Connect(elementwiseBinaryLayer->GetInputSlot(0)); + inputLayer1->GetOutputSlot(0).Connect(elementwiseBinaryLayer->GetInputSlot(1)); + elementwiseBinaryLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); + + inputLayer0->GetOutputSlot(0).SetTensorInfo(tensorInfo); + inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo); + elementwiseBinaryLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo); + + std::string serializedNetwork = SerializeNetwork(*network); + armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(serializedNetwork); + CHECK(deserializedNetwork); + + LayerVerifierBaseWithDescriptor<armnn::ElementwiseBinaryDescriptor> + verifier(layerName, { tensorInfo, tensorInfo }, { tensorInfo }, descriptor); + deserializedNetwork->ExecuteStrategy(verifier); +} + +TEST_CASE("SerializeElementwiseBinary") +{ + using op = armnn::BinaryOperation; + std::initializer_list<op> allBinaryOperations = {op::Add, op::Div, op::Maximum, op::Minimum, op::Mul, op::Sub}; + + for (auto binaryOperation : allBinaryOperations) + { + SerializeElementwiseBinaryTest(binaryOperation); + } +} + void SerializeElementwiseUnaryTest(armnn::UnaryOperation unaryOperation) { auto layerName = GetUnaryOperationAsCString(unaryOperation); @@ -2883,6 +2925,7 @@ TEST_CASE("SerializeDeserializeNonLinearNetwork") CompareConstTensor(constants.at(0), m_LayerInput); break; } + case armnn::LayerType::ElementwiseBinary: break; default: { throw armnn::Exception("Unexpected layer type in test model"); |