21 using size_type =
unsigned int;
24 : m_DstShape(dstShape)
30 size_type srcStride = 1U;
31 size_type dstStride = 1U;
33 for (size_type i = numDims - 1U, k = 0U; k < numDims; ++k, --i)
35 m_SrcStrides[mappings[i]] = srcStride;
36 m_DstStrides[i] = dstStride;
38 srcStride *= dstShape[mappings[i]];
39 dstStride *= dstShape[i];
43 void Unroll(
const void* srcData,
void* dstData,
size_t dataTypeSize)
47 assert(dataTypeSize > 0);
49 const unsigned char* srcDataPtr =
reinterpret_cast<const unsigned char*
>(srcData);
50 unsigned char* dstDataPtr =
reinterpret_cast<unsigned char*
>(dstData);
52 const unsigned char*
const srcEndPtr = srcDataPtr + m_DstShape.GetNumElements() * dataTypeSize;
53 unsigned char*
const dstEndPtr = dstDataPtr + m_DstShape.GetNumElements() * dataTypeSize;
55 Unroll(0, srcDataPtr, dstDataPtr, srcEndPtr, dstEndPtr, dataTypeSize);
59 void Unroll(size_type dimension,
60 const unsigned char* srcData,
unsigned char* dstData,
61 const unsigned char* srcEnd,
unsigned char* dstEnd,
68 assert(srcData < srcEnd);
69 assert(dstData < dstEnd);
70 assert(dataTypeSize > 0);
72 if (dimension >= m_DstShape.GetNumDimensions())
74 ::memcpy(dstData, srcData, dataTypeSize);
78 for (size_type i = 0; i < m_DstShape[dimension]; i++)
80 Unroll(dimension + 1, srcData, dstData, srcEnd, dstEnd, dataTypeSize);
82 srcData += m_SrcStrides[dimension] * dataTypeSize;
83 dstData += m_DstStrides[dimension] * dataTypeSize;
89 std::array<size_type, armnn::MaxNumOfTensorDimensions> m_SrcStrides;
90 std::array<size_type, armnn::MaxNumOfTensorDimensions> m_DstStrides;
102 const unsigned int numDims = mappings.
GetSize();
105 for (
unsigned int i = 0U; i < numDims; ++i)
107 outDims[mappings[i]] = srcShape[i];
111 return permutedShape;
122 const void* src,
void* dst,
size_t dataTypeSize)
124 PermuteLoop(dstShape, mappings).Unroll(src, dst, dataTypeSize);
const TensorShape & GetShape() const
void SetShape(const TensorShape &newShape)
void Permute(const armnn::TensorShape &dstShape, const armnn::PermutationVector &mappings, const void *src, void *dst, size_t dataTypeSize)
unsigned int GetNumDimensions() const
armnn::TensorShape Permuted(const armnn::TensorShape &srcShape, const armnn::PermutationVector &mappings)
constexpr unsigned int MaxNumOfTensorDimensions