diff options
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 |