// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once #include #include #include #include #include #include #include namespace armnn { //////////////////////////////////////////// /// float32 helpers //////////////////////////////////////////// inline const TensorInfo& GetTensorInfo(const ITensorHandle* tensorHandle) { // We know that reference workloads use RefTensorHandles for inputs and outputs const RefTensorHandle* refTensorHandle = PolymorphicDowncast(tensorHandle); return refTensorHandle->GetTensorInfo(); } template const DataType* GetInputTensorData(unsigned int idx, const PayloadType& data) { const ITensorHandle* tensorHandle = data.m_Inputs[idx]; return reinterpret_cast(tensorHandle->Map()); } template DataType* GetOutputTensorData(unsigned int idx, const PayloadType& data) { ITensorHandle* tensorHandle = data.m_Outputs[idx]; return reinterpret_cast(tensorHandle->Map()); } template DataType* GetOutputTensorData(ITensorHandle* tensorHandle) { return reinterpret_cast(tensorHandle->Map()); } template const float* GetInputTensorDataFloat(unsigned int idx, const PayloadType& data) { return GetInputTensorData(idx, data); } template float* GetOutputTensorDataFloat(unsigned int idx, const PayloadType& data) { return GetOutputTensorData(idx, data); } template const Half* GetInputTensorDataHalf(unsigned int idx, const PayloadType& data) { return GetInputTensorData(idx, data); } template Half* GetOutputTensorDataHalf(unsigned int idx, const PayloadType& data) { return GetOutputTensorData(idx, data); } template const BFloat16* GetInputTensorDataBFloat16(unsigned int idx, const PayloadType& data) { return GetInputTensorData(idx, data); } template BFloat16* GetOutputTensorDataBFloat16(unsigned int idx, const PayloadType& data) { return GetOutputTensorData(idx, data); } //////////////////////////////////////////// /// u8 helpers //////////////////////////////////////////// template std::vector Dequantize(const T* quant, const TensorInfo& info) { std::vector ret(info.GetNumElements()); for (size_t i = 0; i < info.GetNumElements(); i++) { ret[i] = armnn::Dequantize(quant[i], info.GetQuantizationScale(), info.GetQuantizationOffset()); } return ret; } template inline void Dequantize(const T* inputData, float* outputData, const TensorInfo& info) { for (unsigned int i = 0; i < info.GetNumElements(); i++) { outputData[i] = Dequantize(inputData[i], info.GetQuantizationScale(), info.GetQuantizationOffset()); } } inline void Quantize(uint8_t* quant, const float* dequant, const TensorInfo& info) { for (size_t i = 0; i < info.GetNumElements(); i++) { quant[i] = armnn::Quantize(dequant[i], info.GetQuantizationScale(), info.GetQuantizationOffset()); } } } //namespace armnn