ArmNN
 20.05
NeonBatchNormalizationWorkload.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
7 
8 #include "NeonWorkloadUtils.hpp"
9 
13 
14 #include <arm_compute/runtime/NEON/functions/NEBatchNormalizationLayer.h>
15 
16 namespace armnn
17 {
18 using namespace armcomputetensorutils;
19 
20 
22  const TensorInfo& output,
23  const TensorInfo& mean,
24  const TensorInfo& var,
25  const TensorInfo& beta,
26  const TensorInfo& gamma,
27  const BatchNormalizationDescriptor& descriptor)
28 {
29  const arm_compute::TensorInfo aclInputInfo =
30  armcomputetensorutils::BuildArmComputeTensorInfo(input, descriptor.m_DataLayout);
31  const arm_compute::TensorInfo aclOutputInfo =
32  armcomputetensorutils::BuildArmComputeTensorInfo(output, descriptor.m_DataLayout);
33  const arm_compute::TensorInfo aclMeanInfo =
34  armcomputetensorutils::BuildArmComputeTensorInfo(mean, descriptor.m_DataLayout);
35  const arm_compute::TensorInfo aclVarInfo =
36  armcomputetensorutils::BuildArmComputeTensorInfo(var, descriptor.m_DataLayout);
37  const arm_compute::TensorInfo aclBetaInfo =
38  armcomputetensorutils::BuildArmComputeTensorInfo(beta, descriptor.m_DataLayout);
39  const arm_compute::TensorInfo aclGammaInfo =
40  armcomputetensorutils::BuildArmComputeTensorInfo(gamma, descriptor.m_DataLayout);
41 
42  return arm_compute::NEBatchNormalizationLayer::validate(&aclInputInfo,
43  &aclOutputInfo,
44  &aclMeanInfo,
45  &aclVarInfo,
46  &aclBetaInfo,
47  &aclGammaInfo,
48  descriptor.m_Eps);
49 }
50 
52  const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info)
54 {
55  m_Data.ValidateInputsOutputs("NeonBatchNormalizationWorkload", 1, 1);
56 
57  arm_compute::ITensor& input = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Inputs[0])->GetTensor();
58  arm_compute::ITensor& output = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Outputs[0])->GetTensor();
59 
60  arm_compute::DataLayout aclDataLayout = ConvertDataLayout(m_Data.m_Parameters.m_DataLayout);
61  input.info()->set_data_layout(aclDataLayout);
62  output.info()->set_data_layout(aclDataLayout);
63 
64  m_Mean = std::make_unique<arm_compute::Tensor>();
65  BuildArmComputeTensor(*m_Mean, m_Data.m_Mean->GetTensorInfo());
66 
67  m_Variance = std::make_unique<arm_compute::Tensor>();
68  BuildArmComputeTensor(*m_Variance, m_Data.m_Variance->GetTensorInfo());
69 
70  m_Gamma = std::make_unique<arm_compute::Tensor>();
71  BuildArmComputeTensor(*m_Gamma, m_Data.m_Gamma->GetTensorInfo());
72 
73  m_Beta = std::make_unique<arm_compute::Tensor>();
74  BuildArmComputeTensor(*m_Beta, m_Data.m_Beta->GetTensorInfo());
75 
76  auto layer = std::make_unique<arm_compute::NEBatchNormalizationLayer>();
77  layer->configure(&input,
78  &output,
79  m_Mean.get(),
80  m_Variance.get(),
81  m_Beta.get(),
82  m_Gamma.get(),
84  m_Layer.reset(layer.release());
85 
90 
91  // Force Compute Library to perform the necessary copying and reshaping, after which
92  // delete all the input tensors that will no longer be needed
93  m_Layer->prepare();
94  FreeUnusedTensors();
95 }
96 
98 {
99  ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonBatchNormalizationWorkload_Execute");
100  m_Layer->run();
101 }
102 
103 void NeonBatchNormalizationWorkload::FreeUnusedTensors()
104 {
105  FreeTensorIfUnused(m_Mean);
106  FreeTensorIfUnused(m_Variance);
107  FreeTensorIfUnused(m_Gamma);
108  FreeTensorIfUnused(m_Beta);
109 }
110 
111 } //namespace armnn
const ConstCpuTensorHandle * m_Gamma
const ConstCpuTensorHandle * m_Beta
DataLayout
Definition: Types.hpp:49
arm_compute::Status NeonBatchNormalizationValidate(const TensorInfo &input, const TensorInfo &output, const TensorInfo &mean, const TensorInfo &var, const TensorInfo &beta, const TensorInfo &gamma, const BatchNormalizationDescriptor &descriptor)
const BatchNormalizationQueueDescriptor m_Data
Definition: Workload.hpp:46
#define ARMNN_SCOPED_PROFILING_EVENT_NEON(name)
const ConstCpuTensorHandle * m_Mean
float m_Eps
Value to add to the variance. Used to avoid dividing by zero.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
const ConstCpuTensorHandle * m_Variance
void ValidateInputsOutputs(const std::string &descName, unsigned int numExpectedIn, unsigned int numExpectedOut) const
Copyright (c) 2020 ARM Limited.
Status
enumeration
Definition: Types.hpp:26
void InitializeArmComputeTensorData(arm_compute::Tensor &tensor, const ConstCpuTensorHandle *handle)
NeonBatchNormalizationWorkload(const BatchNormalizationQueueDescriptor &descriptor, const WorkloadInfo &info)
std::vector< ITensorHandle * > m_Outputs
Contains information about inputs and outputs to a layer.
std::vector< ITensorHandle * > m_Inputs
const TensorInfo & GetTensorInfo() const
A BatchNormalizationDescriptor for the BatchNormalizationLayer.