diff options
author | Matthew Sloyan <matthew.sloyan@arm.com> | 2022-11-25 16:10:00 +0000 |
---|---|---|
committer | Matthew Sloyan <matthew.sloyan@arm.com> | 2022-12-08 12:57:47 +0000 |
commit | c5fe6e71cd39096af7c2523ec2afe96008c51b0c (patch) | |
tree | 1486349bc36e17c1577465aab81d9eb3ca64e861 /src/backends/tosaCommon/operatorMappings/AvgPool2DIgnoreValueOperator.cpp | |
parent | 3106c7f1714aea556d06d9f1e8c7faaeaeca996d (diff) | |
download | armnn-c5fe6e71cd39096af7c2523ec2afe96008c51b0c.tar.gz |
IVGCVSW-7168 Add Conv2d and Constant support to TOSA Reference Backend
* Added TOSA Conv2d and Constant mappings.
* Added unique naming to mappings based on previous and following
layers, so they are connected correctly.
* Updated existing mappings with new naming convention.
* Added all mappings to one main block in OptimizeSubgraphView.
* Removed isMain from mapping functions.
* Added Conv2d EndToEnd test.
Signed-off-by: Matthew Sloyan <matthew.sloyan@arm.com>
Change-Id: I27c3e238407c32379ce25a1f01dad11523ef5d2b
Diffstat (limited to 'src/backends/tosaCommon/operatorMappings/AvgPool2DIgnoreValueOperator.cpp')
-rw-r--r-- | src/backends/tosaCommon/operatorMappings/AvgPool2DIgnoreValueOperator.cpp | 55 |
1 files changed, 29 insertions, 26 deletions
diff --git a/src/backends/tosaCommon/operatorMappings/AvgPool2DIgnoreValueOperator.cpp b/src/backends/tosaCommon/operatorMappings/AvgPool2DIgnoreValueOperator.cpp index b3d2687c30..2601a6243d 100644 --- a/src/backends/tosaCommon/operatorMappings/AvgPool2DIgnoreValueOperator.cpp +++ b/src/backends/tosaCommon/operatorMappings/AvgPool2DIgnoreValueOperator.cpp @@ -5,23 +5,27 @@ #include "Pooling2DOperator.hpp" -TosaSerializationBasicBlock* ConvertAvgPool2DIgnoreValueToTosaOperator(const std::vector<const TensorInfo*>& inputs, +TosaSerializationBasicBlock* ConvertAvgPool2DIgnoreValueToTosaOperator(const Layer* layer, + const std::vector<const TensorInfo*>& inputs, const std::vector<const TensorInfo*>& outputs, - bool isMain, const Pooling2dDescriptor* poolDescriptor) { + std::string padInputName = std::string("input0_"); + std::string padOutputName = std::string("intermediate0_") + GetUniqueTosaMappingID(); + std::string poolOutputName = std::string("output0_"); + std::string blockName = std::string("Op_AVG_POOL2D_block_") + GetUniqueTosaMappingID(); - // A helper function with static global variables ensures uniqueness - // for dynamically generating input, output and block names - std::string padInputName = std::string("Op_PAD_input0_") + GetUniqueTosaMappingID(); - std::string padOutputName = std::string("Op_PAD_intermediate0_") + GetUniqueTosaMappingID(); - std::string poolOutputName = std::string("Op_AVG_POOL2D_output0_") + GetUniqueTosaMappingID(); - std::string blockName = std::string("Op_AVG_POOL2D_block_") + GetUniqueTosaMappingID(); - - // If it's the first block, overwrite block name with main. - if (isMain) + // If a layer is present then the block will be used for execution, so input and output names need to be determined + // using the previous and following layers so the graph is connected correctly. For validation this doesn't matter. + if(layer != nullptr) { - blockName = std::string("main"); + // Get the layers connected to the input slots and determine unique layer names. + Layer& connectedInputLayer = layer->GetInputSlot(0).GetConnectedOutputSlot()->GetOwningLayer(); + padInputName = GenerateUniqueName(connectedInputLayer, 0); + + // Get the layer connected to the output slot and determine unique layer name. + Layer& connectedOutputLayer = layer->GetOutputSlot().GetConnection(0)->GetOwningLayer(); + poolOutputName = GenerateUniqueName(connectedOutputLayer, 0); } std::vector<int> paddings; @@ -51,11 +55,11 @@ TosaSerializationBasicBlock* ConvertAvgPool2DIgnoreValueToTosaOperator(const std } TosaPadAttribute padAttribute(paddings, 0, 0.0f); - TosaSerializationOperator* opPad = new TosaSerializationOperator(Op_PAD, - Attribute_PadAttribute, - &padAttribute, - {padInputName}, - {padOutputName}); + auto* opPad = new TosaSerializationOperator(Op_PAD, + Attribute_PadAttribute, + &padAttribute, + {padInputName}, + {padOutputName}); std::vector<int> pad = {0, 0, 0, 0}; std::vector<int> kernel = {static_cast<int>(poolDescriptor->m_PoolHeight), @@ -64,11 +68,11 @@ TosaSerializationBasicBlock* ConvertAvgPool2DIgnoreValueToTosaOperator(const std static_cast<int>(poolDescriptor->m_StrideX)}; TosaPoolAttribute poolAttribute(pad, kernel, stride, 0, 0, ArmNNToDType(inputs[0]->GetDataType())); - TosaSerializationOperator* opPool = new TosaSerializationOperator(Op_AVG_POOL2D, - Attribute_PoolAttribute, - &poolAttribute, - {padOutputName}, - {poolOutputName}); + auto* opPool = new TosaSerializationOperator(Op_AVG_POOL2D, + Attribute_PoolAttribute, + &poolAttribute, + {padOutputName}, + {poolOutputName}); std::vector<int32_t> inputShape = GetTosaTensorShape(inputs[0]->GetShape()); DType inputDType = ArmNNToDType(inputs[0]->GetDataType()); @@ -92,10 +96,9 @@ TosaSerializationBasicBlock* ConvertAvgPool2DIgnoreValueToTosaOperator(const std inputShape[3] + paddings[6] + paddings[7]}; } - TosaSerializationTensor* inputTensor = new TosaSerializationTensor(padInputName, inputShape, inputDType, {}); - TosaSerializationTensor* intermediateTensor = new TosaSerializationTensor( - padOutputName, intermediateShape, inputDType, {}); - TosaSerializationTensor* outputTensor = new TosaSerializationTensor(poolOutputName, outputShape, outputDType, {}); + auto* inputTensor = new TosaSerializationTensor(padInputName, inputShape, inputDType, {}); + auto* intermediateTensor = new TosaSerializationTensor(padOutputName, intermediateShape, inputDType, {}); + auto* outputTensor = new TosaSerializationTensor(poolOutputName, outputShape, outputDType, {}); // operatorInputNames/operatorOutputNames ends up being the same as // blockInputNames/blockOutputNames for one-to-one ArmNN to Tosa mappings |