From e5f0bc6400dfb95ad538932c74cdfc276862f2fc Mon Sep 17 00:00:00 2001 From: Kevin May Date: Wed, 21 Aug 2019 16:53:50 +0100 Subject: IVGCVSW-3575 Fix DepthwiseConvolution VTS Test Failures Failing VTS tests were "NeuralnetworksHidlTest.depthwise_conv2d_*" In depthwise convolution there was a difference in weight tensor channel order between the reference and ACL implementations. This specifically related to NCHW. This commit: * Adds ReorderWeightChannelsForAcl to WorkloadUtils which will correct the weight tensor channel order. * Add unit tests to detect this problem. Signed-off-by: Colm Donelan Change-Id: Icaeac08e14b3d5da9e222ad2f118db55ebb15d09 --- src/backends/backendsCommon/WorkloadUtils.hpp | 104 ++++++++++++++------------ 1 file changed, 56 insertions(+), 48 deletions(-) (limited to 'src/backends/backendsCommon/WorkloadUtils.hpp') diff --git a/src/backends/backendsCommon/WorkloadUtils.hpp b/src/backends/backendsCommon/WorkloadUtils.hpp index 7e3ac395e4..ba69255183 100644 --- a/src/backends/backendsCommon/WorkloadUtils.hpp +++ b/src/backends/backendsCommon/WorkloadUtils.hpp @@ -5,14 +5,14 @@ #pragma once -#include "ITensorHandle.hpp" #include "CpuTensorHandle.hpp" +#include "ITensorHandle.hpp" #include +#include #include #include -#include #include @@ -21,7 +21,7 @@ namespace armnn namespace { -template +template void AssignValues(unsigned int num, unsigned int& idx, const ArrayType& array, Arg& arg) { if (idx >= num) @@ -33,68 +33,76 @@ void AssignValues(unsigned int num, unsigned int& idx, const ArrayType& array, A idx++; } -template -void AssignValues(unsigned int num, unsigned int idx, const ArrayType& array, T& assignee, Args& ... args) +template +void AssignValues(unsigned int num, unsigned int idx, const ArrayType& array, T& assignee, Args&... args) { AssignValues(num, idx, array, assignee); AssignValues(num, idx, array, args...); } -} // anonymous namespace +} // anonymous namespace -template +template void CopyTensorContentsGeneric(const ITensorHandle* srcTensor, ITensorHandle* dstTensor, CopyFunc copy) { static_assert(MaxNumOfTensorDimensions == 5, "Please update CopyTensorContents"); - TensorShape srcStrides = srcTensor->GetStrides(); + TensorShape srcStrides = srcTensor->GetStrides(); const TensorShape& srcShape = srcTensor->GetShape(); - TensorShape dstStrides = dstTensor->GetStrides(); + TensorShape dstStrides = dstTensor->GetStrides(); const TensorShape& dstShape = dstTensor->GetShape(); - size_t srcDepth = 1; - size_t srcBatches = 1; + size_t srcDepth = 1; + size_t srcBatches = 1; size_t srcChannels = 1; - size_t srcHeight = 1; - size_t srcWidth = 1; - AssignValues(srcShape.GetNumDimensions(),0, srcShape, + size_t srcHeight = 1; + size_t srcWidth = 1; + AssignValues(srcShape.GetNumDimensions(), + 0, + srcShape, srcWidth, srcHeight, srcChannels, srcBatches, srcDepth); - size_t srcDepthStride = 0; - size_t srcBatchStride = 0; + size_t srcDepthStride = 0; + size_t srcBatchStride = 0; size_t srcChannelStride = 0; - size_t srcHeightStride = 0; - size_t srcWidthStride = 0; - AssignValues(srcStrides.GetNumDimensions(),0, srcStrides, + size_t srcHeightStride = 0; + size_t srcWidthStride = 0; + AssignValues(srcStrides.GetNumDimensions(), + 0, + srcStrides, srcWidthStride, srcHeightStride, srcChannelStride, srcBatchStride, srcDepthStride); - size_t dstDepth = 1; - size_t dstBatches = 1; + size_t dstDepth = 1; + size_t dstBatches = 1; size_t dstChannels = 1; - size_t dstHeight = 1; - size_t dstWidth = 1; - AssignValues(dstShape.GetNumDimensions(),0, dstShape, + size_t dstHeight = 1; + size_t dstWidth = 1; + AssignValues(dstShape.GetNumDimensions(), + 0, + dstShape, dstWidth, dstHeight, dstChannels, dstBatches, dstDepth); - size_t dstDepthStride = 0; - size_t dstBatchStride = 0; + size_t dstDepthStride = 0; + size_t dstBatchStride = 0; size_t dstChannelStride = 0; - size_t dstHeightStride = 0; - size_t dstWidthStride = 0; - AssignValues(dstStrides.GetNumDimensions(),0, dstStrides, + size_t dstHeightStride = 0; + size_t dstWidthStride = 0; + AssignValues(dstStrides.GetNumDimensions(), + 0, + dstStrides, dstWidthStride, dstHeightStride, dstChannelStride, @@ -105,29 +113,29 @@ void CopyTensorContentsGeneric(const ITensorHandle* srcTensor, ITensorHandle* ds unsigned char* dstData; { ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Synchronize buffers"); - srcData = static_cast(srcTensor->Map()); - dstData = static_cast(dstTensor->Map()); + srcData = static_cast(srcTensor->Map()); + dstData = static_cast(dstTensor->Map()); } - size_t copyLength = std::min(srcWidth*srcWidthStride, dstWidth*dstWidthStride); - size_t copyHeight = std::min(srcHeight, dstHeight); + size_t copyLength = std::min(srcWidth * srcWidthStride, dstWidth * dstWidthStride); + 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); + size_t copyBatches = std::min(srcBatches, dstBatches); + size_t copyDepth = std::min(srcDepth, dstDepth); - for (unsigned int d=0; d < copyDepth; ++d) + for (unsigned int d = 0; d < copyDepth; ++d) { auto srcPtrDepth = srcData; auto dstPtrDepth = dstData; - for (unsigned int b=0; b < copyBatches; ++b) + for (unsigned int b = 0; b < copyBatches; ++b) { auto srcPtrBatch = srcData; auto dstPtrBatch = dstData; - for (unsigned int c=0; c< copyChannels; ++c) + for (unsigned int c = 0; c < copyChannels; ++c) { auto srcPtrChannel = srcData; auto dstPtrChannel = dstData; - for (unsigned int h=0; h < copyHeight; ++h) + for (unsigned int h = 0; h < copyHeight; ++h) { copy(dstData, srcData, copyLength); dstData += dstHeightStride; @@ -136,11 +144,11 @@ void CopyTensorContentsGeneric(const ITensorHandle* srcTensor, ITensorHandle* ds dstData += (static_cast(dstChannelStride) - (dstData - dstPtrChannel)); srcData += (static_cast(srcChannelStride) - (srcData - srcPtrChannel)); } - dstData += (static_cast(dstBatchStride)-(dstData - dstPtrBatch)); - srcData += (static_cast(srcBatchStride)-(srcData - srcPtrBatch)); + dstData += (static_cast(dstBatchStride) - (dstData - dstPtrBatch)); + srcData += (static_cast(srcBatchStride) - (srcData - srcPtrBatch)); } - dstData += (static_cast(dstDepthStride)-(dstData - dstPtrDepth)); - srcData += (static_cast(srcDepthStride)-(srcData - srcPtrDepth)); + dstData += (static_cast(dstDepthStride) - (dstData - dstPtrDepth)); + srcData += (static_cast(srcDepthStride) - (srcData - srcPtrDepth)); } srcTensor->Unmap(); @@ -156,10 +164,10 @@ void GatherTensorHandlePairs(const DescriptorType& descriptor, for (unsigned int i = 0; i < numInputs; ++i) { - SrcTensorHandleType* const srcTensorHandle = boost::polymorphic_downcast( - descriptor.m_Inputs[i]); - DstTensorHandleType* const dstTensorHandle = boost::polymorphic_downcast( - descriptor.m_Outputs[i]); + SrcTensorHandleType* const srcTensorHandle = + boost::polymorphic_downcast(descriptor.m_Inputs[i]); + DstTensorHandleType* const dstTensorHandle = + boost::polymorphic_downcast(descriptor.m_Outputs[i]); tensorHandlePairs.emplace_back(srcTensorHandle, dstTensorHandle); } @@ -177,4 +185,4 @@ armnn::ConstTensor ConvertWeightTensorFromArmnnToAcl(const ConstCpuTensorHandle* DataLayout dataLayout, void* permuteBuffer); -} //namespace armnn +} //namespace armnn -- cgit v1.2.1