IVGCVSW-3639 Add 5d tensor support
* Increased MaxNumOfTensorDimensions and fixed issues related to its use
* Fixed issues caused by assuming 5d tensors are invalid
* Updated ArmComputeTensorUtils for 5d tensors
* Added 5d tensor unit tests for add, mul, stack and reshape (needed by IVGCVSW-3527)
Signed-off-by: Matthew Jackson <matthew.jackson@arm.com>
Change-Id: I5bcd64942d0d04efcc6c5acb240ad4b88e010743
diff --git a/src/backends/backendsCommon/WorkloadUtils.hpp b/src/backends/backendsCommon/WorkloadUtils.hpp
index a1a8d2a..7e3ac39 100644
--- a/src/backends/backendsCommon/WorkloadUtils.hpp
+++ b/src/backends/backendsCommon/WorkloadUtils.hpp
@@ -46,13 +46,14 @@
template<typename CopyFunc>
void CopyTensorContentsGeneric(const ITensorHandle* srcTensor, ITensorHandle* dstTensor, CopyFunc copy)
{
- static_assert(MaxNumOfTensorDimensions == 4, "Please update CopyTensorContents");
+ static_assert(MaxNumOfTensorDimensions == 5, "Please update CopyTensorContents");
TensorShape srcStrides = srcTensor->GetStrides();
const TensorShape& srcShape = srcTensor->GetShape();
TensorShape dstStrides = dstTensor->GetStrides();
const TensorShape& dstShape = dstTensor->GetShape();
+ size_t srcDepth = 1;
size_t srcBatches = 1;
size_t srcChannels = 1;
size_t srcHeight = 1;
@@ -61,8 +62,10 @@
srcWidth,
srcHeight,
srcChannels,
- srcBatches);
+ srcBatches,
+ srcDepth);
+ size_t srcDepthStride = 0;
size_t srcBatchStride = 0;
size_t srcChannelStride = 0;
size_t srcHeightStride = 0;
@@ -71,8 +74,10 @@
srcWidthStride,
srcHeightStride,
srcChannelStride,
- srcBatchStride);
+ srcBatchStride,
+ srcDepthStride);
+ size_t dstDepth = 1;
size_t dstBatches = 1;
size_t dstChannels = 1;
size_t dstHeight = 1;
@@ -81,8 +86,10 @@
dstWidth,
dstHeight,
dstChannels,
- dstBatches);
+ dstBatches,
+ dstDepth);
+ size_t dstDepthStride = 0;
size_t dstBatchStride = 0;
size_t dstChannelStride = 0;
size_t dstHeightStride = 0;
@@ -91,7 +98,8 @@
dstWidthStride,
dstHeightStride,
dstChannelStride,
- dstBatchStride);
+ dstBatchStride,
+ dstDepthStride);
const unsigned char* srcData;
unsigned char* dstData;
@@ -105,26 +113,34 @@
size_t copyHeight = std::min(srcHeight, dstHeight);
size_t copyChannels = std::min(srcChannels, dstChannels);
size_t copyBatches = std::min(srcBatches, dstBatches);
+ size_t copyDepth = std::min(srcDepth, dstDepth);
- for(unsigned int b=0; b < copyBatches; ++b)
+ for (unsigned int d=0; d < copyDepth; ++d)
{
- auto srcPtrBatch = srcData;
- auto dstPtrBatch = dstData;
- for (unsigned int c=0; c< copyChannels; ++c)
+ auto srcPtrDepth = srcData;
+ auto dstPtrDepth = dstData;
+ for (unsigned int b=0; b < copyBatches; ++b)
{
- auto srcPtrChannel = srcData;
- auto dstPtrChannel = dstData;
- for (unsigned int h=0; h < copyHeight; ++h)
+ auto srcPtrBatch = srcData;
+ auto dstPtrBatch = dstData;
+ for (unsigned int c=0; c< copyChannels; ++c)
{
- copy(dstData, srcData, copyLength);
- dstData += dstHeightStride;
- srcData += srcHeightStride;
+ auto srcPtrChannel = srcData;
+ auto dstPtrChannel = dstData;
+ for (unsigned int h=0; h < copyHeight; ++h)
+ {
+ copy(dstData, srcData, copyLength);
+ dstData += dstHeightStride;
+ srcData += srcHeightStride;
+ }
+ dstData += (static_cast<long>(dstChannelStride) - (dstData - dstPtrChannel));
+ srcData += (static_cast<long>(srcChannelStride) - (srcData - srcPtrChannel));
}
- dstData += (static_cast<long>(dstChannelStride) - (dstData - dstPtrChannel));
- srcData += (static_cast<long>(srcChannelStride) - (srcData - srcPtrChannel));
+ dstData += (static_cast<long>(dstBatchStride)-(dstData - dstPtrBatch));
+ srcData += (static_cast<long>(srcBatchStride)-(srcData - srcPtrBatch));
}
- dstData += (static_cast<long>(dstBatchStride)-(dstData - dstPtrBatch));
- srcData += (static_cast<long>(srcBatchStride)-(srcData - srcPtrBatch));
+ dstData += (static_cast<long>(dstDepthStride)-(dstData - dstPtrDepth));
+ srcData += (static_cast<long>(srcDepthStride)-(srcData - srcPtrDepth));
}
srcTensor->Unmap();