IVGCVSW-1910 Add data layout parameter for DepthwiseConvolution
authorNikhil Raj <nikhil.raj@arm.com>
Tue, 25 Sep 2018 15:16:13 +0000 (16:16 +0100)
committerMatthew Bentham <matthew.bentham@arm.com>
Wed, 10 Oct 2018 15:16:57 +0000 (16:16 +0100)
Change-Id: Ia14c9d8c0a38b669a7589e63d74424e398790e54

include/armnn/Descriptors.hpp
src/armnn/layers/DepthwiseConvolution2dLayer.cpp
src/backends/ClWorkloads/ClDepthwiseConvolutionBaseWorkload.cpp
src/backends/NeonWorkloads/NeonDepthwiseConvolutionBaseWorkload.cpp
src/backends/NeonWorkloads/NeonDepthwiseConvolutionFloatWorkload.cpp
src/backends/NeonWorkloads/NeonDepthwiseConvolutionUint8Workload.cpp
src/backends/WorkloadData.hpp

index 7fd36d5..893db69 100644 (file)
@@ -239,15 +239,17 @@ struct DepthwiseConvolution2dDescriptor
     ,   m_StrideX(0)
     ,   m_StrideY(0)
     ,   m_BiasEnabled(false)
+    ,   m_DataLayout(DataLayout::NCHW)
     {}
 
-    uint32_t m_PadLeft;
-    uint32_t m_PadRight;
-    uint32_t m_PadTop;
-    uint32_t m_PadBottom;
-    uint32_t m_StrideX;
-    uint32_t m_StrideY;
-    bool     m_BiasEnabled;
+    uint32_t   m_PadLeft;
+    uint32_t   m_PadRight;
+    uint32_t   m_PadTop;
+    uint32_t   m_PadBottom;
+    uint32_t   m_StrideX;
+    uint32_t   m_StrideY;
+    bool       m_BiasEnabled;
+    DataLayout m_DataLayout;
 };
 
 
index 4f96813..e1d433c 100644 (file)
@@ -28,6 +28,9 @@ std::unique_ptr<IWorkload> DepthwiseConvolution2dLayer::CreateWorkload(const Gra
     DepthwiseConvolution2dQueueDescriptor descriptor;
 
     descriptor.m_Weight = m_Weight.get();
+
+    descriptor.m_DataLayout = GetParameters().m_DataLayout;
+
     if (m_Param.m_BiasEnabled)
     {
         BOOST_ASSERT_MSG(m_Bias != nullptr, "DepthwiseConvolution2dLayer: Bias data should not be null.");
index 68f9cd6..18f45bb 100644 (file)
@@ -23,9 +23,9 @@ arm_compute::Status ClDepthwiseConvolutionWorkloadValidate(const TensorInfo& inp
     const TensorInfo& weights,
     const boost::optional<TensorInfo>& biases)
 {
-    const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input);
-    const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output);
-    const arm_compute::TensorInfo aclWeightsInfo = BuildArmComputeTensorInfo(weights);
+    const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input, descriptor.m_DataLayout);
+    const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output, descriptor.m_DataLayout);
+    const arm_compute::TensorInfo aclWeightsInfo = BuildArmComputeTensorInfo(weights, descriptor.m_DataLayout);
 
     arm_compute::TensorInfo aclBiasesInfo;
     arm_compute::TensorInfo *optionalAclBiasesInfo = nullptr;
