aboutsummaryrefslogtreecommitdiff
path: root/src/backends/tosaCommon
diff options
context:
space:
mode:
authorMatthew Sloyan <matthew.sloyan@arm.com>2022-10-28 18:02:17 +0100
committerMatthew Sloyan <matthew.sloyan@arm.com>2022-11-02 15:08:37 +0000
commit164bf4f29f6f1b2a3e6714ef4f5a21fc0fd16c2b (patch)
treee7296130a787578e1be4d3a93de46a9c466944b4 /src/backends/tosaCommon
parent2e950f4fa774ac995230addea898f3b11bf146cc (diff)
downloadarmnn-164bf4f29f6f1b2a3e6714ef4f5a21fc0fd16c2b.tar.gz
IVGCVSW-7164 Implement TosaRefBackend::OptimizeSubgraphView
* Added TosaRefBackend::OptimizeSubgraphView implementation. * Generalised TosaRefLayerSupport::IsLayerSupported to work with any operator. * Changed TosaCommon.hpp utils to inline functions. * Added source files for TosaMappings.hpp and AdditionOperator.hpp. * Fixed multiple defines issue with HALF_ROUND_STYLE and HALF_ROUND_TIES_TO_EVEN. Signed-off-by: Matthew Sloyan <matthew.sloyan@arm.com> Change-Id: Ib2576ec3fb97faa3a2256b2fb93ec16ac8745760
Diffstat (limited to 'src/backends/tosaCommon')
-rw-r--r--src/backends/tosaCommon/CMakeLists.txt1
-rw-r--r--src/backends/tosaCommon/TosaMappings.cpp66
-rw-r--r--src/backends/tosaCommon/TosaMappings.hpp54
-rw-r--r--src/backends/tosaCommon/operatorMappings/AdditionOperator.cpp44
-rw-r--r--src/backends/tosaCommon/operatorMappings/AdditionOperator.hpp36
-rw-r--r--src/backends/tosaCommon/operatorMappings/CMakeLists.txt1
-rw-r--r--src/backends/tosaCommon/operatorMappings/TosaOperatorUtils.hpp6
7 files changed, 119 insertions, 89 deletions
diff --git a/src/backends/tosaCommon/CMakeLists.txt b/src/backends/tosaCommon/CMakeLists.txt
index 83737d3bd3..1b1cc55eab 100644
--- a/src/backends/tosaCommon/CMakeLists.txt
+++ b/src/backends/tosaCommon/CMakeLists.txt
@@ -9,6 +9,7 @@ include_directories(SYSTEM ${TOSA_SERIALIZATION_LIB_INCLUDE})
list(APPEND armnnTosaBackend_sources
TosaMappings.hpp
+ TosaMappings.cpp
TosaLayerSupportRules.hpp
)
diff --git a/src/backends/tosaCommon/TosaMappings.cpp b/src/backends/tosaCommon/TosaMappings.cpp
new file mode 100644
index 0000000000..3c14bfd1f9
--- /dev/null
+++ b/src/backends/tosaCommon/TosaMappings.cpp
@@ -0,0 +1,66 @@
+//
+// Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "TosaMappings.hpp"
+
+using namespace armnn;
+using namespace tosa;
+
+void SetBasicBlockConstantTensorData(Layer* layer, TosaSerializationBasicBlock* /*basicBlock*/)
+{
+ switch (layer->GetType())
+ {
+ case LayerType::Convolution2d:
+ {
+ // ToDo: using Convolution2d as an example as it has constant tensors for weights and bias.
+ // ToDo: manually set TosaOperator data of basicBlock where constant tensors exist.
+ }
+ default:
+ // If no switch statement for layer, no constant tensors exist in that layer, return
+ return;
+ }
+}
+
+TosaSerializationBasicBlock* GetTosaMapping(const LayerType type,
+ const std::vector<const TensorInfo*>& inputs,
+ const std::vector<const TensorInfo*>& outputs,
+ const BaseDescriptor& /*descriptor*/)
+{
+ switch (type)
+ {
+ case LayerType::Addition:
+ {
+ return ConvertAdditionToTosaOperator(inputs, outputs);
+ }
+ default:
+ {
+ // empty basic block when no tosa mapping implemented/exists
+ TosaSerializationOperator* op = new TosaSerializationOperator(Op_UNKNOWN, Attribute_NONE, nullptr, {}, {});
+ return new TosaSerializationBasicBlock("", {op}, {}, {}, {});
+ }
+ }
+}
+
+TosaSerializationBasicBlock* GetTosaMappingFromLayer(Layer* layer)
+{
+ std::vector<const TensorInfo*> inputs;
+ for (auto inputSlot : layer->GetInputSlots())
+ {
+ inputs.push_back(&inputSlot.GetConnection()->GetTensorInfo());
+ }
+
+ std::vector<const TensorInfo*> outputs;
+ for (auto& outputSlot : layer->GetOutputSlots())
+ {
+ outputs.push_back(&outputSlot.GetTensorInfo());
+ }
+
+ TosaSerializationBasicBlock* basicBlock = GetTosaMapping(layer->GetType(),
+ inputs,
+ outputs,
+ layer->GetParameters());
+ SetBasicBlockConstantTensorData(layer, basicBlock);
+ return basicBlock;
+}
diff --git a/src/backends/tosaCommon/TosaMappings.hpp b/src/backends/tosaCommon/TosaMappings.hpp
index 5728ff3203..c721bcaf59 100644
--- a/src/backends/tosaCommon/TosaMappings.hpp
+++ b/src/backends/tosaCommon/TosaMappings.hpp
@@ -15,20 +15,7 @@ using namespace tosa;
// From the input armnn::Layer, set the corresponding data field in the
// tosa::TosaSerializationTensor where constant tensor data exists in the armnn::Layer.
-void SetBasicBlockConstantTensorData(Layer* layer, TosaSerializationBasicBlock* /*basicBlock*/)
-{
- switch (layer->GetType())
- {
- case LayerType::Convolution2d:
- {
- // ToDo: using Convolution2d as an example as it has constant tensors for weights and bias.
- // ToDo: manually set TosaOperator data of basicBlock where constant tensors exist.
- }
- default:
- // If no switch statement for layer, no constant tensors exist in that layer, return
- return;
- }
-}
+void SetBasicBlockConstantTensorData(Layer* layer, TosaSerializationBasicBlock* /*basicBlock*/);
// Populates a tosa::TosaSerializationBasicBlock from constructing
// tosa::TosaSerializationOperator(s) and tosa::TosaSerializationTensor(s)
@@ -39,43 +26,8 @@ void SetBasicBlockConstantTensorData(Layer* layer, TosaSerializationBasicBlock*
TosaSerializationBasicBlock* GetTosaMapping(const LayerType type,
const std::vector<const TensorInfo*>& inputs,
const std::vector<const TensorInfo*>& outputs,
- const BaseDescriptor& /*descriptor*/)
-{
- switch (type)
- {
- case LayerType::Addition:
- {
- return ConvertAdditionToTosaOperator(inputs, outputs);
- }
- default:
- {
- // empty basic block when no tosa mapping implemented/exists
- TosaSerializationOperator* op = new TosaSerializationOperator(Op_UNKNOWN, Attribute_NONE, nullptr, {}, {});
- return new TosaSerializationBasicBlock("", {op}, {}, {}, {});
- }
- }
-}
+ const BaseDescriptor& /*descriptor*/);
// Function called in armnn::OptimizeSubgraphView() when access to armnn::Layer is available
// and there is an option to set tosa basic block data from constant layer tenors available from the input layer.
-TosaSerializationBasicBlock* GetTosaMappingFromLayer(Layer* layer)
-{
- std::vector<const TensorInfo*> inputs;
- for (auto inputSlot : layer->GetInputSlots())
- {
- inputs.push_back(&inputSlot.GetConnection()->GetTensorInfo());
- }
-
- std::vector<const TensorInfo*> outputs;
- for (auto& outputSlot : layer->GetOutputSlots())
- {
- outputs.push_back(&outputSlot.GetTensorInfo());
- }
-
- TosaSerializationBasicBlock* basicBlock = GetTosaMapping(layer->GetType(),
- inputs,
- outputs,
- layer->GetParameters());
- SetBasicBlockConstantTensorData(layer, basicBlock);
- return basicBlock;
-}
+TosaSerializationBasicBlock* GetTosaMappingFromLayer(Layer* layer);
diff --git a/src/backends/tosaCommon/operatorMappings/AdditionOperator.cpp b/src/backends/tosaCommon/operatorMappings/AdditionOperator.cpp
new file mode 100644
index 0000000000..98ea03ac3c
--- /dev/null
+++ b/src/backends/tosaCommon/operatorMappings/AdditionOperator.cpp
@@ -0,0 +1,44 @@
+//
+// Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "AdditionOperator.hpp"
+
+TosaSerializationBasicBlock* ConvertAdditionToTosaOperator(const std::vector<const TensorInfo*>& inputs,
+ const std::vector<const TensorInfo*>& outputs)
+{
+ // A helper function with static global variables ensures uniqueness
+ // for dynamically generating input, output and block names
+ std::string input0Name = std::string("Op_ADD_input0_") + GetUniqueTosaMappingID();
+ std::string input1Name = std::string("Op_ADD_input1_") + GetUniqueTosaMappingID();
+ std::string outputName = std::string("Op_ADD_output0_") + GetUniqueTosaMappingID();
+ std::string blockName = std::string("Op_ADD_block_") + GetUniqueTosaMappingID();
+
+ TosaSerializationOperator* op = new TosaSerializationOperator(Op_ADD,
+ Attribute_NONE,
+ nullptr,
+ {input0Name, input1Name},
+ {outputName});
+
+ std::vector<int32_t> inputShape0 = GetTosaTensorShape(inputs[0]->GetShape());
+ DType inputDType0 = ArmNNToDType(inputs[0]->GetDataType());
+
+ std::vector<int32_t> inputShape1 = GetTosaTensorShape(inputs[1]->GetShape());
+ DType inputDType1 = ArmNNToDType(inputs[1]->GetDataType());
+
+ std::vector<int32_t> outputShape0 = GetTosaTensorShape(outputs[0]->GetShape());
+ DType outputDType0 = ArmNNToDType(outputs[0]->GetDataType());
+
+ TosaSerializationTensor* inputTensor0 = new TosaSerializationTensor(input0Name, inputShape0, inputDType0, {});
+ TosaSerializationTensor* inputTensor1 = new TosaSerializationTensor(input1Name, inputShape1, inputDType1, {});
+ TosaSerializationTensor* outputTensor0 = new TosaSerializationTensor(outputName, outputShape0, outputDType0, {});
+
+ // operatorInputNames/operatorOutputNames ends up being the same as
+ // blockInputNames/blockOutputNames for one-to-one ArmNN to Tosa mappings
+ return new TosaSerializationBasicBlock(blockName, // name
+ {op}, // operators
+ {inputTensor0, inputTensor1, outputTensor0}, // tensors
+ {input0Name, input1Name}, // inputs
+ {outputName}); // outputs
+} \ No newline at end of file
diff --git a/src/backends/tosaCommon/operatorMappings/AdditionOperator.hpp b/src/backends/tosaCommon/operatorMappings/AdditionOperator.hpp
index 98c01e2cb8..2a9c479d8e 100644
--- a/src/backends/tosaCommon/operatorMappings/AdditionOperator.hpp
+++ b/src/backends/tosaCommon/operatorMappings/AdditionOperator.hpp
@@ -14,39 +14,5 @@ using namespace armnn;
using namespace tosa;
TosaSerializationBasicBlock* ConvertAdditionToTosaOperator(const std::vector<const TensorInfo*>& inputs,
- const std::vector<const TensorInfo*>& outputs)
-{
- // A helper function with static global variables ensures uniqueness
- // for dynamically generating input, output and block names
- std::string input0Name = std::string("Op_ADD_input0_") + GetUniqueTosaMappingID();
- std::string input1Name = std::string("Op_ADD_input1_") + GetUniqueTosaMappingID();
- std::string outputName = std::string("Op_ADD_output0_") + GetUniqueTosaMappingID();
- std::string blockName = std::string("Op_ADD_block_") + GetUniqueTosaMappingID();
+ const std::vector<const TensorInfo*>& outputs);
- TosaSerializationOperator* op = new TosaSerializationOperator(Op_ADD,
- Attribute_NONE,
- nullptr,
- {input0Name, input1Name},
- {outputName});
-
- std::vector<int32_t> inputShape0 = GetTosaTensorShape(inputs[0]->GetShape());
- DType inputDType0 = ArmNNToDType(inputs[0]->GetDataType());
-
- std::vector<int32_t> inputShape1 = GetTosaTensorShape(inputs[1]->GetShape());
- DType inputDType1 = ArmNNToDType(inputs[1]->GetDataType());
-
- std::vector<int32_t> outputShape0 = GetTosaTensorShape(outputs[0]->GetShape());
- DType outputDType0 = ArmNNToDType(outputs[0]->GetDataType());
-
- TosaSerializationTensor* inputTensor0 = new TosaSerializationTensor(input0Name, inputShape0, inputDType0, {});
- TosaSerializationTensor* inputTensor1 = new TosaSerializationTensor(input1Name, inputShape1, inputDType1, {});
- TosaSerializationTensor* outputTensor0 = new TosaSerializationTensor(outputName, outputShape0, outputDType0, {});
-
- // operatorInputNames/operatorOutputNames ends up being the same as
- // blockInputNames/blockOutputNames for one-to-one ArmNN to Tosa mappings
- return new TosaSerializationBasicBlock(blockName, // name
- {op}, // operators
- {inputTensor0, inputTensor1, outputTensor0}, // tensors
- {input0Name, input1Name}, // inputs
- {outputName}); // outputs
-}
diff --git a/src/backends/tosaCommon/operatorMappings/CMakeLists.txt b/src/backends/tosaCommon/operatorMappings/CMakeLists.txt
index 3965a6ab04..9fc33e9205 100644
--- a/src/backends/tosaCommon/operatorMappings/CMakeLists.txt
+++ b/src/backends/tosaCommon/operatorMappings/CMakeLists.txt
@@ -5,6 +5,7 @@
list(APPEND armnnTosaBackendOperators_sources
AdditionOperator.hpp
+ AdditionOperator.cpp
TosaOperatorUtils.hpp
)
diff --git a/src/backends/tosaCommon/operatorMappings/TosaOperatorUtils.hpp b/src/backends/tosaCommon/operatorMappings/TosaOperatorUtils.hpp
index e11f293b12..f580a53ebc 100644
--- a/src/backends/tosaCommon/operatorMappings/TosaOperatorUtils.hpp
+++ b/src/backends/tosaCommon/operatorMappings/TosaOperatorUtils.hpp
@@ -14,7 +14,7 @@ using namespace armnn;
using namespace tosa;
// Function to return Tosa datatype from input ArmNN datatype.
-DType ArmNNToDType(const DataType& type)
+inline DType ArmNNToDType(const DataType& type)
{
switch (type)
{
@@ -43,7 +43,7 @@ DType ArmNNToDType(const DataType& type)
}
// Function to return Tosa tensor shape from input ArmNN tensor shape.
-std::vector<int32_t> GetTosaTensorShape(const TensorShape& shape)
+inline std::vector<int32_t> GetTosaTensorShape(const TensorShape& shape)
{
std::vector<int32_t> returnShape;
for (u_int32_t i = 0; i < shape.GetNumDimensions(); i++)
@@ -55,7 +55,7 @@ std::vector<int32_t> GetTosaTensorShape(const TensorShape& shape)
// Function to return unique int as a string to ensure uniqueness between all input, output and block names.
static int uniqueTosaMappingID = 0;
-std::string GetUniqueTosaMappingID()
+inline std::string GetUniqueTosaMappingID()
{
return std::to_string(++uniqueTosaMappingID);
}