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/TosaOperatorUtils.hpp | |
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/TosaOperatorUtils.hpp')
-rw-r--r-- | src/backends/tosaCommon/operatorMappings/TosaOperatorUtils.hpp | 101 |
1 files changed, 100 insertions, 1 deletions
diff --git a/src/backends/tosaCommon/operatorMappings/TosaOperatorUtils.hpp b/src/backends/tosaCommon/operatorMappings/TosaOperatorUtils.hpp index f51b2109b4..176e4e1cfb 100644 --- a/src/backends/tosaCommon/operatorMappings/TosaOperatorUtils.hpp +++ b/src/backends/tosaCommon/operatorMappings/TosaOperatorUtils.hpp @@ -5,10 +5,13 @@ #pragma once +#include <Layer.hpp> #include <armnn/Tensor.hpp> #include <armnn/Types.hpp> -#include <tosa_generated.h> +#include "common/include/ProfilingGuid.hpp" + +#include <tosa_serialization_handler.h> using namespace armnn; using namespace tosa; @@ -53,6 +56,33 @@ inline std::vector<int32_t> GetTosaTensorShape(const TensorShape& shape) return returnShape; } +// Function that generates unique name using the layer type, input slot and layer guid. +inline std::string GenerateUniqueName(const Layer& layer, uint32_t layerSlot) +{ + std::string name; + std::string guid = std::to_string(layer.GetGuid()); + std::string slotAndGuid = std::to_string(layerSlot) + "_" + guid; + LayerType layerType = layer.GetType(); + + if (layerType == LayerType::Input) + { + name = "input" + slotAndGuid; + } + else if (layerType == LayerType::Output) + { + name = "output" + slotAndGuid; + } + else if (layerType == LayerType::Constant) + { + name = "constant_" + guid; + } + else + { + name = "intermediate" + slotAndGuid; + } + return name; +} + // Function to return unique int as a string to ensure uniqueness between all input, output and block names. static int uniqueTosaMappingID = 0; inline std::string GetUniqueTosaMappingID() @@ -206,3 +236,72 @@ inline std::string TosaOpToString(Op tosaOp) } return ""; } + +inline std::vector<uint8_t> ConvertConstantTensorDataToBuffer(const std::shared_ptr<ConstTensorHandle>& tensorHandle) +{ + tosa_err_t error; + std::vector<uint8_t> uint8Data; + auto tensorInfo = tensorHandle->GetTensorInfo(); + + switch (tensorInfo.GetDataType()) + { + case DataType::Float32: + { + std::vector<float> data(tensorInfo.GetNumElements()); + memcpy(data.data(), tensorHandle->Map(true), tensorInfo.GetNumBytes()); + + error = TosaSerializationHandler::ConvertF32toU8(data, uint8Data); + break; + } + case DataType::Float16: + { + std::vector<float> data(tensorInfo.GetNumElements()); + memcpy(data.data(), tensorHandle->Map(true), tensorInfo.GetNumBytes()); + + error = TosaSerializationHandler::ConvertF16toU8(data, uint8Data); + break; + } + case DataType::QSymmS8: + case DataType::QAsymmS8: + { + std::vector<int8_t> data(tensorInfo.GetNumElements()); + memcpy(data.data(), tensorHandle->Map(true), tensorInfo.GetNumBytes()); + + error = TosaSerializationHandler::ConvertI8toU8(data, uint8Data); + break; + } + case DataType::QAsymmU8: + { + memcpy(uint8Data.data(), tensorHandle->Map(true), tensorInfo.GetNumBytes()); + break; + } + case DataType::QSymmS16: + { + std::vector<int16_t> data(tensorInfo.GetNumElements()); + memcpy(data.data(), tensorHandle->Map(true), tensorInfo.GetNumBytes()); + + error = TosaSerializationHandler::ConvertI16toU8(data, uint8Data); + break; + } + case DataType::Signed32: + { + std::vector<int32_t> data(tensorInfo.GetNumElements()); + memcpy(data.data(), tensorHandle->Map(true), tensorInfo.GetNumBytes()); + + error = TosaSerializationHandler::ConvertI32toU8(data, uint8Data); + break; + } + default: + { + throw armnn::Exception("SetConstantTensorData: An unsupported data type was encountered."); + } + } + + if(error != tosa_err_t::TOSA_OK) + { + throw armnn::Exception("SetConstantTensorData: An error occurred when converting constant data"); + } + + tensorHandle->Unmap(); + return uint8Data; +} |