11 #include <fmt/format.h> 15 namespace armcomputetensorutils
23 return arm_compute::DataType::BFLOAT16;
25 return arm_compute::DataType::U8;
27 return arm_compute::DataType::F16;
29 return arm_compute::DataType::F32;
31 return arm_compute::DataType::QASYMM8_SIGNED;
33 return arm_compute::DataType::QASYMM8;
35 return arm_compute::DataType::QSYMM16;
37 return arm_compute::DataType::S64;
40 return multiScales ? arm_compute::DataType::QSYMM8_PER_CHANNEL : arm_compute::DataType::QSYMM8;
43 return arm_compute::DataType::S32;
46 return arm_compute::DataType::UNKNOWN;
54 case arm_compute::DataType::BFLOAT16:
56 case arm_compute::DataType::U8:
58 case arm_compute::DataType::F16:
60 case arm_compute::DataType::F32:
62 case arm_compute::DataType::QASYMM8_SIGNED:
64 case arm_compute::DataType::QASYMM8:
66 case arm_compute::DataType::QSYMM16:
68 case arm_compute::DataType::S64:
70 case arm_compute::DataType::QSYMM8_PER_CHANNEL:
72 case arm_compute::DataType::QSYMM8:
74 case arm_compute::DataType::S32:
83 unsigned int originalInputRank,
84 const std::vector<unsigned int>& armnnAxes)
88 if (armnnAxes.empty())
96 outAclCoords.set_num_dimensions(inputDimensions);
97 std::generate(outAclCoords.begin(), outAclCoords.end(), [d = inputDimensions - 1] ()
mutable {
return d--; });
115 outAclCoords.set_num_dimensions(armnnAxes.size());
116 std::transform(armnnAxes.begin(), armnnAxes.end(),
117 outAclCoords.begin(),
118 [originalInputRank](
unsigned int i){
return originalInputRank - i - 1; });
124 arm_compute::TensorShape BuildArmComputeTensorShape(
const armnn::TensorShape& tensorShape)
126 arm_compute::TensorShape shape;
140 if (shape.num_dimensions() == 0)
142 shape.set_num_dimensions(1);
154 arm_compute::TensorInfo BuildArmComputeTensorInfo(
const armnn::TensorInfo& tensorInfo)
157 const arm_compute::TensorShape aclTensorShape = BuildArmComputeTensorShape(tensorInfo.
GetShape());
160 const arm_compute::QuantizationInfo aclQuantizationInfo = multiScales ?
164 return arm_compute::TensorInfo(aclTensorShape, 1, aclDataType, aclQuantizationInfo);
167 arm_compute::TensorInfo BuildArmComputeTensorInfo(
const armnn::TensorInfo& tensorInfo,
170 arm_compute::TensorInfo aclTensorInfo = BuildArmComputeTensorInfo(tensorInfo);
171 aclTensorInfo.set_data_layout(ConvertDataLayout(dataLayout));
173 return aclTensorInfo;
188 default:
throw InvalidArgumentException(
"Unknown armnn::DataLayout: [" +
189 std::to_string(static_cast<int>(dataLayout)) +
"]");
193 arm_compute::PoolingLayerInfo BuildArmComputePoolingLayerInfo(
const Pooling2dDescriptor& descriptor,
194 bool fpMixedPrecision)
201 bool isGlobalPooling = (descriptor.m_StrideX==0 && descriptor.m_StrideY==0);
205 return arm_compute::PoolingLayerInfo(poolingType, dataLayout);
209 descriptor.m_OutputShapeRounding);
210 const arm_compute::PadStrideInfo padStrideInfo(descriptor.m_StrideX,
211 descriptor.m_StrideY,
212 descriptor.m_PadLeft,
213 descriptor.m_PadRight,
215 descriptor.m_PadBottom,
220 const arm_compute::Size2D poolSize(descriptor.m_PoolWidth, descriptor.m_PoolHeight);
222 return arm_compute::PoolingLayerInfo(poolingType, poolSize, dataLayout, padStrideInfo, excludePadding,
226 arm_compute::Pooling3dLayerInfo BuildArmComputePooling3dLayerInfo(
const Pooling3dDescriptor& descriptor,
227 bool fpMixedPrecision)
231 bool isGlobalPooling = (descriptor.m_StrideX==0 && descriptor.m_StrideY==0 && descriptor.m_StrideZ==0);
235 return arm_compute::Pooling3dLayerInfo(poolingType);
238 const arm_compute::Size3D poolSize(descriptor.m_PoolWidth, descriptor.m_PoolHeight, descriptor.m_PoolDepth);
240 const arm_compute::Size3D stride(descriptor.m_StrideX,
241 descriptor.m_StrideY,
242 descriptor.m_StrideZ);
244 const arm_compute::Padding3D padding(descriptor.m_PadLeft,
245 descriptor.m_PadRight,
247 descriptor.m_PadBottom,
248 descriptor.m_PadFront,
249 descriptor.m_PadBack);
254 descriptor.m_OutputShapeRounding);
256 return arm_compute::Pooling3dLayerInfo(poolingType,
265 arm_compute::NormalizationLayerInfo BuildArmComputeNormalizationLayerInfo(
const NormalizationDescriptor& descriptor)
267 const arm_compute::NormType normType =
269 return arm_compute::NormalizationLayerInfo(normType,
270 descriptor.m_NormSize,
279 arm_compute::PermutationVector aclPerm;
281 unsigned int start = 0;
282 while ((start < perm.
GetSize()) && (start == perm[start]))
287 for (
unsigned int i = start; i < perm.
GetSize(); ++i)
289 aclPerm.set(i - start, perm[i] - start);
296 arm_compute::PermutationVector aclPerm;
297 std::map<unsigned int, unsigned int> permuteMappings;
298 for (
unsigned int i = 0; i < perm.
GetSize(); ++i)
300 permuteMappings[perm[i]] = i;
303 std::vector<unsigned int> permuteVector;
304 for (
unsigned int i = 0; i < perm.
GetSize(); ++i)
306 permuteVector.push_back(permuteMappings.at(i));
309 unsigned int start = 0;
310 while ((start < perm.
GetSize()) && (start == permuteVector[start]))
315 for (
unsigned int i = start; i < perm.
GetSize(); ++i)
317 aclPerm.set(i - start, permuteVector[i] - start);
322 arm_compute::Size2D BuildArmComputeSize2D(
const unsigned int width,
const unsigned int height)
324 return arm_compute::Size2D(width, height);
327 arm_compute::PixelValue GetPixelValue(
const arm_compute::ITensorInfo* tensorInfo,
float pixelValue)
329 switch (tensorInfo->data_type())
331 case arm_compute::DataType::F16:
332 return arm_compute::PixelValue(static_cast<Half>(pixelValue));
333 case arm_compute::DataType::F32:
334 return arm_compute::PixelValue(pixelValue);
335 case arm_compute::DataType::QASYMM8:
336 return arm_compute::PixelValue(static_cast<uint8_t>(pixelValue));
337 case arm_compute::DataType::QSYMM16:
338 return arm_compute::PixelValue(static_cast<int16_t>(pixelValue));
339 case arm_compute::DataType::QSYMM8:
340 case arm_compute::DataType::QASYMM8_SIGNED:
341 case arm_compute::DataType::QSYMM8_PER_CHANNEL:
342 return arm_compute::PixelValue(static_cast<int8_t>(pixelValue));
343 case arm_compute::DataType::S32:
344 return arm_compute::PixelValue(static_cast<int32_t>(pixelValue));
346 throw InvalidArgumentException(
"Unsupported DataType: [" +
347 std::to_string(static_cast<int>(tensorInfo->data_type())) +
"]");
352 const arm_compute::TensorShape& weightsShape,
353 const arm_compute::TensorShape& inputShape)
355 unsigned int depthMultiplier;
358 depthMultiplier =
static_cast<uint32_t
>(weightsShape[0]) / static_cast<uint32_t>(inputShape[0]);
362 depthMultiplier =
static_cast<uint32_t
>(weightsShape[2]) / static_cast<uint32_t>(inputShape[2]);
366 throw InvalidArgumentException(fmt::format(
"Unknown data layout for tensor conversion: {}",
369 return depthMultiplier;
constexpr const char * GetDataLayoutName(DataLayout dataLayout)
const TensorShape & GetShape() const
arm_compute::PoolingType ConvertPoolingAlgorithmToAclPoolingType(PoolingAlgorithm poolingAlgorithm)
std::array< unsigned int, MaxNumOfTensorDimensions > Coordinates
The padding fields don't count and are ignored.
arm_compute::NormType ConvertNormalizationAlgorithmChannelToAclNormType(NormalizationAlgorithmChannel channelType)
Copyright (c) 2021 ARM Limited and Contributors.
std::vector< float > GetQuantizationScales() const
const armnnSerializer::Pooling2dDescriptor * Pooling2dDescriptor
bool HasMultipleQuantizationScales() const
#define ARMNN_ASSERT_MSG(COND, MSG)
arm_compute::DimensionRoundingType ConvertOutputShapeRoundingToAclDimensionRoundingType(OutputShapeRounding rounding)
int32_t GetQuantizationOffset() const
float GetQuantizationScale() const
DataType GetDataType() const
unsigned int GetNumDimensions() const
Function that returns the tensor rank.
const armnnSerializer::Pooling3dDescriptor * Pooling3dDescriptor