@@ -34,7 +34,7 @@ arm_compute::Status ClDepthwiseConvolutionWorkloadValidate(const TensorInfo& inp
     {
         BOOST_ASSERT(biases.is_initialized());
 
-        aclBiasesInfo = BuildArmComputeTensorInfo(biases.get());
+        aclBiasesInfo = BuildArmComputeTensorInfo(biases.get(), descriptor.m_DataLayout);
         optionalAclBiasesInfo = &aclBiasesInfo;
     }
 
index ec6c977..ef60b32 100644 (file)
@@ -17,11 +17,11 @@ arm_compute::Status NeonDepthwiseConvolutionWorkloadValidate(const TensorInfo& i
     const boost::optional<TensorInfo>& biases)
 {
     const arm_compute::TensorInfo aclInputInfo =
-        armcomputetensorutils::BuildArmComputeTensorInfo(input);
+        armcomputetensorutils::BuildArmComputeTensorInfo(input, descriptor.m_DataLayout);
     const arm_compute::TensorInfo aclOutputInfo =
-        armcomputetensorutils::BuildArmComputeTensorInfo(output);
+        armcomputetensorutils::BuildArmComputeTensorInfo(output, descriptor.m_DataLayout);
     const arm_compute::TensorInfo aclWeightsInfo =
-        armcomputetensorutils::BuildArmComputeTensorInfo(weights);
+        armcomputetensorutils::BuildArmComputeTensorInfo(weights, descriptor.m_DataLayout);
 
     arm_compute::TensorInfo aclBiasesInfo;
     arm_compute::TensorInfo *optionalAclBiasesInfo = nullptr;
@@ -30,7 +30,7 @@ arm_compute::Status NeonDepthwiseConvolutionWorkloadValidate(const TensorInfo& i
     {
         BOOST_ASSERT(biases.is_initialized());
 
-        aclBiasesInfo = armcomputetensorutils::BuildArmComputeTensorInfo(biases.get());
+        aclBiasesInfo = armcomputetensorutils::BuildArmComputeTensorInfo(biases.get(), descriptor.m_DataLayout);
         optionalAclBiasesInfo = &aclBiasesInfo;
     }
 
index b3f7da4..db8e27a 100644 (file)
@@ -20,12 +20,12 @@ NeonDepthwiseConvolutionFloatWorkload::NeonDepthwiseConvolutionFloatWorkload(
     const TensorInfo& weightInfo = m_Data.m_Weight->GetTensorInfo();
 
     m_KernelTensor = std::make_unique<arm_compute::Tensor>();
-    BuildArmComputeTensor(*m_KernelTensor, weightInfo);
+    BuildArmComputeTensor(*m_KernelTensor, weightInfo, descriptor.m_DataLayout);
 
     if (m_Data.m_Parameters.m_BiasEnabled)
     {
         m_BiasTensor = std::make_unique<arm_compute::Tensor>();
-        BuildArmComputeTensor(*m_BiasTensor, m_Data.m_Bias->GetTensorInfo());
+        BuildArmComputeTensor(*m_BiasTensor, m_Data.m_Bias->GetTensorInfo(), descriptor.m_DataLayout);
     }
 
     arm_compute::PadStrideInfo padStrideInfo(m_Data.m_Parameters.m_StrideX,
index de8a2ae..3efc5b0 100644 (file)
@@ -20,12 +20,12 @@ NeonDepthwiseConvolutionUint8Workload::NeonDepthwiseConvolutionUint8Workload(
     const TensorInfo& weightInfo = m_Data.m_Weight->GetTensorInfo();
 
     m_KernelTensor = std::make_unique<arm_compute::Tensor>();
-    BuildArmComputeTensor(*m_KernelTensor, weightInfo);
+    BuildArmComputeTensor(*m_KernelTensor, weightInfo, descriptor.m_DataLayout);
 
     if (m_Data.m_Parameters.m_BiasEnabled)
     {
         m_BiasTensor = std::make_unique<arm_compute::Tensor>();
-        BuildArmComputeTensor(*m_BiasTensor, m_Data.m_Bias->GetTensorInfo());
+        BuildArmComputeTensor(*m_BiasTensor, m_Data.m_Bias->GetTensorInfo(), descriptor.m_DataLayout);
     }
 
     arm_compute::PadStrideInfo padStrideInfo(m_Data.m_Parameters.m_StrideX,
index 5da9e8b..8c1cbd4 100644 (file)
@@ -159,11 +159,13 @@ struct DepthwiseConvolution2dQueueDescriptor : QueueDescriptorWithParameters<Dep
     DepthwiseConvolution2dQueueDescriptor()
         : m_Weight(nullptr)
         , m_Bias(nullptr)
+        , m_DataLayout(DataLayout::NCHW)
     {
     }
 
     const ConstCpuTensorHandle* m_Weight;
     const ConstCpuTensorHandle* m_Bias;
+    DataLayout m_DataLayout;
 
     void Validate(const WorkloadInfo& workloadInfo) const;
 };