ArmNN
 20.02
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 
12 
13 #include <arm_compute/runtime/NEON/functions/NEBatchNormalizationLayer.h>
14 
15 namespace armnn
16 {
17 using namespace armcomputetensorutils;
18 
19 
21  const TensorInfo& output,
22  const TensorInfo& mean,
23  const TensorInfo& var,
24  const TensorInfo& beta,
25  const TensorInfo& gamma,
26  const BatchNormalizationDescriptor& descriptor)
27 {
28  const arm_compute::TensorInfo aclInputInfo =
29  armcomputetensorutils::BuildArmComputeTensorInfo(input, descriptor.m_DataLayout);
30  const arm_compute::TensorInfo aclOutputInfo =
31  armcomputetensorutils::BuildArmComputeTensorInfo(output, descriptor.m_DataLayout);
32  const arm_compute::TensorInfo aclMeanInfo =
33  armcomputetensorutils::BuildArmComputeTensorInfo(mean, descriptor.m_DataLayout);
34  const arm_compute::TensorInfo aclVarInfo =
35  armcomputetensorutils::BuildArmComputeTensorInfo(var, descriptor.m_DataLayout);
36  const arm_compute::TensorInfo aclBetaInfo =
37  armcomputetensorutils::BuildArmComputeTensorInfo(beta, descriptor.m_DataLayout);
38  const arm_compute::TensorInfo aclGammaInfo =
39  armcomputetensorutils::BuildArmComputeTensorInfo(gamma, descriptor.m_DataLayout);
40 
41  return arm_compute::NEBatchNormalizationLayer::validate(&aclInputInfo,
42  &aclOutputInfo,
43  &aclMeanInfo,
44  &aclVarInfo,
45  &aclBetaInfo,
46  &aclGammaInfo,
47  descriptor.m_Eps);
48 }
49 
51  const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info)
53 {
54  m_Data.ValidateInputsOutputs("NeonBatchNormalizationWorkload", 1, 1);
55 
56  arm_compute::ITensor& input = boost::polymorphic_downcast<IAclTensorHandle*>(m_Data.m_Inputs[0])->GetTensor();
57  arm_compute::ITensor& output = boost::polymorphic_downcast<IAclTensorHandle*>(m_Data.m_Outputs[0])->GetTensor();
58 
59  arm_compute::DataLayout aclDataLayout = ConvertDataLayout(m_Data.m_Parameters.m_DataLayout);
60  input.info()->set_data_layout(aclDataLayout);
61  output.info()->set_data_layout(aclDataLayout);
62 
63  m_Mean = std::make_unique<arm_compute::Tensor>();
64  BuildArmComputeTensor(*m_Mean, m_Data.m_Mean->GetTensorInfo());
65 
66  m_Variance = std::make_unique<arm_compute::Tensor>();
67  BuildArmComputeTensor(*m_Variance, m_Data.m_Variance->GetTensorInfo());
68 
69  m_Gamma = std::make_unique<arm_compute::Tensor>();
70  BuildArmComputeTensor(*m_Gamma, m_Data.m_Gamma->GetTensorInfo());
71 
72  m_Beta = std::make_unique<arm_compute::Tensor>();
73  BuildArmComputeTensor(*m_Beta, m_Data.m_Beta->GetTensorInfo());
74 
75  auto layer = std::make_unique<arm_compute::NEBatchNormalizationLayer>();
76  layer->configure(&input,
77  &output,
78  m_Mean.get(),
79  m_Variance.get(),
80  m_Beta.get(),
81  m_Gamma.get(),
83  m_Layer.reset(layer.release());
84 
89 
90  // Force Compute Library to perform the necessary copying and reshaping, after which
91  // delete all the input tensors that will no longer be needed
92  m_Layer->prepare();
93  FreeUnusedTensors();
94 }
95 
97 {
98  ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonBatchNormalizationWorkload_Execute");
99  m_Layer->run();
100 }
101 
102 void NeonBatchNormalizationWorkload::FreeUnusedTensors()
103 {
104  FreeTensorIfUnused(m_Mean);
105  FreeTensorIfUnused(m_Variance);
106  FreeTensorIfUnused(m_Gamma);
107  FreeTensorIfUnused(m_Beta);
108 }
109 
110 } //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.