aboutsummaryrefslogtreecommitdiff
path: root/src/armnnSerializer
diff options
context:
space:
mode:
Diffstat (limited to 'src/armnnSerializer')
-rw-r--r--src/armnnSerializer/ArmnnSchema.fbs22
-rw-r--r--src/armnnSerializer/Serializer.cpp24
-rw-r--r--src/armnnSerializer/Serializer.hpp6
-rw-r--r--src/armnnSerializer/SerializerUtils.cpp29
-rw-r--r--src/armnnSerializer/SerializerUtils.hpp4
-rw-r--r--src/armnnSerializer/test/SerializerTests.cpp45
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");