diff options
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; +} |